diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d26f326a..2c205e71 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -103,7 +103,7 @@ schema: - npm ci --no-optional - npm run build-schema artifacts: - name: f5-appsvcs-extension-$CI_BUILD_REF + name: f5-appsvcs-extension-$CI_COMMIT_SHA paths: - src/schema/latest/adc-schema.json - src/schema/latest/as3-schema.json @@ -147,35 +147,45 @@ audit: - npm audit node:4.6: - image: $DOCKER_URL/node:4.6.2 + image: $DOCKER_URL/node:12-buster stage: test needs: - schema tags: - cm-official-docker-executor script: + # npm install fails for some packages on older versions of node, so use a newer + # version just for the install + - curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash + - export NVM_DIR="$HOME/.nvm" + - source "$NVM_DIR/nvm.sh" + - nvm install 4 + - nvm install --latest-npm 12 + - nvm use 12 - npm install mocha@5.2.0 --save-dev - npm install --no-optional + - nvm use 4 - npm run test-no-build node:6: - image: $DOCKER_URL/node:6 + image: $DOCKER_URL/node:12-buster stage: test needs: - schema tags: - cm-official-docker-executor script: - - currentDirectory=$(pwd) - - mkdir -p /tmp/npm-install-directory - - cd /tmp/npm-install-directory - - npm install npm@5.10.0 - - rm -rf /usr/local/lib/node_modules - - mv node_modules /usr/local/lib/ - - ln -s /usr/local/lib/node_modules/npm/bin/npx-cli.js /usr/local/bin/npx - - cd $currentDirectory + # npm install fails for some packages on older versions of node, so use a newer + # version just for the install + - curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash + - export NVM_DIR="$HOME/.nvm" + - source "$NVM_DIR/nvm.sh" + - nvm install 6 + - nvm install --latest-npm 12 + - nvm use 12 - npm ci --no-optional - npm install mocha@5.2.0 + - nvm use 6 - npm run test-no-build -- $TEST_REPORTER_OPTIONS artifacts: when: always @@ -183,15 +193,14 @@ node:6: junit: test_report.xml node:8: - image: $DOCKER_URL/node:8.11.1 + image: $DOCKER_URL/node:8 stage: test needs: - schema tags: - cm-official-docker-executor script: - - npm install --global npm@5.10.0 - - npm ci --no-optional + - npm ci - npm install mocha@7 - npm run test-no-build -- $TEST_REPORTER_OPTIONS artifacts: @@ -215,7 +224,7 @@ build_rpm: tags: - cm-official-docker-executor artifacts: - name: f5-appsvcs-extension-$CI_BUILD_REF + name: f5-appsvcs-extension-$CI_COMMIT_SHA paths: - dist - src/schema/latest/adc-schema.json @@ -237,11 +246,14 @@ create_source: - dist/*-examples.tar.gz build_api_docs: - image: $DOCKER_URL/node:12 + image: $DOCKER_URL/node:16 stage: build needs: [] script: # install packages + # package-lock ends up with OS specific info during npm install, so + # make sure it is right for the platform we're on + - rm package-lock.json - npm install # generate docs - npm run make-api-docs @@ -490,7 +502,7 @@ test_rpms_in_azure: TEST_RESOURCES_URL: "$TEST_RESOURCES_URL_AZURE" <<: *test_rpms_common artifacts: - name: f5-appsvcs-extension-$CI_BUILD_REF + name: f5-appsvcs-extension-$CI_COMMIT_SHA when: always paths: - test/logs @@ -515,7 +527,7 @@ test_rpms_for_this_project: - if: '$FORCE_INTEGRATION_TEST =~ /true/i' <<: *test_rpms_common artifacts: - name: f5-appsvcs-extension-$CI_BUILD_REF + name: f5-appsvcs-extension-$CI_COMMIT_SHA when: always paths: - test/logs @@ -537,7 +549,7 @@ test_rpms_for_other_project: - if: '$TRIGGER_INTEGRATION_TEST =~ /true/i' <<: *test_rpms_common artifacts: - name: f5-appsvcs-extension-$CI_BUILD_REF + name: f5-appsvcs-extension-$CI_COMMIT_SHA when: always paths: - test/logs @@ -653,7 +665,7 @@ create_docs: - make linkcheck # build developer documentation (optional) - - if [ "$CI_COMMIT_REF_NAME" = "master" ]; then + - if [ "$CI_COMMIT_REF_NAME" = "main" ]; then - npm install --registry $NPM_REGISTRY_URL -g jsdoc - jsdoc src/nodejs/* -d contributing - fi @@ -661,7 +673,7 @@ create_docs: - cm-official-docker-executor artifacts: expire_in: 1 week - name: sphinx-docs_$CI_BUILD_REF + name: sphinx-docs_$CI_COMMIT_SHA paths: - docs/_build/html - contributing diff --git a/CHANGELOG.md b/CHANGELOG.md index 91925e25..3fafb1ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,32 @@ # Changelog Changes to this project are documented in this file. More detail (including information on releases before 3.4) and links can be found in the AS3 [Document Revision History](https://clouddocs.f5.com/products/extensions/f5-appsvcs-extension/latest/refguide/revision-history.html). +## 3.46.0 + +### Added +- AUTOTOOL-3881: ([GitHub Issue 269](https://github.com/F5Networks/f5-appsvcs-extension/issues/269)): Add support for net port-lists +- AUTOTOOL-3821: ([GitHub Issue 269](https://github.com/F5Networks/f5-appsvcs-extension/issues/269)): Add support for port and address lists in virtuals +- AUTOTOOL-3704: Expose metadata property for pools and pool members +- AUTOTOOL-3876: Support for performing AS3 string expansion inside declarative WAF policy +- AUTOTOOL-3866: Add support of route domain as a string for SOCKS profile +- AUTOTOOL-3768: ([GitHub Issue 696](https://github.com/F5Networks/f5-appsvcs-extension/issues/696)): Add support for enable/disable BotDefense profile in Endpoint_Policy + +### Fixed +- AUTOTOOL-3842: Updated list of services for Protocol_Inspection_Profile +- AUTOTOOL-3718: ([GitHub Issue 704](https://github.com/F5Networks/f5-appsvcs-extension/issues/704)): Handling of line continuation character in iRule +- AUTOTOOL-3831: Fix issue with running a DELETE after a dry-run on BIG-IQ +- AUTOTOOL-3880: ([GitHub Issue 727](https://github.com/F5Networks/f5-appsvcs-extension/issues/727)): SNAT_Pool handling in /Common/Shared +- AUTOTOOL-3884: Fix idempotency issue with a Pool's minimumMonitors +- AUTOTOOL-3810: ([GitHub Issue 715](https://github.com/F5Networks/f5-appsvcs-extension/issues/715)): GSLB_Prober_Pool members referred to with "use": "/Common/Shared/[name]" +- AUTOTOOL-3879: AS3 declaration fails on save config from v3.35.0 onwards + +### Changed +- Updated to Service Discovery 1.14.0-1 + - Update packages to latest available versions + +### Removed +- AUTOTOOL-3871 Remove express package and app.js + ## 3.45.0 ### Added diff --git a/README.md b/README.md index a066f069..683dd779 100644 --- a/README.md +++ b/README.md @@ -24,9 +24,6 @@ Because BIG-IP AS3 has been created and fully tested by F5 Networks, it is fully Be sure to see the [Support page](SUPPORT.md) in this repo for more details and supported versions of BIG-IP AS3. -**Community Help** -We encourage you to use our [Slack channel](https://f5cloudsolutions.herokuapp.com) for discussion and assistance on AS3 templates (click the **f5-appsvcs-extension** channel). There are F5 employees who are members of this community who typically monitor the channel Monday-Friday 9-5 PST and will offer best-effort assistance. This slack channel community support should **not** be considered a substitute for F5 Technical Support. See the [Slack Channel Statement](slack-channel-statement.md) for guidelines on using this channel. - ## Copyright Copyright 2014-2023 F5 Networks Inc. diff --git a/SUPPORT.md b/SUPPORT.md index 486a18db..43eaa57b 100644 --- a/SUPPORT.md +++ b/SUPPORT.md @@ -20,9 +20,9 @@ Currently supported versions: | Software Version | Release Type | First Customer Ship | End of Support | |------------------|---------------|---------------------|-----------------| | AS 3.36.1 | LTS | 31-May-2022 | 31-Aug-2023 | -| AS 3.43.0 | Feature | 09-Feb-2023 | 09-May-2023 | -| AS 3.44.0 | Feature | 27-Mar-2022 | 27-Jun-2023 | | AS 3.45.0 | Feature | 22-May-2023 | 22-Aug-2023 | +| AS 3.46.0 | Feature | 24-Jul-2023 | 24-Oct-2023 | + Versions no longer supported: @@ -81,6 +81,8 @@ Versions no longer supported: | AS 3.40.0 | Feature | 04-Oct-2022 | 04-Jan-2023 | | AS 3.41.0 | Feature | 14-Nov-2022 | 14-Feb-2023 | | AS 3.42.0 | Feature | 12-Jan-2023 | 12-Apr-2023 | +| AS 3.43.0 | Feature | 09-Feb-2023 | 09-May-2023 | +| AS 3.44.0 | Feature | 27-Mar-2022 | 27-Jun-2023 | \* Fix for updated Docker Container packaging only \*\* Update for the schema description for Pool minimumMonitors diff --git a/contributing/process_release.md b/contributing/process_release.md index 7b8bc3df..c5c32978 100644 --- a/contributing/process_release.md +++ b/contributing/process_release.md @@ -41,7 +41,7 @@ * git commit -m 'Update schema files for release' * git push * Prepare the develop branch for the next development cycle - * Create a new branch off of develop like any other development task + * Create a new branch off of `develop` like any other development task * Update version changes to `package.json` and `package-lock.json`. The release number of the new version should start at 0 (e.g. 3.10.0-4 would become 3.11.0-0). * Update the `info.version` property in `docs/openapi.yaml` to the new AS3 version (e.g. 3.27.0). * Add a new version to the beginning of the schemaVersion enum in `src/schema/latest/core-schema.js` using the preexisting format. @@ -61,30 +61,30 @@ * Create a merge request like for any other development task and announce on Teams `AS3-DO General`. ### Perform actions after go ahead from Go/No-Go meeting -Merge the release branch into develop and master following the steps below for each merge. +Merge the release branch into `develop` and `main` following the steps below for each merge. * Navigate to the `Merge Requests` page and click on `New merge request` in the upper right corner. * Select the release branch as the `source branch`. * If merging into `develop` select `develop` as the `target branch`. - * If merging into `master` select `master` as the `target branch`. + * If merging into `main` select `main` as the `target branch`. * Click on `Compare branches and continue`. * On the next page do NOT select `Delete source branch` or `Squash commits`. The release branch needs to be preserved in case a `.1` release is needed in the future. * Click on `Submit merge request`. * Note: If the GUI suggests a rebase, do a merge locally instead. DO NOT TRUST the GUI rebase tool. * Make sure that the version numbers in `package.json`, `package-lock.json`, `CHANGELOG.md`, etc... is correct. Rebase can sometimes rebase `develop` into the release branch. * Even though the MR was created via the GUI, pushing a local should be reflected in the MR -* Self approve the merge request and merge. It is not uncommon when attempting to merge into `develop` for there to be no changes in the merge request. If this happens close the merge request (optionally commenting that there were no changes to merge) and move on to the merge into `master` merge request. -* In the f5-appsvcs-schema repository add a new version to the beginning of the schemaVersion enum in `schemas/core-schema.js` using the preexisting format. Also, be sure to run `npm run compile-schema` after adding the new version. +* Self approve the merge request and merge. It is not uncommon when attempting to merge into `develop` for there to be no changes in the merge request. If this happens close the merge request (optionally commenting that there were no changes to merge) and move on to the merge into `main` merge request. +* In the f5-appsvcs-schema repository add the current release version to the beginning of the schemaVersion enum in `schemas/core-schema.json` using the preexisting format. Also, be sure to run `npm run compile-schema` after adding the new version. If you don't have the typescript compiler (tsc) installed, you will need to run `npm install -g typescript`. Also be sure to run `npm ci`. * Follow the process for release for f5-service-discovery to prep SD for the next release cycle. -Tag master with the release version, for example: `v3.27.0` (Note: if you are tagging/re-tagging older releases that may trigger the publish, make sure to cancel the job as it will try to reupload the artifacts). +Tag `main` with the release version, for example: `v3.27.0` (Note: if you are tagging/re-tagging older releases that may trigger the publish, make sure to cancel the job as it will try to reupload the artifacts). * Navigate to the `Repository -> Tags` page. * Click on `New Tag`. * Name the version tag with the release version but without the build number. For example `v3.27.0`. -* Choose the `master` branch from the `Create from` list. +* Choose the `main` branch from the `Create from` list. * Click on `Create Tag`. ### Release Manager tasks -* Artifacts are copied from master to GitHub and Docker Hub by release management +* Artifacts are copied from `main` to GitHub and Docker Hub by release management * Add a `released` property with a value of `true` to the released RPM in Artifactory ## Process for LTS release @@ -110,14 +110,14 @@ Tag master with the release version, for example: `v3.27.0` (Note: if you are ta * Go to the atg-build project in GitLab * Edit the AS3 schedule to set the `gitBranch` variable to the LTS branch. * Run the AS3 schedule. - * After the build completes, edit the AS3 schedule to set the `gitBranch` variable back to develop. + * After the build completes, edit the AS3 schedule to set the `gitBranch` variable back to `develop`. * Using the GUI create a tag off the LTS branch (e.g. 3.36.1) * In the GUI go to `Repository -> Tags -> New tag`. * The name of the tag should be the LTS version with a 'v' at the front (e.g. v3.36.1). * Update the `createFrom` to point at the LTS branch. * Set the message to: `LTS release v` (e.g. "LTS release v3.36.1") -* Merge the LTS branch (without updating the package version) into develop and create an MR for this. -* Merge the LTS branch (only update package version if LTS is latest) into master and create an MR for this. +* Merge the LTS branch (without updating the package version) into `develop` and create an MR for this. +* Merge the LTS branch (only update package version if LTS is latest) into `main` and create an MR for this. ## Documentation Release process * After the third sprint is finished and the release branch has been created, checkout out the dev release branch and then merge it into **doc-release-branch**. diff --git a/docs/declarations/all-properties.rst b/docs/declarations/all-properties.rst index e8687aca..46be2be1 100644 --- a/docs/declarations/all-properties.rst +++ b/docs/declarations/all-properties.rst @@ -4,7 +4,7 @@ Declaration using all BIG-IP AS3 Properties =========================================== This is an example declaration which includes all current properties available using BIG-IP AS3. This can be useful to see how to use a particular property. -This declaration is over 3000 lines, so we recommend you use your browser's search functionality to find a particular property. +This declaration is over 3000 lines, so we recommend using your browser's search functionality to find a particular property. diff --git a/docs/declarations/miscellaneous.rst b/docs/declarations/miscellaneous.rst index 0ab84190..90908dd7 100644 --- a/docs/declarations/miscellaneous.rst +++ b/docs/declarations/miscellaneous.rst @@ -215,7 +215,7 @@ If you do not use shareNodes or have shareNodes set to **false** (the default), .. NOTE:: You must have the **shareNodes** property set to **true** in your original declaration. If you did not, add it to the original declaration and re-POST before attempting to post a new declaration with the node. -.. WARNING:: If you POST a declaration with **shareNodes** set to **true**, and then later update the same declaration with **shareNodes** set to **false**, the declaration returns Success, however BIG-IP AS3 does not move the nodes, and they remain in /Common. To change this behavior, first DELETE the original declaration, and then re-POST the declaration with shareNodes set to **false**. +.. WARNING:: If you POST a declaration with **shareNodes** set to **true**, and then later update the same declaration with **shareNodes** set to **false**, the declaration returns Success, however BIG-IP AS3 does not move the nodes, and they remain in /Common. To change this behavior, first DELETE the original declaration, and then re-POST the declaration with shareNodes set to **false**. |br| **Shared FQDN nodes MUST be deleted manually.** There are two declarations in this example, the original declaration and a new declaration. diff --git a/docs/declarations/network-security.rst b/docs/declarations/network-security.rst index 996d1388..6f8f1d50 100644 --- a/docs/declarations/network-security.rst +++ b/docs/declarations/network-security.rst @@ -142,6 +142,8 @@ Creating Protocol Inspection profiles You **must** have AFM licensed and provisioned AND an Intrusion Prevention System (IPS) subscription add-on license on your BIG-IP to use these features. +.. IMPORTANT:: Because the Protocol Inspection profile was designed around an experience that is better suited to using the BIG-IP web-based Configuration utility, we strongly recommend you configure, modify, or change Protocol Inspection profiles using the BIG-IP Configuration utility, and reference the profile in the AS3 declaration. Future releases of BIG-IP AS3 will not include any improvements to Protocol Inspection profiles. |br| The following example has been updated with an example of referencing a Protocol Inspection profile on the BIG-IP. + This example shows how you can create BIG-IP AFM Protocol Inspection profiles in a BIG-IP AS3 declaration. A protocol inspection profile collects rules for protocol inspection using pre-installed signatures defined by the Snort project, or custom signatures defined using the Snort syntax. For detailed information, see |pipdoc|, as well as |pipkb| on AskF5. For BIG-IP AS3 usage options, see |pipref| in the Schema Reference. diff --git a/docs/declarations/non-http-services.rst b/docs/declarations/non-http-services.rst index e266a286..72223057 100644 --- a/docs/declarations/non-http-services.rst +++ b/docs/declarations/non-http-services.rst @@ -347,6 +347,39 @@ This declaration creates the following objects on the BIG-IP: :ref:`Back to top` + +| + +.. _portlist: + +Creating port and address lists for a service +````````````````````````````````````````````` +.. sidebar:: :fonticon:`fa fa-info-circle fa-lg` Version Notice: + + Support for creating port lists for a virtual service is available in BIG-IP AS3 3.46 and later. |br| You must have BIG-IP v14.1 or later with the AFM module licensed and provisioned. + +In this example, we show how you can create address and port lists for a virtual service in AS3 3.46 and later. These objects were already supported in AS3, but not directly on a virtual service. Using address and port lists allows you to define multiple addresses and ports for a single virtual service. + +When you include a Firewall_Port_List in the declaration, BIG-IP AS3 creates a traffic-matching-criteria object in the background which defines how traffic is steered towards the virtual service. + +Although this example uses both address and port lists, it is not a requirement and either can be used alone. + +For additional details and BIG-IP AS3 usage, see |fwal|, |fwpl|, and |servicetcp| in the Schema Reference. + +This declaration creates the following objects on the BIG-IP: + +- Partition (tenant) named **Tenant**. +- An Application named **Application**. +- Multiple firewall address lists. One is used for source addresses, and the others for destination addresses. +- A firewall port list named **portList** that includes port 8080 and a range of ports from 1-999. +- A virtual server named **service** using the Service_TCP class that references the address lists defined for source and destination, and the port list. + + +.. literalinclude:: ../../examples/declarations/example-service-tcp-with-source-destination-lists.json + :language: json + +:ref:`Back to top` + .. |stateless| raw:: html @@ -424,7 +457,17 @@ This declaration creates the following objects on the BIG-IP: Service_UDP +.. |fwpl| raw:: html + + Firewall_Port_List + +.. |fwal| raw:: html + + Firewall_Address_List + + +#firewall-port-list diff --git a/docs/declarations/profiles.rst b/docs/declarations/profiles.rst index 62ed0835..76aa9fb6 100644 --- a/docs/declarations/profiles.rst +++ b/docs/declarations/profiles.rst @@ -162,11 +162,32 @@ For detailed information on the WebSocket profile, see |socket| and |ws| in the .. IMPORTANT:: The following properties require TMOS 16.1 or later: **compressMode**, **compression**, **maximumWindowSize**, and **noDelay**. The example was updated in AS3 3.40 to include the Websocket profile. +**New in BIG-IP AS3 3.45 and later** |br| +In BIG-IP AS3 versions prior to 3.45, the WebSocket profile was referenced from an HTTP profile. In AS3 3.45 and later, the WebSocket profile can be referenced directly from the virtual service (an HTTP profile is still required). Referencing from an HTTP profile is deprecated, but still allowed for backwards compatibility. We include examples of both methods in the following examples. + +**Example for BIG-IP AS3 3.45 and later** + +This declaration creates the following objects on the BIG-IP (you MUST be on AS3 3.45 or later to use this example): + +- Partition (tenant) named **Sample_WebSocket_Profile**. +- An HTTP service (virtual server) named **service** that references the WebSocket profile and the HTTP profile. +- A default HTTP profile. +- A WebSocket profile with a number of properties. + + +.. literalinclude:: ../../examples/declarations/example-service-http-websocket-profile-ref.json + :language: json + +| + +**Example for BIG-IP AS3 3.44 and earlier** + This declaration creates the following objects on the BIG-IP: -- Partition (tenant) named **Sample_profile_05**. -- An HTTP service (virtual server) named **service**. -- An HTTP profile that includes WebSocket properties. +- Partition (tenant) named **Sample_WebSocket_Profile**. +- An HTTP service (virtual server) named **service** that references the HTTP profile. +- An HTTP profile that references the WebSocket profile. +- A WebSocket profile with a number of properties. .. literalinclude:: ../../examples/declarations/example-websocket-profile.json diff --git a/docs/index.rst b/docs/index.rst index 87d3fda1..3839f62f 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -69,7 +69,7 @@ And the Using BIG-IP AS3 video: .. |supportmd| raw:: html - Support information on GitHub + Support information on GitHub .. |release| raw:: html diff --git a/docs/openapi.yaml b/docs/openapi.yaml index e7f2963a..de984ddf 100644 --- a/docs/openapi.yaml +++ b/docs/openapi.yaml @@ -1,6 +1,6 @@ openapi: '3.0.0' info: - version: 3.44.0 + version: 3.46.0 title: F5 BIG-IP AS3 description: This reference describes the BIG-IP AS3 API and available endpoints. externalDocs: @@ -300,7 +300,7 @@ paths: tags: - Configuration description: | - Retrieve a declarations for all per-app declarations + Retrieve the declarations for all applications under a tenant responses: 200: description: Successful response @@ -369,7 +369,7 @@ paths: tags: - Configuration description: | - Retrieve a declarations for all per-app declarations + Retrieve the declaration for a specific application under a tenant responses: 200: description: Successful response diff --git a/docs/refguide/revision-history.rst b/docs/refguide/revision-history.rst index 3c95ca89..20ba9157 100644 --- a/docs/refguide/revision-history.rst +++ b/docs/refguide/revision-history.rst @@ -9,10 +9,18 @@ Document Revision History * - Release - Description - - Date + - Date + + * - 3.46 + - Updated the documentation for AS3 v3.46.0. This release contains the following changes: |br| * |br| |br| Issues Resolved: |br| * Handling of line continuation character in iRule, `GitHub Issue 704 `_ |br| * Updated list of services for Protocol_Inspection_Profile |br| * Fixed issue with running a DELETE after a dry-run on BIG-IQ |br| * SNAT_Pool handling in /Common/Shared, `GitHub Issue 727 `_ |br| * Fixed idempotency issue with a Pool's minimumMonitors + - 7-24-23 + + * - Unreleased (documentation updates) + - This documentation only update contains the following changes: |br| * Added a procedure for downgrading BIG-IP AS3 on a BIG-IQ (see :ref:`Downgrade`) |br| * Added a troubleshooting entry for potential AS3 incompatibility on BIG-IQ (see :ref:`Troubleshooting`) + - 6-6-23 * - 3.45 - - Updated the documentation for AS3 v3.45.0. This release contains the following changes: |br| * Added a note to the :ref:`Warnings` page about AS3 not functioning properly when the BIG-IP is in Appliance mode |br| |br| Issues Resolved: |br| * Modifying a GSLB_Server with virtualServerDiscoveryMode may result in offline pool members |br| * Protocol_Inspection_Profile_Service_Compliance_Checks and Protocol_Inspection_Profile_Service_Signature_Checks not displaying any properties in schema reference + - Updated the documentation for AS3 v3.45.0. This release contains the following changes: |br| * Added support for WebSocket profiles in a virtual server (see the updated :ref:`WebSocket` example) |br| * Added a warning to the :ref:`BIG-IQ` page stating AS3 3.42 and later are not compatible with BIG-IQ (added the same note to the :ref:`Warnings` section) |br| * Added a note to the :ref:`Warnings` page about AS3 not functioning properly when the BIG-IP is in Appliance mode |br| * Updated **TLS_Client** and **TLS_Server** properties to include an indefinite option. The indefinite option behaves the same as a value of 4294967295 |br| * Updated the Protocol Inspection profile example, and added recommendation for referencing profiles on the BIG-IP (see :ref:`Protocol Inspection example`) |br| * Added a note to the Shared Nodes example stating Shared FQDN nodes must be deleted manually (see :ref:`Shared Nodes`) |br| |br| Issues Resolved: |br| * Modifying a GSLB_Server with virtualServerDiscoveryMode may result in offline pool members |br| * Protocol_Inspection_Profile_Service_Compliance_Checks and Protocol_Inspection_Profile_Service_Signature_Checks not displaying any properties in schema reference |br| * Module provisioning validation to occur before reference validation to improve error message in failure case |br| * When modifying or moving an existing AS3 application from one Route Domain to another, the Service Discovery nodes are not updated to the new Route domain |br| * When cli preference list-all-properties is enabled, AS3 installation fails with an error - 5-22-23 * - 3.44 @@ -241,7 +249,7 @@ Document Revision History - 10-19-18 * - 3.5 - - Updated the documentation for AS3 v3.5.0. This release contains the following changes: |br| * Added a Community Supported version of AS3 in a Container on Docker Hub |br| * Added support for Generic Services (see :ref:`Using the Service_Generic class` and :doc:`schema-reference` for usage). |br| * Added support for the FIX Profile for Service_TCP and Service_L4, which includes the ability to configure Sender Tag Mapping and Log Publishers (see :ref:`Using a FIX profile and data groups in a declaration ` for details). |br| * Added support for internal, external, and existing Data Groups (see :doc:`schema-reference` and :ref:`the FIX example` for usage). |br| * Added support for spanning in Serivce_Address (see :doc:`schema-reference` for usage). |br| * The AS3 schema is now published on GitHub (https://github.com/F5Networks/f5-appsvcs-extension/tree/master/schema) |br| |br| Issues Resolved: |br| * Pointing to a Service_Address in a declaration can fail . |br| * Incorrect validation of declarations wrapped in an AS3 Request object. |br| * Multiple conditions or actions in an Endpoint Policy Rule can cause AS3 to lock up. |br| * Errors when processing a declaration can cause AS3 to lock up. |br| * HTTP Profile Compression issues (Extra “glob” characters included in content-type and Cannot update uri and content-type include/exclude values). |br| * Declaration updates that remove a property can silently fail. |br| * Enforcement_Listener declarations cannot reference Service_Generic declarations. |br| * Service_Address and Pool members can have naming conflicts. |br| * Persist update not idempotent due to prop with regex value. |br| * Success on second POST with Diameter Endpoint Profile. |br| * Cannot update certificate properties. + - Updated the documentation for AS3 v3.5.0. This release contains the following changes: |br| * Added a Community Supported version of AS3 in a Container on Docker Hub |br| * Added support for Generic Services (see :ref:`Using the Service_Generic class` and :doc:`schema-reference` for usage). |br| * Added support for the FIX Profile for Service_TCP and Service_L4, which includes the ability to configure Sender Tag Mapping and Log Publishers (see :ref:`Using a FIX profile and data groups in a declaration ` for details). |br| * Added support for internal, external, and existing Data Groups (see :doc:`schema-reference` and :ref:`the FIX example` for usage). |br| * Added support for spanning in Serivce_Address (see :doc:`schema-reference` for usage). |br| * The AS3 schema is now published on GitHub (https://github.com/F5Networks/f5-appsvcs-extension/tree/main/schema) |br| |br| Issues Resolved: |br| * Pointing to a Service_Address in a declaration can fail . |br| * Incorrect validation of declarations wrapped in an AS3 Request object. |br| * Multiple conditions or actions in an Endpoint Policy Rule can cause AS3 to lock up. |br| * Errors when processing a declaration can cause AS3 to lock up. |br| * HTTP Profile Compression issues (Extra “glob” characters included in content-type and Cannot update uri and content-type include/exclude values). |br| * Declaration updates that remove a property can silently fail. |br| * Enforcement_Listener declarations cannot reference Service_Generic declarations. |br| * Service_Address and Pool members can have naming conflicts. |br| * Persist update not idempotent due to prop with regex value. |br| * Success on second POST with Diameter Endpoint Profile. |br| * Cannot update certificate properties. - 10-02-18 * - Unreleased @@ -298,7 +306,7 @@ Document Revision History .. |valid| raw:: html - AS3 Schema Validator + AS3 Schema Validator .. |tlsc| raw:: html @@ -312,7 +320,7 @@ Document Revision History .. |schemalink| raw:: html - schema files + schema files .. |pmcol| raw:: html @@ -320,7 +328,7 @@ Document Revision History .. |supportmd| raw:: html - Support page on GitHub + Support page on GitHub .. |bigiqvid| raw:: html diff --git a/docs/userguide/big-iq.rst b/docs/userguide/big-iq.rst index 357c2ec7..24d38492 100644 --- a/docs/userguide/big-iq.rst +++ b/docs/userguide/big-iq.rst @@ -7,6 +7,8 @@ Using BIG-IP AS3 with BIG-IQ BIG-IP AS3 is available in BIG-IQ v6.1.0 and later +.. WARNING:: AS3 versions 3.42 and later are NOT compatible with BIG-IQ. To see the version of AS3 your BIG-IQ device is running, from the BIG-IQ command line, type: ``curl http://localhost:8105/shared/appsvcs/info``. To downgrade your AS3 version on BIG-IQ, see :ref:`Downgrade`. + BIG-IQ v6.1.0 adds BIG-IP AS3 support, which includes BIG-IP AS3 v3.7.0. When you use BIG-IP AS3 on BIG-IQ, declarations you send through BIG-IQ enable applications to appear in the UI of BIG-IQ (Applications tab > Applications menu), with support for BIG-IQ's analytics and RBAC capabilities. For information on viewing applications and analytics in the BIG-IQ UI, see the |bigiqui| documentation. You can also see our |bigiqvideo|. .. IMPORTANT:: If your BIG-IP does not have BIG-IP AS3 installed or if an older version of BIG-IP AS3 is installed, BIG-IQ installs its version of BIG-IP AS3 onto the target BIG-IP system. This means if you have a BIG-IP running an LTS version of BIG-IP AS3, and use that BIG-IP as a target for BIG-IQ, the LTS version will be overwritten by the BIG-IP AS3 version on BIG-IQ. @@ -137,6 +139,33 @@ See **patchBody** in the |as3class| and |pitem| in the schema reference for deta .. literalinclude:: ../../examples/userguide/example-bigiq-post-patchbody.json :language: json +| + +.. _down: + +Downgrading BIG-IP AS3 on BIG-IQ +-------------------------------- +AS3 versions 3.42 and later are NOT compatible with BIG-IQ. Use the following procedure to downgrade the version of AS3 on your BIG-IQ if you are experiencing issues with application templates on the BIG-IQ. + +.. IMPORTANT:: This should only be necessary if you are running a version of BIG-IQ that uses AS3 3.42 and later. To see the version of AS3 your BIG-IQ device is running, from the BIG-IQ command line, type: **curl http://localhost:8105/shared/appsvcs/info**. + +**To downgrade AS3 on BIG-IQ** + +1. Download the RPM package for the version of AS3 you want from |release| to a location accessible from your BIG-IQ. We recommend 3.41. + +2. Optional: If your BIG-IQ environment has high availability (HA) setup, you should upgrade the AS3 on the Standby unit before upgrading the active unit. The BIG-IQ HA systems are required use the same AS3 version. + +3. Use an SCP client to copy the RPM file to the **/shared/tmp** directory of the BIG-IQ system. For example, you could run ``scp root@:/shared/tmp/.`` + +4. Log in to the BIG-IQ command line. + +5. Use the following syntax to downgrade AS3: ``rpm -Uv --oldpackage /shared/tmp/f5-appsvcs-.noarch.rpm``. For example, ``rpm -Uv --oldpackage /shared/tmp/f5-appsvcs-3.41.0-1.noarch.rpm`` + +6. Run the following command to restart the associated services: ``tmsh restart /sys service restjavad restnoded``. + +7. Verify the downgraded version is now on BIG-IQ using: ``curl http://localhost:8105/shared/appsvcs/info`` + +8. Optional: If your BIG-IQ environment has high availability (HA) setup, after you upgrade the AS3 on the standby unit, you can repeat this procedure to upgrade the active unit. @@ -187,3 +216,7 @@ See **patchBody** in the |as3class| and |pitem| in the schema reference for deta K54909607 +.. |release| raw:: html + + AS3 releases on GitHub + diff --git a/docs/userguide/faq.rst b/docs/userguide/faq.rst index df175327..bf664f44 100644 --- a/docs/userguide/faq.rst +++ b/docs/userguide/faq.rst @@ -29,7 +29,7 @@ See the |intro| for a description of BIG-IP AS3. This entry contains informatio | -.. _version13: +.. _version13: **Which TMOS versions does BIG-IP AS3 support?** @@ -406,7 +406,7 @@ As a part of an initiative to clean up language that can be considered racially- .. |supportmd| raw:: html - Support information on GitHub + Support information on GitHub .. |fast| raw:: html @@ -424,4 +424,4 @@ As a part of an initiative to clean up language that can be considered racially- Declarative Onboarding - \ No newline at end of file + diff --git a/docs/userguide/per-app-declarations.rst b/docs/userguide/per-app-declarations.rst new file mode 100644 index 00000000..37c81bed --- /dev/null +++ b/docs/userguide/per-app-declarations.rst @@ -0,0 +1,124 @@ +Per-Application Declarations +============================ + +BIG-IP AS3 3.46 introduces a "per-application" deployment model, which enables declarations to include only applications, leaving other applications in a tenant unaltered. + +In previous releases, BIG-IP AS3 only supported a tenant-based model. This meant posting a declaration with a tenant and, by default, AS3 would not modify other tenants. In this case, all applications had to be included in the tenant; if you posted a declaration that did not include existing applications in that tenant, AS3 deleted them. + +Similar to the tenant-based model, the per-application deployment model allows you post a declaration that contains an application in a tenant and have AS3 leave the other applications in that tenant untouched. + + +Using a per-application declaration +----------------------------------- + +Using a per-application declaration is similar to using a traditional declaration, but there is no tenant class in the declaration and the per-application declaration uses a different URI path. + +For traditional declarations to a specific tenant, AS3 supports requests to ``/appsvcs/declare/[[,,...]]``. The tenants in the path indicate which tenants in the declaration AS3 . This means you can POST a declaration with several tenants but include one or more comma-separated tenants in the path. In this case AS3 will only create/modify the tenants in the path. + +The per-application declaration allows all CRUD operations to a specific tenant and application in the URI path without specifying the tenant in the declaration. + +The following is an example per-application declaration (note the lack of the Tenant class): + +.. code-block:: json + + { + "Application1": { + "class": "Application", + "service": { + "class": "Service_HTTP", + "virtualAddresses": [ + "192.0.2.1" + ], + "pool": "pool" + }, + "pool": { + "class": "Pool", + "members": [ + { + "servicePort": 80, + "serverAddresses": [ + "192.0.2.10", + "192.0.2.20" + ] + } + ] + } + } + } + + + +POSTing a per-application +````````````````````````` + +The URI path for POSTing a per-application declaration is ``/appsvcs/declare//applications``. For example: ``HTTPS://192.0.2.10/mgmt/shared/appsvcs/declare/ExampleTenant/applications`` + + + +Using GET to view applications +`````````````````````````````` + + +There are two API paths you can use for per-application declarations: + +- ``/appsvcs/declare//applications``
+- ``/appsvcs/declare//applications/[] + +Adding applications to the path before the application name allows for more clarity should we later to decide to allow for further component specification by path. Meanwhile, not adding tenants before the tenant name maintains backwards compatibility with the currently supported URIs. Together, this also allows us to be sure that the user is meaning to do a per-app deployment and not simply wanting to restrict the tenants to those listed. + +Although this is a different meaning of tenant in the path, we feel this makes the most sense for the per-app model. + +For POST requests, the application name is not included. The application name will be in the declaration. + +Beta flag: + +As we want to gather user feedback on this feature, we want to leave open the possibility of modifying the API in the future in a backwards breaking manner. Therefore, at initial release this feature will only be accessible via a beta flag in HTTP requests. There are several ways to achieve this as spelled out in MBIPAPPSVC-883. These include + +A beta query parameter which can be set to true on any given request +A beta property in the controls object in the declaration which can be set to true in the declaration +A beta setting which can be set to true in the AS3 settings API +Adding beta to the URI path like /appsvcs/beta/declare +We can support any one of these or even do some or all of them with a defined order of precedence. This is a PM decision. + +Decision: We have decided to only support having a beta flag in the AS3 settings. Once the setting is set, it will remain in effect for all subsequent declarations until the setting is changed back. The flag should allow for more fine grained control than just 'beta enabled / beta disabled'. So we will make an object: + +betaOptions: { + perAppDeploymentAllowed: true +} + +Schema validation for beta feature +MBIPAPPSVC-883 covers some of schema validation for shared schema classes. However, we will likely need specialized handling for this feature at least for classic in that it changes what the top-level class is. Two options: + +Deliver two separate schemas and choose based on the beta flag +Do the per-app validation in code +Either way, once validated, AS3 can wrap the incoming declaration in AS3/ADC classes and set internal flags so it knows that the rest of the handling is per-app + +Decision: We have decided to deliver multiple schemas. AS3 already supports loading more than one schema at startup so we just need runtime code to decide which schema to validate against. + +Mutex locking +AS3 on classic is currently restricted to handling one declaration at a time. This is achieved by creating an internal data-group of the name ____appsvcs_lock. If this data group exists at the time that AS3 receives a declaration, it returns a 503 status code. The data-group is then deleted at the end of declaration processing. + +Assumptions for the initial release: + +We will support handling both per-app and standard APIs on the same instance. +Mutex lock is at the tenant level for per-app deployments. +We will not allow a standard deployment while any per-app deployment is running. +We will not allow a per-app deployment while any standard deployment is running. +We will not allow any deployment when a deployment to /Common is running. (added 3/17/2023 after design review with dev team) +We can make one data-group per tenant and mutex lock AS3 at the tenant level. Because some items (namely virtual addresses) are stored at the tenant level, outside an application, we cannot move the mutex lock to the application level. We can either continue to create the same data-group as well as creating one per tenant even in per-app deployments, or just create the tenant based locks in per-app deployments. This is an implementation detail. + +Shared items +AS3 supports two types of shared items + +/Common/Shared: items are created in /Common and can be shared by applications in any tenant +/Tenant/Shared: items are created in a tenant and can be shared across applications in the tenant +Decision: + +For items in /Common/Shared we will need to determine how to clean these up - either through reference counting or examine how we do this today and see if it is applicable to per-app deployments. Need to look at both use pointers and bigip pointers. It may be acceptable to allow the user to manage this but we should see if we can do it in AS3 code. +For items in /Tenant/Shared, it is up to the user to manage this. Shared will be treated no other than any other application. + + +.. |br| raw:: html + +
+ diff --git a/docs/userguide/settings-endpoint.rst b/docs/userguide/settings-endpoint.rst index 0bcd5f6b..6d3becf6 100644 --- a/docs/userguide/settings-endpoint.rst +++ b/docs/userguide/settings-endpoint.rst @@ -7,6 +7,7 @@ To use the **/settings** endpoint, you can send a POST or GET request to ``HTTPS - **Check current settings** |br| Using a GET request returns the current configuration settings and their values. |br| To check the current setting status, send a GET request to ``HTTPS:///mgmt/shared/appsvcs/settings``. When the request is successful, you will receive a response like: .. code-block:: json + { "asyncTaskStorage": "data-group", "burstHandlingEnabled": false, diff --git a/docs/userguide/tips-warnings.rst b/docs/userguide/tips-warnings.rst index b195f546..2ff245ac 100644 --- a/docs/userguide/tips-warnings.rst +++ b/docs/userguide/tips-warnings.rst @@ -12,6 +12,8 @@ Warnings - You must use the **admin** user (and not just a user with administrator privileges) to install BIG-IP AS3. +- AS3 versions 3.42 and later are NOT compatible with BIG-IQ. To see the version of AS3 your BIG-IQ device is running, from the BIG-IQ command line, type: **curl http://localhost:8105/shared/appsvcs/info**. If you need to downgrade the version of AS3 on your BIG-IQ, see :ref:`Downgrade`. + - BIG-IP AS3 does not function properly when the BIG-IP has |appliance| enabled. We strongly recommend disabling Appliance mode when using BIG-IP AS3. - BIG-IP AS3 saves the BIG-IP configuration (**tmsh save sys config**) even when the operation result is **no change**, unless **persist** is set to **false** (persist is set to true by default). This could affect performance for BIG-IP devices with a large number of configuration objects. |br| |br| @@ -168,7 +170,7 @@ Notes and Tips .. |valid| raw:: html - AS3 Schema Validator + AS3 Schema Validator .. |postmancol| raw:: html @@ -194,7 +196,7 @@ Notes and Tips .. |ocp| raw:: html OneConnect profile - + .. |mpp| raw:: html Muliplex profile @@ -202,4 +204,3 @@ Notes and Tips .. |do| raw:: html Declarative Onboarding - diff --git a/docs/userguide/troubleshooting.rst b/docs/userguide/troubleshooting.rst index e3e88a1a..8504adee 100644 --- a/docs/userguide/troubleshooting.rst +++ b/docs/userguide/troubleshooting.rst @@ -270,6 +270,19 @@ If you have an iRule in an AS3 declaration which is returning 422 errors, there +| + +.. _bigiqas3: + +Why are application templates on BIG-IQ not working properly? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +AS3 versions 3.42 and later are NOT compatible with BIG-IQ, and cause issues with application templates on the BIG-IQ. + +To see the version of AS3 your BIG-IQ device is running, from the BIG-IQ command line, type: **curl http://localhost:8105/shared/appsvcs/info**. + +If you are experiencing this issue, we recommend following the steps in :ref:`Downgrading the version of AS3 on BIG-IQ`. + + .. |br| raw:: html
diff --git a/docs/userguide/validate.rst b/docs/userguide/validate.rst index 523ea972..4bfa2a75 100644 --- a/docs/userguide/validate.rst +++ b/docs/userguide/validate.rst @@ -4,7 +4,7 @@ Validating a declaration ------------------------ In this section, we show you how to validate a BIG-IP AS3 declaration against the schema using Microsoft |vsc|. Using this type of validation is useful when composing a declaration manually, or to check the accuracy of a declaration before deployment. -For more information on editing JSON with Visual Studio Code, see this |json|. +For more information on editing JSON with Visual Studio Code, see this |json|. .. NOTE:: If you are not using the **AS3** class (see :ref:`as3class-ref`) in a declaration you are validating, the validation process incorrectly warns that the first class in a declaration must be "AS3". It is perfectly acceptable to ignore this warning and omit the AS3 class, and start with the **ADC** class. @@ -22,28 +22,28 @@ Use the following procedure to validate a declaration. 3. Open Visual Studio Code, and use **File > New File** start a new JSON file. In our example, we name our file **myDeclaration.json**. You must save the file in order for Visual Studio Code to recognize it as a JSON file. 4. At the top of your schema file, type the following code: - + .. code-block:: json { "$schema": "", -5. Paste the GitHub raw URL you copied (if you downloaded the schema file, use the path to the file on your device) between the quotes. When you are finished with this step, your code should look like the following (you may have a different directory than **latest**): +5. Paste the GitHub raw URL you copied (if you downloaded the schema file, use the path to the file on your device) between the quotes. When you are finished with this step, your code should look like the following (you may have a different directory than **latest**): .. code-block:: json { - "$schema": "https://raw.githubusercontent.com/F5Networks/f5-appsvcs-extension/master/schema/latest/as3-schema.json", - + "$schema": "https://raw.githubusercontent.com/F5Networks/f5-appsvcs-extension/main/schema/latest/as3-schema.json", + 6. Begin to type your declaration (if validating an existing declaration, see step 7) - As you begin to type the :ref:`properties of your declaration`, the validation process suggests valid options. .. image:: /images/validate-schema.png - - | + + | - You can also hover on a red wavy line (for JSON syntax errors), or a green wavy line (schema validation errors) to see the problem. In the following example, we have the declaration property, but have not yet included any of the required properties for *declaration*. @@ -53,7 +53,7 @@ Use the following procedure to validate a declaration. - It also suggests valid options for a property in the declaration: - .. image:: /images/validate-version.png + .. image:: /images/validate-version.png | @@ -64,7 +64,7 @@ Use the following procedure to validate a declaration. | -7. You can also validate an existing declaration by pasting only the **$schema** line between the opening bracket of the file and the first property of the declaration. +7. You can also validate an existing declaration by pasting only the **$schema** line between the opening bracket of the file and the first property of the declaration. - In this example, the validator discovers a typo of the word *Tenant*. @@ -78,7 +78,7 @@ Use the following procedure to validate a declaration. .. image:: /images/validate-problems.png - + .. |vsc| raw:: html @@ -91,8 +91,9 @@ Use the following procedure to validate a declaration. .. |schema| raw:: html - schema + schema .. |br| raw:: html - -
\ No newline at end of file + +
+ diff --git a/examples/declarations/example-endpoint-policy-enable-disable-botdefense.json b/examples/declarations/example-endpoint-policy-enable-disable-botdefense.json new file mode 100644 index 00000000..a37a9ca6 --- /dev/null +++ b/examples/declarations/example-endpoint-policy-enable-disable-botdefense.json @@ -0,0 +1,56 @@ +{ + "class": "ADC", + "schemaVersion": "3.46.0", + "id": "Service_HTTP", + "Endpoint_Policy_BotDefense": { + "class": "Tenant", + "Application": { + "class": "Application", + "testItem": { + "class": "Service_HTTP", + "virtualAddresses": [ + "10.1.40.50" + ], + "policyEndpoint": "endpointPolicy", + "profileBotDefense": { + "bigip": "/Common/bot-defense" + } + }, + "endpointPolicy": { + "class": "Endpoint_Policy", + "rules": [ + { + "name": "enableBotDefense", + "conditions": [ + { + "type": "httpUri", + "path": { + "values": [ + "example.com" + ] + } + } + ], + "actions": [ + { + "type": "botDefense", + "profile": { + "bigip": "/Common/bot-defense" + } + } + ] + }, + { + "name": "disableBotDefense", + "conditions": [], + "actions": [ + { + "type": "botDefense" + } + ] + } + ] + } + } + } +} diff --git a/examples/declarations/example-gslb-features.json b/examples/declarations/example-gslb-features.json index 75707b3f..16330582 100644 --- a/examples/declarations/example-gslb-features.json +++ b/examples/declarations/example-gslb-features.json @@ -94,7 +94,14 @@ "class": "GSLB_Prober_Pool", "enabled": true, "lbMode": "round-robin", - "members": [] + "members": [ + { + "server": { + "use": "testServer" + }, + "memberOrder": 0 + } + ] }, "testServer": { "class": "GSLB_Server", diff --git a/examples/declarations/example-pool-with-metadata b/examples/declarations/example-pool-with-metadata new file mode 100644 index 00000000..fce4c902 --- /dev/null +++ b/examples/declarations/example-pool-with-metadata @@ -0,0 +1,42 @@ +{ + "class": "ADC", + "schemaVersion": "3.46.0", + "id": "TEST", + "TEST": { + "class": "Tenant", + "Application": { + "class": "Application", + "testVirtual": { + "class": "Service_HTTP", + "virtualAddresses": [ + "10.0.0.1" + ], + "pool": { + "use": "testPool" + }, + "metadata": { + "foo": { + "value": "bar" + } + } + }, + "testPool": { + "class": "Pool", + "members": [ + { + "servicePort": 80, + "serverAddresses": [ + "10.0.0.1" + ] + } + ], + "metadata": { + "example": { + "value": "test", + "persist": false + } + } + } + } + } +} diff --git a/examples/declarations/example-protocol-inspection-profile.json b/examples/declarations/example-protocol-inspection-profile.json index f9c69499..82b6d011 100644 --- a/examples/declarations/example-protocol-inspection-profile.json +++ b/examples/declarations/example-protocol-inspection-profile.json @@ -49,6 +49,16 @@ ] } ] + }, + "service2": { + "class": "Service_UDP", + "virtualPort": 53, + "virtualAddresses": [ + "192.0.2.2" + ], + "profileProtocolInspection": { + "bigip": "/Common/protocol_inspection_dns" + } } } } diff --git a/examples/declarations/example-service-tcp-with-net-port-address-lists.json b/examples/declarations/example-service-tcp-with-net-port-address-lists.json new file mode 100644 index 00000000..956e797a --- /dev/null +++ b/examples/declarations/example-service-tcp-with-net-port-address-lists.json @@ -0,0 +1,39 @@ +{ + "class": "AS3", + "action": "deploy", + "persist": true, + "declaration": { + "class": "ADC", + "schemaVersion": "3.46.0", + "id": "addressPortList", + "Tenant": { + "class": "Tenant", + "Application": { + "class": "Application", + "addressList": { + "class": "Net_Address_List", + "addresses": [ + "192.168.2.10/32", + "192.168.2.50-192.168.2.60" + ] + }, + "portList": { + "class": "Net_Port_List", + "ports": [ + 8080, + "1-999" + ] + }, + "tcpService": { + "class": "Service_TCP", + "virtualAddresses": { + "use": "addressList" + }, + "virtualPort": { + "use": "portList" + } + } + } + } + } +} diff --git a/examples/declarations/example-service-tcp-with-source-destination-lists.json b/examples/declarations/example-service-tcp-with-source-destination-lists.json new file mode 100644 index 00000000..e7e266f5 --- /dev/null +++ b/examples/declarations/example-service-tcp-with-source-destination-lists.json @@ -0,0 +1,68 @@ +{ + "class": "AS3", + "action": "deploy", + "persist": true, + "declaration": { + "class": "ADC", + "schemaVersion": "3.46.0", + "id": "addressList", + "Tenant": { + "class": "Tenant", + "Application": { + "class": "Application", + "sourceAddressList": { + "class": "Firewall_Address_List", + "addresses": [ + "192.168.2.10/32", + "192.168.2.50-192.168.2.60" + ] + }, + "destinationAddressList1": { + "class": "Firewall_Address_List", + "addresses": [ + "192.168.2.1-192.168.2.10" + ] + }, + "destinationAddressList2": { + "class": "Firewall_Address_List", + "addresses": [ + "192.168.2.20/32" + ] + }, + "destinationAddressList3": { + "class": "Firewall_Address_List", + "addresses": [ + "192.168.2.100/32" + ], + "addressLists": [ + { + "use": "destinationAddressList1" + }, + { + "use": "destinationAddressList2" + } + ] + }, + "portList": { + "class": "Firewall_Port_List", + "ports": [ + 8080, + "1-999" + ] + }, + "tcpService": { + "class": "Service_TCP", + "sourceAddress": { + "use": "sourceAddressList" + }, + "virtualAddresses": { + "use": "destinationAddressList3" + }, + "virtualPort": { + "use": "portList" + } + } + } + } + } +} diff --git a/examples/declarations/example-waf-policy-string-expansion.json b/examples/declarations/example-waf-policy-string-expansion.json new file mode 100644 index 00000000..d5fb6bf0 --- /dev/null +++ b/examples/declarations/example-waf-policy-string-expansion.json @@ -0,0 +1,27 @@ +{ + "class": "ADC", + "schemaVersion": "3.46.0", + "id": "WAF_Policy", + "Tenant": { + "class": "Tenant", + "Application": { + "class": "Application", + "service": { + "class": "Service_HTTP", + "virtualAddresses": ["192.0.2.10"], + "policyWAF": { + "use": "wafPolicy" + } + }, + "wafPolicy": { + "class": "WAF_Policy", + "policy": { + "base64": "ewogICJwb2xpY3kiOiB7CiAgICAibmFtZSI6ICJBcHBQb2xpY3kwMSIsCiAgICAiZGVzY3JpcHRpb24iOiAiZW1iZWRkZWQgV0FGIFBvbGljeSIsCiAgICAidGVtcGxhdGUiOiB7CiAgICAgICJuYW1lIjogIlBPTElDWV9URU1QTEFURV9SQVBJRF9ERVBMT1lNRU5UIgogICAgfSwKICAgICJvcGVuLWFwaS1maWxlcyI6IFsKICAgICAgewogICAgICAgICJsaW5rIjogImh0dHBzOi8vZXhhbXBsZS5jb20vZmlsZXMvYEFgL29wZW5hcGkueWFtbCIKICAgICAgfQogICAgXQogIH0KfQo=" + }, + "expand": [ + "/policy/open-api-files/0/link" + ] + } + } + } +} \ No newline at end of file diff --git a/examples/declarations/per-app/example-per-app-multiple-app-array.json b/examples/declarations/per-app/example-per-app-multiple-app-array.json deleted file mode 100644 index 715750d3..00000000 --- a/examples/declarations/per-app/example-per-app-multiple-app-array.json +++ /dev/null @@ -1,46 +0,0 @@ - { - "Application1": { - "class": "Application", - "service": { - "class": "Service_HTTP", - "virtualAddresses": [ - "192.0.2.1" - ], - "pool": "pool" - }, - "pool": { - "class": "Pool", - "members": [ - { - "servicePort": 80, - "serverAddresses": [ - "192.0.2.10", - "192.0.2.20" - ] - } - ] - } - }, - "Application2": { - "class": "Application", - "service": { - "class": "Service_HTTP", - "virtualAddresses": [ - "192.0.2.2" - ], - "pool": "pool" - }, - "pool": { - "class": "Pool", - "members": [ - { - "servicePort": 80, - "serverAddresses": [ - "192.0.2.30", - "192.0.2.40" - ] - } - ] - } - } - } diff --git a/examples/declarations/per-app/example-per-app-multiple-apps.json b/examples/declarations/per-app/example-per-app-multiple-apps.json new file mode 100644 index 00000000..d71eafd1 --- /dev/null +++ b/examples/declarations/per-app/example-per-app-multiple-apps.json @@ -0,0 +1,46 @@ +{ + "Application1": { + "class": "Application", + "service": { + "class": "Service_HTTP", + "virtualAddresses": [ + "192.0.2.1" + ], + "pool": "pool" + }, + "pool": { + "class": "Pool", + "members": [ + { + "servicePort": 80, + "serverAddresses": [ + "192.0.2.10", + "192.0.2.20" + ] + } + ] + } + }, + "Application2": { + "class": "Application", + "service": { + "class": "Service_HTTP", + "virtualAddresses": [ + "192.0.2.2" + ], + "pool": "pool" + }, + "pool": { + "class": "Pool", + "members": [ + { + "servicePort": 80, + "serverAddresses": [ + "192.0.2.30", + "192.0.2.40" + ] + } + ] + } + } +} \ No newline at end of file diff --git a/examples/declarations/per-app/example-per-app-pool.json b/examples/declarations/per-app/example-per-app-pool.json new file mode 100644 index 00000000..1124f5e7 --- /dev/null +++ b/examples/declarations/per-app/example-per-app-pool.json @@ -0,0 +1,15 @@ +{ + "app1": { + "class": "Application", + "template": "generic", + "pool1": { + "class": "Pool", + "loadBalancingMode": "round-robin", + "minimumMembersActive": 1, + "reselectTries": 0, + "serviceDownAction": "none", + "slowRampTime": 11, + "minimumMonitors": 1 + } + } +} diff --git a/package-lock.json b/package-lock.json index caf9ab30..76a2bd24 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,15 @@ { "name": "f5-appsvcs", - "version": "3.45.0-5", + "version": "3.46.0-5", "lockfileVersion": 1, "requires": true, "dependencies": { "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "devOptional": true, + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "requires": { - "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" } }, @@ -24,33 +23,15 @@ "@types/json-schema": "^7.0.6", "call-me-maybe": "^1.0.1", "js-yaml": "^4.1.0" - }, - "dependencies": { - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - } } }, "@automation-toolchain/f5-appsvcs-schema": { - "version": "0.10.6", - "resolved": "https://artifactory.f5net.com:443/artifactory/api/npm/f5-automation-toolchain-npm/@automation-toolchain/f5-appsvcs-schema/-/@automation-toolchain/f5-appsvcs-schema-0.10.6.tgz", - "integrity": "sha512-VwUaDEZ19qfswbCqfJ+gMCQb4Cl62fm4YTbrf+uY4oElSZkvNJnml/x/oW36YtEaqtWpwpdcVYgyKeIBR6pahQ==", + "version": "0.11.5", + "integrity": "sha512-VFZLM2Er20HbOy2Hg9Gdb7ySf5kQw734xfpeygl9Lavw8QYMPTgLXaqIcXZtCZQS4fdQeVirHuG7o0HlVRze5Q==", "dev": true, "requires": { - "ajv": "^8.11.0", - "commander": "^6.1.0", + "ajv": "^8.12.0", + "commander": "^11.0.0", "deep-diff": "^1.0.2", "mustache": "^4.2.0" }, @@ -70,521 +51,312 @@ } }, "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", "requires": { - "@babel/highlight": "^7.10.4" + "@babel/highlight": "^7.22.5" } }, "@babel/compat-data": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz", - "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==", - "devOptional": true + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.5.tgz", + "integrity": "sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==" }, "@babel/core": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz", - "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==", - "devOptional": true, - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.10", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helpers": "^7.18.9", - "@babel/parser": "^7.18.10", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.10", - "@babel/types": "^7.18.10", + "version": "7.21.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.8.tgz", + "integrity": "sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.21.5", + "@babel/helper-compilation-targets": "^7.21.5", + "@babel/helper-module-transforms": "^7.21.5", + "@babel/helpers": "^7.21.5", + "@babel/parser": "^7.21.8", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", + "json5": "^2.2.2", "semver": "^6.3.0" }, "dependencies": { - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "devOptional": true, - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "devOptional": true - }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "devOptional": true + "dev": true } } }, "@babel/generator": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.10.tgz", - "integrity": "sha512-0+sW7e3HjQbiHbj1NeU/vN8ornohYlacAfZIaXhdoGweQqgcNy69COVciYYqEXJ/v+9OBA7Frxm4CVAuNqKeNA==", - "devOptional": true, + "version": "7.21.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.9.tgz", + "integrity": "sha512-F3fZga2uv09wFdEjEQIJxXALXfz0+JaOb7SabvVMmjHxeVTuGW8wgE8Vp1Hd7O+zMTYtcfEISGRzPkeiaPPsvg==", + "dev": true, "requires": { - "@babel/types": "^7.18.10", + "@babel/types": "^7.21.5", "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "devOptional": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } } }, "@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", - "optional": true, + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-compilation-targets": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", - "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", - "devOptional": true, - "requires": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.20.2", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz", + "integrity": "sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==", + "requires": { + "@babel/compat-data": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", "semver": "^6.3.0" }, "dependencies": { "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "devOptional": true + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, "@babel/helper-create-class-features-plugin": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.0.tgz", - "integrity": "sha512-Q8wNiMIdwsv5la5SPxNYzzkPnjgC0Sy0i7jLkVOCdllu/xcVNkr3TeZzbHBJrj+XXRqzX5uCyCoV9eu6xUG7KQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.5.tgz", + "integrity": "sha512-xkb58MyOYIslxu3gKmVXmjTtUPvBU4odYzbiIQbWwLKIHCsx6UGZGX6F1IznMFVnDdirseUZopzN+ZRt8Xb33Q==", "optional": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-member-expression-to-functions": "^7.21.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/helper-split-export-declaration": "^7.18.6" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.5", + "semver": "^6.3.0" }, "dependencies": { - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "optional": true, - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", - "optional": true, - "requires": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" - } - }, - "@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", - "optional": true - }, - "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "optional": true - }, - "@babel/parser": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz", - "integrity": "sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==", + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "optional": true - }, - "@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", - "optional": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" - } - }, - "@babel/types": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.3.tgz", - "integrity": "sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg==", - "optional": true, - "requires": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - } } } }, "@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "devOptional": true + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==" }, "@babel/helper-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", - "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", - "devOptional": true, + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", "requires": { - "@babel/template": "^7.18.6", - "@babel/types": "^7.18.9" + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" } }, "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "devOptional": true, + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz", - "integrity": "sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz", + "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==", "optional": true, "requires": { - "@babel/types": "^7.21.0" - }, - "dependencies": { - "@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", - "optional": true - }, - "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "optional": true - }, - "@babel/types": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.3.tgz", - "integrity": "sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg==", - "optional": true, - "requires": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - } - } + "@babel/types": "^7.22.5" } }, "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "devOptional": true, + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-module-transforms": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", - "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", - "devOptional": true, + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", + "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" } }, "@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", "optional": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "optional": true }, "@babel/helper-replace-supers": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz", - "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.5.tgz", + "integrity": "sha512-aLdNM5I3kdI/V9xGNyKSF3X/gTyMUBohTZ+/3QdQKAA9vxIiy12E+8E2HoOP1/DjeqU+g6as35QHJNMDDYpuCg==", "optional": true, "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.20.7", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "optional": true, - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/generator": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.3.tgz", - "integrity": "sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA==", - "optional": true, - "requires": { - "@babel/types": "^7.21.3", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - } - }, - "@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", - "optional": true, - "requires": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" - } - }, - "@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", - "optional": true - }, - "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "optional": true - }, - "@babel/parser": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz", - "integrity": "sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==", - "optional": true - }, - "@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", - "optional": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" - } - }, - "@babel/traverse": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.3.tgz", - "integrity": "sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ==", - "optional": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.3", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.3", - "@babel/types": "^7.21.3", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.3.tgz", - "integrity": "sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg==", - "optional": true, - "requires": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - } - }, - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "optional": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" } }, "@babel/helper-simple-access": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", - "devOptional": true, + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", - "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", "optional": true, "requires": { - "@babel/types": "^7.20.0" - }, - "dependencies": { - "@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", - "optional": true - }, - "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "optional": true - }, - "@babel/types": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.3.tgz", - "integrity": "sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg==", - "optional": true, - "requires": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - } - } + "@babel/types": "^7.22.5" } }, "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "devOptional": true, + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz", + "integrity": "sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==", "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-string-parser": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", - "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==", - "devOptional": true + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==" }, "@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", - "devOptional": true + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==" }, "@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", - "devOptional": true + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==" }, "@babel/helpers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", - "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", - "devOptional": true, + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.5.tgz", + "integrity": "sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==", "requires": { - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" } }, "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "devOptional": true, + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", "requires": { - "@babel/helper-validator-identifier": "^7.18.6", + "@babel/helper-validator-identifier": "^7.22.5", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "devOptional": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } } } }, "@babel/parser": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.10.tgz", - "integrity": "sha512-TYk3OA0HKL6qNryUayb5UUEhM/rkOQozIBEA5ITXh5DWrSp0TlUQXMyZmnWxG/DizSWBeeQ0Zbc5z8UGaaqoeg==", - "devOptional": true + "version": "7.21.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.9.tgz", + "integrity": "sha512-q5PNg/Bi1OpGgx5jYlvWZwAorZepEudDMCLtj967aeS7WMont7dUZI46M2XwcIQqvUlMxWfdLFu4S/qSxeUu5g==", + "dev": true }, "@babel/plugin-proposal-class-properties": { "version": "7.18.6", @@ -597,16 +369,16 @@ } }, "@babel/plugin-proposal-decorators": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.21.0.tgz", - "integrity": "sha512-MfgX49uRrFUTL/HvWtmx3zmpyzMMr4MTj3d527MLlr/4RTT9G/ytFFP7qet2uM2Ve03b+BkpWUpK+lRXnQ+v9w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.22.5.tgz", + "integrity": "sha512-h8hlezQ4dl6ixodgXkH8lUfcD7x+WAuIqPUjwGoItynrXOAv4a4Tci1zA/qjzQjjcl0v3QpLdc2LM6ZACQuY7A==", "optional": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/plugin-syntax-decorators": "^7.21.0" + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.5", + "@babel/plugin-syntax-decorators": "^7.22.5" } }, "@babel/plugin-proposal-private-methods": { @@ -620,113 +392,136 @@ } }, "@babel/plugin-syntax-decorators": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.21.0.tgz", - "integrity": "sha512-tIoPpGBR8UuM4++ccWN3gifhVvQu7ZizuR1fklhRJrd5ewgbkUS+0KVFeWWxELtn18NTLoW32XV7zyOgIAiz+w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.5.tgz", + "integrity": "sha512-avpUOBS7IU6al8MmF1XpAyj9QYeLPuSDJI5D4pVMSMdL7xQokKqJPYQC67RCT0aCTashUXPiGwMJ0DEXXCEmMA==", + "optional": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", "optional": true, "requires": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-syntax-typescript": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", - "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", + "optional": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz", + "integrity": "sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==", "optional": true, "requires": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" } }, "@babel/plugin-transform-typescript": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.3.tgz", - "integrity": "sha512-RQxPz6Iqt8T0uw/WsJNReuBpWpBqs/n7mNo18sKLoTbMp+UrEekhH+pKSVC7gWz+DNjo9gryfV8YzCiT45RgMw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.5.tgz", + "integrity": "sha512-SMubA9S7Cb5sGSFFUlqxyClTA9zWJ8qGQrppNUm05LtFuN1ELRFNndkix4zUJrC9F+YivWwa1dHMSyo0e0N9dA==", "optional": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-typescript": "^7.20.0" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-typescript": "^7.22.5" } }, "@babel/preset-typescript": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.21.0.tgz", - "integrity": "sha512-myc9mpoVA5m1rF8K8DgLEatOYFDpwC+RkMkjZ0Du6uI62YvDe8uxIEYVs/VCdSJ097nlALiU/yBC7//3nI+hNg==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.21.5.tgz", + "integrity": "sha512-iqe3sETat5EOrORXiQ6rWfoOg2y68Cs75B9wNxdPW4kixJxh7aXQE1KPdWLDniC24T/6dSnguF33W9j/ZZQcmA==", "optional": true, "requires": { - "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-plugin-utils": "^7.21.5", "@babel/helper-validator-option": "^7.21.0", - "@babel/plugin-transform-typescript": "^7.21.0" - }, - "dependencies": { - "@babel/helper-validator-option": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", - "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", - "optional": true - } + "@babel/plugin-syntax-jsx": "^7.21.4", + "@babel/plugin-transform-modules-commonjs": "^7.21.5", + "@babel/plugin-transform-typescript": "^7.21.3" + } + }, + "@babel/runtime": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.5.tgz", + "integrity": "sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.11" } }, "@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", - "devOptional": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "requires": { + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" }, "dependencies": { - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "devOptional": true, - "requires": { - "@babel/highlight": "^7.18.6" - } + "@babel/parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz", + "integrity": "sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==" } } }, "@babel/traverse": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.10.tgz", - "integrity": "sha512-J7ycxg0/K9XCtLyHf0cz2DqDihonJeIo+z+HEdRe9YuT8TY4A66i+Ab2/xZCEW7Ro60bPCBBfqqboHSamoV3+g==", - "devOptional": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.10", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.5.tgz", + "integrity": "sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==", + "requires": { + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5", "debug": "^4.1.0", "globals": "^11.1.0" }, "dependencies": { - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "devOptional": true, + "@babel/generator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.5.tgz", + "integrity": "sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==", "requires": { - "@babel/highlight": "^7.18.6" + "@babel/types": "^7.22.5", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" } + }, + "@babel/parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz", + "integrity": "sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==" } } }, "@babel/types": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.10.tgz", - "integrity": "sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ==", - "devOptional": true, + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", + "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", "requires": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", "to-fast-properties": "^2.0.0" } }, @@ -747,6 +542,33 @@ "kuler": "^2.0.0" } }, + "@emotion/is-prop-valid": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", + "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", + "dev": true, + "requires": { + "@emotion/memoize": "0.7.4" + } + }, + "@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", + "dev": true + }, + "@emotion/stylis": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", + "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==", + "dev": true + }, + "@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==", + "dev": true + }, "@eslint/eslintrc": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", @@ -764,15 +586,53 @@ "strip-json-comments": "^3.1.1" }, "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "dev": true, "requires": { "type-fest": "^0.20.2" } }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, "type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -781,11 +641,18 @@ } } }, + "@exodus/schemasafe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@exodus/schemasafe/-/schemasafe-1.0.1.tgz", + "integrity": "sha512-PQdbF8dGd4LnbwBlcc4ML8RKYdplm+e9sUeWBTr4zgF13/Shiuov9XznvM4T8cb1CfyKK21yTUkuAIIh/DAH/g==", + "dev": true + }, "@f5devcentral/atg-shared-utilities": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@f5devcentral/atg-shared-utilities/-/atg-shared-utilities-0.5.7.tgz", - "integrity": "sha512-kbOJoR4yjTxEF5TkWNdnMEGxBPq5QcAf1j0KkoUPtoYuj7GPQhwof4tg9peaVAYgE+AztXD1hC0jPlGBphJ6Kw==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@f5devcentral/atg-shared-utilities/-/atg-shared-utilities-0.8.0.tgz", + "integrity": "sha512-m/fMz7jCwaSX0OwCk87573VdmFAO+Uw8acebzoPXAppnYJaw3ToSN67qqlA/aLXoSJiI5Dgn9YPiChkAIhI7bQ==", "requires": { + "big-integer": "^1.6.51", "error": "7.2.1", "jaeger-client": "^3.18.1" } @@ -797,11 +664,22 @@ "dev": true }, "@f5devcentral/atg-storage": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/@f5devcentral/atg-storage/-/atg-storage-1.3.8.tgz", - "integrity": "sha512-X8FzgiP96Fbg1Eo9SS9Ue1zuu94PSO2hzEODFbC37X2mDojR/ZlaE8yAy576luuAq6CVhiP0HmFO4DGOqwVVjg==", + "version": "1.3.9", + "resolved": "https://registry.npmjs.org/@f5devcentral/atg-storage/-/atg-storage-1.3.9.tgz", + "integrity": "sha512-50+q1gHlGSoCmsey+lrMbcW3NnWoiUv3aYPqAgVHBWAf3OXqOG8ppUJ8hC2RsOpevOkxuHDs1q5VQDBeOwY0Gg==", "requires": { - "@f5devcentral/atg-shared-utilities": "^0.5.1" + "@f5devcentral/atg-shared-utilities": "^0.6.0" + }, + "dependencies": { + "@f5devcentral/atg-shared-utilities": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@f5devcentral/atg-shared-utilities/-/atg-shared-utilities-0.6.0.tgz", + "integrity": "sha512-KFa6XhHefQecSdMBKW0HpLpGbbSMrEgV4il60ZznkSfM2eM58LVsysP6jP99Qsp2jtKnV19xSx+b7EB46h93oQ==", + "requires": { + "error": "7.2.1", + "jaeger-client": "^3.18.1" + } + } } }, "@f5devcentral/eslint-config-f5-atg": { @@ -815,11 +693,11 @@ } }, "@f5devcentral/f5-teem": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@f5devcentral/f5-teem/-/f5-teem-1.5.0.tgz", - "integrity": "sha512-ouASCuXrb55JRD3S6hn8GWRiBxQ4uPkr90E4iKnPgovS/AtW8n0hU32PdylUA6TGKmCgaOn3vwAtQcC+M9s7Jg==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@f5devcentral/f5-teem/-/f5-teem-1.6.1.tgz", + "integrity": "sha512-ovQ/2kFtv5Bf5OyP/rxGAO8hBno4xzSiaK17zCYJOznItUoMmmt/8JU8BapdHQQaBvrdHrggIEpk925nlRJP/A==", "requires": { - "@f5devcentral/atg-storage": "^1.0.3", + "@f5devcentral/atg-storage": "^1.3.9", "uuid": "^3.4.0" } }, @@ -832,6 +710,27 @@ "@humanwhocodes/object-schema": "^1.2.0", "debug": "^4.1.1", "minimatch": "^3.0.4" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } } }, "@humanwhocodes/object-schema": { @@ -840,7 +739,35 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, - "@istanbuljs/load-nyc-config": { + "@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "requires": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "requires": { + "ansi-regex": "^6.0.1" + } + } + } + }, + "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", @@ -853,11 +780,14 @@ "resolve-from": "^5.0.0" }, "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } }, "find-up": { "version": "4.1.0", @@ -869,6 +799,16 @@ "path-exists": "^4.0.0" } }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -896,12 +836,6 @@ "p-limit": "^2.2.0" } }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -917,66 +851,44 @@ "dev": true }, "@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "devOptional": true, + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" } }, "@jridgewell/resolve-uri": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "devOptional": true + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" }, "@jridgewell/set-array": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "devOptional": true - }, - "@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "optional": true, - "peer": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "optional": true, - "peer": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } - } + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" }, "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "devOptional": true + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "devOptional": true, + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", "requires": { "@jridgewell/resolve-uri": "3.1.0", "@jridgewell/sourcemap-codec": "1.4.14" + }, + "dependencies": { + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + } } }, "@jsdevtools/ono": { @@ -985,30 +897,96 @@ "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", "dev": true }, - "@postman/form-data": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@postman/form-data/-/form-data-3.1.1.tgz", - "integrity": "sha512-vjh8Q2a8S6UCm/KKs31XFJqEEgmbjBmpPNVV2eVav6905wyFAwaUOBGA1NPBI4ERH9MMZc6w0umFgM6WbEPMdg==", + "@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true + }, + "@redocly/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-9GWx27t7xWhDIR02PA18nzBdLcKQRgc46xNQvjFkrYk4UOmvKhJ/dawwiX0cCOeetN5LcaaiqQbVOWYK62SGHw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "@redocly/cli": { + "version": "1.0.0-beta.128", + "resolved": "https://registry.npmjs.org/@redocly/cli/-/cli-1.0.0-beta.128.tgz", + "integrity": "sha512-+IDgJtPx9i31cV0FU1gG28fI9/LrV7KnCGmF/NK6GB5xbM7wb9MMp9ol8+j05t21/AY7iXAUmJtbQaCHBllkLw==", "dev": true, "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "@redocly/openapi-core": "1.0.0-beta.128", + "assert-node-version": "^1.0.3", + "chokidar": "^3.5.1", + "colorette": "^1.2.0", + "glob": "^7.1.6", + "glob-promise": "^3.4.0", + "handlebars": "^4.7.6", + "mobx": "^6.3.2", + "portfinder": "^1.0.26", + "react": "^17.0.1", + "react-dom": "^17.0.1", + "redoc": "~2.0.0", + "semver": "^7.5.1", + "simple-websocket": "^9.0.0", + "styled-components": "5.3.3", + "yargs": "17.0.1" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } } }, - "@postman/tunnel-agent": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@postman/tunnel-agent/-/tunnel-agent-0.6.3.tgz", - "integrity": "sha512-k57fzmAZ2PJGxfOA4SGR05ejorHbVAa/84Hxh/2nAztjNXc4ZjOm9NUIk6/Z6LCrBvJZqjRZbN8e/nROVUPVdg==", + "@redocly/openapi-core": { + "version": "1.0.0-beta.128", + "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.0.0-beta.128.tgz", + "integrity": "sha512-3tubjnSOuC/1QQ8NnOFMTudA4pwbWnVJXB64JYNgiE99cTQS+90wehvQiV71XHQMC9/+rPvt4Ft7GXw75hFoNQ==", "dev": true, "requires": { - "safe-buffer": "^5.0.1" + "@redocly/ajv": "^8.11.0", + "@types/node": "^14.11.8", + "colorette": "^1.2.0", + "js-levenshtein": "^1.1.6", + "js-yaml": "^4.1.0", + "lodash.isequal": "^4.5.0", + "minimatch": "^5.0.1", + "node-fetch": "^2.6.1", + "pluralize": "^8.0.0", + "yaml-ast-parser": "0.0.43" } }, "@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", "dev": true, "requires": { "type-detect": "4.0.8" @@ -1042,25 +1020,25 @@ "dev": true }, "@stryker-mutator/api": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/@stryker-mutator/api/-/api-6.4.2.tgz", - "integrity": "sha512-b9+h5lC2gdtjALUuu0FvcFCwaja7BVzYwmiR5JkQXr8sMtL3rcaYrX4wfI1uHmPqwx9wwjLKpn+FVuyc69IyuQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@stryker-mutator/api/-/api-7.0.2.tgz", + "integrity": "sha512-JGoMBMU8vZJPM0PA3gFiD7gqF9RKSlY7eHaAzbH6OtwerzAFb1NBj7Rsg2dvIyFnglxqNbFAYLdv4ZPJNNkRxQ==", "optional": true, "requires": { - "mutation-testing-metrics": "1.7.14", - "mutation-testing-report-schema": "1.7.14", + "mutation-testing-metrics": "2.0.1", + "mutation-testing-report-schema": "2.0.1", "tslib": "~2.5.0" } }, "@stryker-mutator/core": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/@stryker-mutator/core/-/core-6.4.2.tgz", - "integrity": "sha512-ftT7G9FwVItpY/sntQWX/Leh3jwPWRcF8tsTeSjiPkEre7gBYegjKgPoUsR4It6KSZE9HZW8ezqUyWTOI9qhzQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@stryker-mutator/core/-/core-7.0.2.tgz", + "integrity": "sha512-noebN7Ir+xsTgJvC0aFfxVwKv6A/+HQwPdjJvIKGoL1NATqAZ+ELVw2neoH9HZE9AaYE26OW5h61KylFyRP5TQ==", "optional": true, "requires": { - "@stryker-mutator/api": "6.4.2", - "@stryker-mutator/instrumenter": "6.4.2", - "@stryker-mutator/util": "6.4.2", + "@stryker-mutator/api": "7.0.2", + "@stryker-mutator/instrumenter": "7.0.2", + "@stryker-mutator/util": "7.0.2", "ajv": "~8.12.0", "chalk": "~5.2.0", "commander": "~10.0.0", @@ -1068,25 +1046,24 @@ "emoji-regex": "~10.2.1", "execa": "~7.1.0", "file-url": "~4.0.0", - "get-port": "~6.1.0", - "glob": "~9.3.0", - "inquirer": "~9.1.0", + "get-port": "~7.0.0", + "glob": "~10.2.6", + "inquirer": "~9.2.0", "lodash.flatmap": "~4.5.0", "lodash.groupby": "~4.6.0", "log4js": "~6.9.0", - "minimatch": "~7.4.2", - "mutation-testing-elements": "1.7.14", - "mutation-testing-metrics": "1.7.14", - "mutation-testing-report-schema": "1.7.14", + "minimatch": "~9.0.1", + "mutation-testing-elements": "2.0.1", + "mutation-testing-metrics": "2.0.1", + "mutation-testing-report-schema": "2.0.1", "npm-run-path": "~5.1.0", "progress": "~2.0.0", - "rimraf": "~4.4.0", "rxjs": "~7.8.0", "semver": "^7.3.5", "source-map": "~0.7.3", "tree-kill": "~1.2.2", - "tslib": "~2.5.0", - "typed-inject": "~3.0.0", + "tslib": "2.5.3", + "typed-inject": "~4.0.0", "typed-rest-client": "~1.8.0" }, "dependencies": { @@ -1102,124 +1079,111 @@ "uri-js": "^4.2.2" } }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "optional": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", - "optional": true - }, "commander": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz", - "integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "optional": true }, - "emoji-regex": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.2.1.tgz", - "integrity": "sha512-97g6QgOk8zlDRdgq1WxwgTMgEWGVAQvB5Fdpgc1MkNy56la5SKP9GsMXKDOdqwn90/41a8yPwIGk1Y6WVbeMQA==", - "optional": true + "foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "optional": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + } }, "glob": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.2.tgz", - "integrity": "sha512-BTv/JhKXFEHsErMte/AnfiSv8yYOLLiyH2lTg8vn02O21zWFgHPTfxtgn1QRe7NRgggUhC8hacR2Re94svHqeA==", + "version": "10.2.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.7.tgz", + "integrity": "sha512-jTKehsravOJo8IJxUGfZILnkvVJM/MOfHRs8QcXolVef2zNI9Tqyy5+SeuOAZd3upViEZQLyFpQhYiHLrMUNmA==", "optional": true, "requires": { - "fs.realpath": "^1.0.0", - "minimatch": "^7.4.1", - "minipass": "^4.2.4", - "path-scurry": "^1.6.1" + "foreground-child": "^3.1.0", + "jackspeak": "^2.0.3", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2", + "path-scurry": "^1.7.0" } }, - "minimatch": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.3.tgz", - "integrity": "sha512-5UB4yYusDtkRPbRiy1cqZ1IpGNcJCGlEMG17RKzPddpyiPKoCdwohbED8g4QXT0ewCt8LTkQXuljsUfQ3FKM4A==", + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "optional": true, "requires": { - "brace-expansion": "^2.0.1" + "yallist": "^4.0.0" } }, - "rimraf": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", - "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", + "minimatch": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", + "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", "optional": true, "requires": { - "glob": "^9.2.0" + "brace-expansion": "^2.0.1" } }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "optional": true, "requires": { "lru-cache": "^6.0.0" } + }, + "signal-exit": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz", + "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==", + "optional": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "optional": true } } }, "@stryker-mutator/instrumenter": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/@stryker-mutator/instrumenter/-/instrumenter-6.4.2.tgz", - "integrity": "sha512-rNX7XHtXE/WjtoK3hK7oga0BNObNcqGk3l7W1VVLpUqCwX3SkWNG6DcT68gp3g1/Ha+4ty7aSlVS/cPzHt/3lQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@stryker-mutator/instrumenter/-/instrumenter-7.0.2.tgz", + "integrity": "sha512-jbj8v6leiJrYYztvg6oPlAAoNQANtuwedyOBZYPwrr7RPilc80zvnk21+26zhP4XHJRzikeNtDmxx/QHhATjRQ==", "optional": true, "requires": { - "@babel/core": "~7.21.0", - "@babel/generator": "~7.21.0", - "@babel/parser": "~7.21.0", + "@babel/core": "~7.22.0", + "@babel/generator": "~7.22.0", + "@babel/parser": "~7.22.0", "@babel/plugin-proposal-class-properties": "~7.18.0", - "@babel/plugin-proposal-decorators": "~7.21.0", + "@babel/plugin-proposal-decorators": "~7.22.0", "@babel/plugin-proposal-private-methods": "~7.18.0", "@babel/preset-typescript": "~7.21.0", - "@stryker-mutator/api": "6.4.2", - "@stryker-mutator/util": "6.4.2", + "@stryker-mutator/api": "7.0.2", + "@stryker-mutator/util": "7.0.2", "angular-html-parser": "~4.0.0", - "weapon-regex": "~1.0.2" + "weapon-regex": "~1.1.0" }, "dependencies": { - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "optional": true, - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/compat-data": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz", - "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==", - "optional": true - }, "@babel/core": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.3.tgz", - "integrity": "sha512-qIJONzoa/qiHghnm0l1n4i/6IIziDpzqc36FBs4pzMhDUraHqponwJLiAKm1hGLP3OSB/TVNz6rMwVGpwxxySw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz", + "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==", "optional": true, "requires": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.3", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.3", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.3", - "@babel/types": "^7.21.3", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helpers": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -1228,228 +1192,66 @@ } }, "@babel/generator": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.3.tgz", - "integrity": "sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.5.tgz", + "integrity": "sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==", "optional": true, "requires": { - "@babel/types": "^7.21.3", + "@babel/types": "^7.22.5", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" } }, - "@babel/helper-compilation-targets": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", - "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", - "optional": true, - "requires": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" - } - }, - "@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", - "optional": true, - "requires": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" - } - }, - "@babel/helper-module-transforms": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", - "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", - "optional": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" - } - }, - "@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", - "optional": true, - "requires": { - "@babel/types": "^7.20.2" - } - }, - "@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", - "optional": true - }, - "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "optional": true - }, - "@babel/helpers": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", - "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", - "optional": true, - "requires": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0" - } - }, "@babel/parser": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz", - "integrity": "sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==", - "optional": true - }, - "@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", - "optional": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" - } - }, - "@babel/traverse": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.3.tgz", - "integrity": "sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ==", - "optional": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.3", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.3", - "@babel/types": "^7.21.3", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.3.tgz", - "integrity": "sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg==", - "optional": true, - "requires": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - } - }, - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "optional": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz", + "integrity": "sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==", "optional": true }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "optional": true, - "requires": { - "yallist": "^3.0.2" - } - }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "optional": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "optional": true } } }, "@stryker-mutator/mocha-runner": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/@stryker-mutator/mocha-runner/-/mocha-runner-6.4.2.tgz", - "integrity": "sha512-5BLwBVmEmDqOD4EYUAdCrA0zXZ8Xl0AwqbG9erbhmatEouWqiqhqtCbgoqLy0Y0m4BBJrBUq2bDTGdn6jTunrw==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@stryker-mutator/mocha-runner/-/mocha-runner-7.0.2.tgz", + "integrity": "sha512-m/CkbhETp7Ah143SOTUTzk+7W2MvQtqeAayA+60BzEtlmUH3dA0LKUqaken0sZLy2NdijsaC92dXlIRbjTvl0g==", "optional": true, "requires": { - "@stryker-mutator/api": "6.4.2", - "@stryker-mutator/util": "6.4.2", + "@stryker-mutator/api": "7.0.2", + "@stryker-mutator/util": "7.0.2", "tslib": "~2.5.0" } }, "@stryker-mutator/util": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/@stryker-mutator/util/-/util-6.4.2.tgz", - "integrity": "sha512-L6lf2JddgLS3D8cIN7FxxkRPmZ0PF48sdvn5TPnDhwZ7/1IXRXolzJFtXhQinRnDu6SyKGSJcwNOeJXyCcmuLQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@stryker-mutator/util/-/util-7.0.2.tgz", + "integrity": "sha512-g58UI2fPkomPtyFcJIedrP0DwTGDqIH5xZ6QSfmU+/yHZ8tpbFdJl7ADLakASw+DSSP/G770uQND3zrctIaPDA==", "optional": true, "requires": { "lodash.flatmap": "~4.5.0" } }, - "@types/eslint": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.37.0.tgz", - "integrity": "sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ==", - "optional": true, - "peer": true, - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "optional": true, - "peer": true, + "@types/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==", + "dev": true, "requires": { - "@types/eslint": "*", - "@types/estree": "*" + "@types/minimatch": "^5.1.2", + "@types/node": "*" } }, - "@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "optional": true, - "peer": true - }, "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "devOptional": true + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true }, "@types/json5": { "version": "0.0.29", @@ -1457,197 +1259,23 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, - "@types/node": { - "version": "18.15.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz", - "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==", - "optional": true, - "peer": true - }, - "@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "optional": true, - "peer": true, - "requires": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", - "optional": true, - "peer": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", - "optional": true, - "peer": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", - "optional": true, - "peer": true - }, - "@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "optional": true, - "peer": true, - "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", - "optional": true, - "peer": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "optional": true, - "peer": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "optional": true, - "peer": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "optional": true, - "peer": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", - "optional": true, - "peer": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "optional": true, - "peer": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "optional": true, - "peer": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "optional": true, - "peer": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "optional": true, - "peer": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "optional": true, - "peer": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "optional": true, - "peer": true + "@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "optional": true, - "peer": true + "@types/node": { + "version": "14.18.48", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.48.tgz", + "integrity": "sha512-iL0PIMwejpmuVHgfibHpfDwOdsbmB50wr21X71VnF5d7SsBF7WK+ZvP/SCcFm7Iwb9iiYSap9rlrdhToNAWdxg==", + "dev": true }, - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } + "@types/triple-beam": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.2.tgz", + "integrity": "sha512-txGIh+0eDFzKGC25zORnswy+br1Ha7hj5cMVwKIU7+s0U2AxxJru/jZSMU6OC9MJWP6+pc/hc6ZjyZShpsyY2g==", + "dev": true }, "acorn": { "version": "7.4.1", @@ -1659,8 +1287,7 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} + "dev": true }, "aggregate-error": { "version": "3.1.0", @@ -1690,14 +1317,6 @@ } } }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "optional": true, - "peer": true, - "requires": {} - }, "angular-html-parser": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/angular-html-parser/-/angular-html-parser-4.0.1.tgz", @@ -1720,34 +1339,32 @@ "dev": true }, "ansi-escapes": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.1.0.tgz", - "integrity": "sha512-bQyg9bzRntwR/8b89DOEhGwctcwCrbWW/TuqTQnpqpy5Fz3aovcOTj5i8NJV6AHc8OGNdMaqdxAWww8pz2kiKg==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "optional": true, "requires": { - "type-fest": "^3.0.0" + "type-fest": "^0.21.3" } }, "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "devOptional": true + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "devOptional": true, + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { - "color-convert": "^1.9.0" + "color-convert": "^2.0.1" } }, "anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "devOptional": true, + "dev": true, "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -1769,20 +1386,21 @@ "dev": true }, "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + } + }, "array-from": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", @@ -1800,25 +1418,6 @@ "es-abstract": "^1.20.4", "get-intrinsic": "^1.1.3", "is-string": "^1.0.7" - }, - "dependencies": { - "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - } } }, "array.prototype.flat": { @@ -1833,20 +1432,27 @@ "es-shim-unscopables": "^1.0.0" } }, - "asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", "dev": true, "requires": { - "safer-buffer": "~2.1.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" } }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "dev": true + "assert-node-version": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/assert-node-version/-/assert-node-version-1.0.3.tgz", + "integrity": "sha512-XcKBGJ1t0RrCcus9dQX57FER4PTEz/+Tee2jj+EdFIGyw5j8hwDNXZzgRYLQ916twVjSuA47adrZsSxLbpEX9A==", + "dev": true, + "requires": { + "expected-node-version": "^1.0.0", + "semver": "^5.0.3" + } }, "assertion-error": { "version": "1.1.0", @@ -1861,16 +1467,13 @@ "dev": true }, "async": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", - "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } }, "available-typed-arrays": { "version": "1.0.5", @@ -1879,9 +1482,9 @@ "dev": true }, "aws-sdk": { - "version": "2.1346.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1346.0.tgz", - "integrity": "sha512-sLN7DUQ4KGkVCRN9uU5amz+k5qj5HFdwq0itH7WLtFGG63/vG/HnrqHj1G0PyMij0Zz6CGlRBACstWRm0niYhQ==", + "version": "2.1396.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1396.0.tgz", + "integrity": "sha512-5tAzB4pO9mfwb4XbDIv7wj4IsxaLI+KEAUZ8CR80sh2OdsP9AVGtMGH61dH6DQbHxCiwtLyQuoy7gZEuXv2ldQ==", "dev": true, "requires": { "buffer": "4.9.2", @@ -1893,26 +1496,9 @@ "url": "0.10.3", "util": "^0.12.4", "uuid": "8.0.0", - "xml2js": "0.4.19" + "xml2js": "0.5.0" }, "dependencies": { - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", - "dev": true - }, "sax": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", @@ -1926,179 +1512,125 @@ "dev": true }, "xml2js": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", - "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", "dev": true, "requires": { "sax": ">=0.6.0", - "xmlbuilder": "~9.0.1" + "xmlbuilder": "~11.0.0" } - }, - "xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha512-7YXTQc3P2l9+0rjaUbLwMKRhtmwg1M1eDf6nag7urC7pIPYLD9W/jmzQ4ptRSUbodw5S0jfoGTflLemQibSpeQ==", - "dev": true } } }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "dev": true + "babel-plugin-styled-components": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.1.3.tgz", + "integrity": "sha512-jBioLwBVHpOMU4NsueH/ADcHrjS0Y/WTpt2eGVmmuSFNEv2DF3XhcMncuZlbbjxQ4vzxg+yEr6E6TNjrIQbsJQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-module-imports": "^7.21.4", + "babel-plugin-syntax-jsx": "^6.18.0", + "lodash": "^4.17.21", + "picomatch": "^2.3.1" + } }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw==", "dev": true }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "devOptional": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "devOptional": true + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } + "big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==" }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "devOptional": true + "dev": true }, "bl": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", - "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "optional": true, "requires": { - "buffer": "^6.0.3", + "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" - } - }, - "bluebird": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", - "integrity": "sha512-UfFSr22dmHPQqPP9XWHRhq+gWnHCYguQGkXQlbyPtW5qTnhFWA8/iXg765tH0cAjy7l/zPJ1aBTO0g5XgA7kvQ==", - "dev": true - }, - "body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dev": true, - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "optional": true, "requires": { - "ms": "2.0.0" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true } } }, "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "devOptional": true, + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^1.0.0" } }, "braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "devOptional": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "brotli": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz", - "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==", "dev": true, "requires": { - "base64-js": "^1.1.2" + "fill-range": "^7.0.1" } }, "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "devOptional": true + "dev": true }, "browserslist": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", - "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", - "devOptional": true, + "version": "4.21.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.7.tgz", + "integrity": "sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA==", "requires": { - "caniuse-lite": "^1.0.30001370", - "electron-to-chromium": "^1.4.202", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.5" + "caniuse-lite": "^1.0.30001489", + "electron-to-chromium": "^1.4.411", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" } }, "buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "optional": true, + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" } }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "optional": true, - "peer": true - }, "bufrw": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/bufrw/-/bufrw-1.3.0.tgz", @@ -2111,12 +1643,6 @@ "xtend": "^4.0.0" } }, - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true - }, "caching-transform": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", @@ -2133,16 +1659,15 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "devOptional": true, "requires": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" } }, "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha512-wCyFsDQkKPwwF8BDwOiWNx/9K45L/hvggQiDbve+viMNMQnWhrlYIuBk09offfwCRtCO9P6XwUttufzU11WCVw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", "dev": true }, "callsites": { @@ -2152,23 +1677,22 @@ "dev": true }, "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "devOptional": true - }, - "caniuse-lite": { - "version": "1.0.30001373", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001373.tgz", - "integrity": "sha512-pJYArGHrPp3TUqQzFYRmP/lwJlj8RCbVe3Gd3eJQkAV8SAC6b19XS9BjMvRdvaS8RMkaTN8ZhoHP6S1y8zzwEQ==", - "devOptional": true + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "camelize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", "dev": true }, + "caniuse-lite": { + "version": "1.0.30001497", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001497.tgz", + "integrity": "sha512-I4/duVK4wL6rAK/aKZl3HXB4g+lIZvaT4VLAn2rCgJ38jVLb0lv2Xug6QuqmxXFVRJMF74SPPWPJ/1Sdm3vCzw==" + }, "chai": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", @@ -2194,55 +1718,10 @@ } }, "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "devOptional": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "devOptional": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "devOptional": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "devOptional": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "devOptional": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "devOptional": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", + "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "optional": true }, "chardet": { "version": "0.7.0", @@ -2250,12 +1729,6 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "optional": true }, - "charset": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/charset/-/charset-1.0.1.tgz", - "integrity": "sha512-6dVyOOYjpfFcL1Y4qChrAoQLRHvj2ziyhcm0QJlhOcAhykL/k1kTUPbeo+87MNRTRdk2OIIsIXbuF3x2wi5EXg==", - "dev": true - }, "check-error": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", @@ -2266,7 +1739,7 @@ "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "devOptional": true, + "dev": true, "requires": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -2278,12 +1751,11 @@ "readdirp": "~3.6.0" } }, - "chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "optional": true, - "peer": true + "classnames": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==", + "dev": true }, "clean-stack": { "version": "2.2.0", @@ -2292,39 +1764,20 @@ "dev": true }, "cli-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "optional": true, "requires": { - "restore-cursor": "^4.0.0" - } - }, - "cli-progress": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.10.0.tgz", - "integrity": "sha512-kLORQrhYCAtUPLZxqsAt2YJGOvRdt34+O6jl5cQGb7iF3dM55FQZlTR+rQyIK9JUcO9bBMwZsTlND+3dmFU2Cw==", - "dev": true, - "requires": { - "string-width": "^4.2.0" + "restore-cursor": "^3.1.0" } }, "cli-spinners": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz", - "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz", + "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==", "optional": true }, - "cli-table3": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.1.tgz", - "integrity": "sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA==", - "dev": true, - "requires": { - "colors": "1.4.0", - "string-width": "^4.2.0" - } - }, "cli-width": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.0.0.tgz", @@ -2335,11 +1788,41 @@ "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "devOptional": true, + "dev": true, "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } } }, "clone": { @@ -2348,6 +1831,12 @@ "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "optional": true }, + "clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "dev": true + }, "color": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", @@ -2356,22 +1845,37 @@ "requires": { "color-convert": "^1.9.3", "color-string": "^1.6.0" + }, + "dependencies": { + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + } } }, "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "devOptional": true, + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "requires": { - "color-name": "1.1.3" + "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "devOptional": true + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "color-string": { "version": "1.9.1", @@ -2383,10 +1887,10 @@ "simple-swizzle": "^0.2.2" } }, - "colors": { + "colorette": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", "dev": true }, "colorspace": { @@ -2399,19 +1903,10 @@ "text-hex": "1.0.x" } }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, "commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", + "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", "dev": true }, "commondir": { @@ -2424,7 +1919,7 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "devOptional": true + "dev": true }, "confusing-browser-globals": { "version": "1.0.11", @@ -2432,80 +1927,36 @@ "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", "dev": true }, - "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "requires": { - "safe-buffer": "5.2.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true - }, "convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "devOptional": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "devOptional": true, "requires": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, - "csv-parse": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-4.16.3.tgz", - "integrity": "sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==", + "css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", "dev": true }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "css-to-react-native": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", + "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", "dev": true, "requires": { - "assert-plus": "^1.0.0" + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" } }, "date-format": { @@ -2515,19 +1966,24 @@ "optional": true }, "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "devOptional": true, + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } }, "decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "devOptional": true + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true + }, + "decko": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decko/-/decko-1.2.0.tgz", + "integrity": "sha512-m8FnyHXV1QX+S1cl+KPFDIl6NMkxtKsy6+U/aYyjrOqWMuwAwYWu7ePqrsUHtDR5Y8Yk2pi/KIDSgF+vT4cPOQ==", + "dev": true }, "deep-diff": { "version": "1.0.2", @@ -2535,9 +1991,9 @@ "integrity": "sha512-aWS3UIVH+NPGCD1kki+DCU9Dua032iSsO43LqQpcs4R3+dVv7tX0qBGjiVHJHjplsoUM2XRO/KB92glqc68awg==" }, "deep-eql": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.2.tgz", - "integrity": "sha512-gT18+YW4CcW/DBNTwAmqTtkJh7f9qqScu2qFVlx7kCoeY9tlBu9cUcr7+I+Z/noG8INehS3xQgLpTtd/QUTn4w==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", "dev": true, "requires": { "type-detect": "^4.0.0" @@ -2564,20 +2020,12 @@ "dev": true }, "default-require-extensions": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", - "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", + "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", "dev": true, "requires": { "strip-bom": "^4.0.0" - }, - "dependencies": { - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - } } }, "defaults": { @@ -2590,38 +2038,20 @@ } }, "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", "dev": true, "requires": { "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true - }, "diff": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "devOptional": true + "dev": true }, "diff-match-patch": { "version": "1.0.5", @@ -2630,47 +2060,35 @@ "optional": true }, "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "requires": { "esutils": "^2.0.2" } }, + "dompurify": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.5.tgz", + "integrity": "sha512-jggCCd+8Iqp4Tsz0nIvpcb22InKEBrGz5dw3EQJMs8HPJDsKbFIO3STYtAvCfDx26Muevn1MHVI0XxjgFfmiSA==", + "dev": true + }, "eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "optional": true - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" }, "electron-to-chromium": { - "version": "1.4.209", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.209.tgz", - "integrity": "sha512-SfWI9G/e3rxGIUalHbUCH9yEsTpO+72y+cD1Sw0tYtuTrdOPaFAgZKXM1crWVJwTNmj6KIPbbx0NIoV8a2cFJw==", - "devOptional": true + "version": "1.4.426", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.426.tgz", + "integrity": "sha512-dWuNH+XUT9hdFHASfMpcZGW5kUyJvllumJkXaXiswuCkoaFIFI89aykBPuHEi1YUWQGRCqvIO0BUdmeFJ4W4Ww==" }, "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "devOptional": true + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.2.1.tgz", + "integrity": "sha512-97g6QgOk8zlDRdgq1WxwgTMgEWGVAQvB5Fdpgc1MkNy56la5SKP9GsMXKDOdqwn90/41a8yPwIGk1Y6WVbeMQA==", + "optional": true }, "enabled": { "version": "2.0.0", @@ -2678,23 +2096,6 @@ "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", "dev": true }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true - }, - "enhanced-resolve": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", - "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", - "optional": true, - "peer": true, - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - }, "enquirer": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", @@ -2714,17 +2115,18 @@ } }, "es-abstract": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.0.tgz", - "integrity": "sha512-GUGtW7eXQay0c+PRq0sGIKSdaBorfVqsCMhGHo4elP7YVqZu9nCZS4UkK4gv71gOWNMra/PaSKD3ao1oWExO0g==", + "version": "1.21.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", + "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", "dev": true, "requires": { + "array-buffer-byte-length": "^1.0.0", + "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.0", + "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", + "get-intrinsic": "^1.2.0", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", @@ -2732,8 +2134,8 @@ "has-property-descriptors": "^1.0.0", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.4", - "is-array-buffer": "^3.0.0", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", @@ -2741,50 +2143,19 @@ "is-string": "^1.0.7", "is-typed-array": "^1.1.10", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", + "object-inspect": "^1.12.3", "object-keys": "^1.1.1", "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", "string.prototype.trimend": "^1.0.6", "string.prototype.trimstart": "^1.0.6", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", "which-typed-array": "^1.1.9" - }, - "dependencies": { - "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "dev": true - } } }, - "es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "optional": true, - "peer": true - }, "es-set-tostringtag": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", @@ -2794,25 +2165,6 @@ "get-intrinsic": "^1.1.3", "has": "^1.0.3", "has-tostringtag": "^1.0.0" - }, - "dependencies": { - "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - } } }, "es-shim-unscopables": { @@ -2841,23 +2193,22 @@ "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "dev": true }, + "es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", + "dev": true + }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "devOptional": true - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "devOptional": true + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true }, "eslint": { "version": "7.32.0", @@ -2907,44 +2258,110 @@ "v8-compile-cache": "^2.0.3" }, "dependencies": { - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", "dev": true, "requires": { - "esutils": "^2.0.2" + "@babel/highlight": "^7.10.4" } }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } }, "globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "dev": true, "requires": { "type-fest": "^0.20.2" } }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "requires": { "lru-cache": "^6.0.0" } }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, "type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true } } }, @@ -2969,13 +2386,14 @@ } }, "eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", + "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", "dev": true, "requires": { "debug": "^3.2.7", - "resolve": "^1.20.0" + "is-core-module": "^2.11.0", + "resolve": "^1.22.1" }, "dependencies": { "debug": { @@ -2990,9 +2408,9 @@ } }, "eslint-module-utils": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", - "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", "dev": true, "requires": { "debug": "^3.2.7" @@ -3010,39 +2428,69 @@ } }, "eslint-plugin-import": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", - "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", + "version": "2.27.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", + "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", "dev": true, "requires": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.3", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.7.4", "has": "^1.0.3", - "is-core-module": "^2.8.1", + "is-core-module": "^2.11.0", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.values": "^1.1.5", - "resolve": "^1.22.0", + "object.values": "^1.1.6", + "resolve": "^1.22.1", + "semver": "^6.3.0", "tsconfig-paths": "^3.14.1" }, "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } @@ -3051,7 +2499,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "devOptional": true, + "dev": true, "requires": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -3106,9 +2554,9 @@ "dev": true }, "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "requires": { "estraverse": "^5.1.0" @@ -3126,7 +2574,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "devOptional": true, + "dev": true, "requires": { "estraverse": "^5.2.0" }, @@ -3135,7 +2583,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "devOptional": true + "dev": true } } }, @@ -3143,7 +2591,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "devOptional": true + "dev": true }, "esutils": { "version": "2.0.3", @@ -3151,12 +2599,6 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true - }, "eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", @@ -3184,88 +2626,12 @@ "onetime": "^6.0.0", "signal-exit": "^3.0.7", "strip-final-newline": "^3.0.0" - }, - "dependencies": { - "is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "optional": true - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "optional": true - } - } - }, - "express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dev": true, - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } } }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "expected-node-version": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/expected-node-version/-/expected-node-version-1.0.2.tgz", + "integrity": "sha512-OSaCdgF02srujDqJz1JWGpqk8Rq3uNYHLmtpBHJrZN3BvuMvzijJMqRVxZN1qLJtKVwjXhmOp+lfsRUqx8n54w==", "dev": true }, "external-editor": { @@ -3279,12 +2645,6 @@ "tmp": "^0.0.33" } }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "dev": true - }, "f5-schema-doc": { "version": "file:packages/f5-schema-doc-0.1.0.tgz", "integrity": "sha512-Y/wQIVYzY4X37QxuhAtst7KmDWp0RBIAeDlloxEs3F85nr/uEM/NmKEWnKfVj5+OJdjYNrrE4G8oPCZlRpjNkw==", @@ -3293,12 +2653,6 @@ "json-schema-ref-parser": "^9.0.7" } }, - "faker": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/faker/-/faker-5.5.3.tgz", - "integrity": "sha512-wLTv2a28wjUyWkbnX7u/ABZBkUkIF2fCd73V6P2oFqEGEktDfzWx4UxrSqtPRw0xPRAcjeAOIiJWqZm3pP4u3g==", - "dev": true - }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -3315,6 +2669,12 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true + }, "fecha": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", @@ -3336,12 +2696,6 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "optional": true - }, - "is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", - "optional": true } } }, @@ -3354,24 +2708,12 @@ "flat-cache": "^3.0.4" } }, - "file-type": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", - "dev": true - }, "file-url": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/file-url/-/file-url-4.0.0.tgz", "integrity": "sha512-vRCdScQ6j3Ku6Kd7W1kZk9c++5SqD6Xz5Jotrjr/nkY714M14RFHy/AAVA2WQvpsqVAVgTbDrYyBpU205F0cLw==", "optional": true }, - "filesize": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", - "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", - "dev": true - }, "fill-keys": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/fill-keys/-/fill-keys-1.0.2.tgz", @@ -3386,41 +2728,9 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "devOptional": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "dev": true, "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } + "to-regex-range": "^5.0.1" } }, "find-cache-dir": { @@ -3438,7 +2748,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "devOptional": true, + "dev": true, "requires": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -3448,7 +2758,7 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "devOptional": true + "dev": true }, "flat-cache": { "version": "3.0.4", @@ -3472,10 +2782,9 @@ } }, "flatted": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz", - "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==", - "dev": true + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" }, "fn.name": { "version": "1.1.0", @@ -3492,6 +2801,12 @@ "is-callable": "^1.1.3" } }, + "foreach": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz", + "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==", + "dev": true + }, "foreground-child": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", @@ -3502,30 +2817,12 @@ "signal-exit": "^3.0.2" } }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "dev": true - }, "format-util": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/format-util/-/format-util-1.0.5.tgz", "integrity": "sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg==", "dev": true }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true - }, "fromentries": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", @@ -3547,19 +2844,19 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "devOptional": true + "dev": true }, "fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, "optional": true }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "devOptional": true + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "function.prototype.name": { "version": "1.1.5", @@ -3588,14 +2885,13 @@ "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "devOptional": true + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "devOptional": true + "dev": true }, "get-func-name": { "version": "2.0.0", @@ -3604,14 +2900,14 @@ "dev": true }, "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "devOptional": true, + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", - "has-symbols": "^1.0.1" + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" } }, "get-package-type": { @@ -3621,9 +2917,9 @@ "dev": true }, "get-port": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-6.1.2.tgz", - "integrity": "sha512-BrGGraKm2uPqurfGVj/z97/zv8dPleC6x9JBNRTrDNtCkkRF4rPwrQXFgL7+I+q8QSdU4ntLQX2D7KIxSy8nGw==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-7.0.0.tgz", + "integrity": "sha512-mDHFgApoQd+azgMdwylJrv2DX47ywGq1i5VFJE7fZ0dttNq3iQMfsU4IvEgBHojA3KqEudyu7Vq+oN8kNaNkWw==", "optional": true }, "get-stream": { @@ -3642,50 +2938,63 @@ "get-intrinsic": "^1.1.1" } }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "devOptional": true, + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } } }, "glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "devOptional": true, + "dev": true, "requires": { "is-glob": "^4.0.1" } }, - "glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "optional": true, - "peer": true + "glob-promise": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/glob-promise/-/glob-promise-3.4.0.tgz", + "integrity": "sha512-q08RJ6O+eJn+dVanerAndJwIcumgbDdYiUT7zFQl3Wm1xD6fBKtah7H8ZJChj4wP+8C+QfeVy8xautR7rdmKEw==", + "dev": true, + "requires": { + "@types/glob": "*" + } }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "devOptional": true + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, "globalthis": { "version": "1.0.3", @@ -3703,32 +3012,12 @@ "dev": true, "requires": { "get-intrinsic": "^1.1.3" - }, - "dependencies": { - "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - } } }, "graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "devOptional": true + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "handlebars": { "version": "4.7.7", @@ -3751,27 +3040,10 @@ } } }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "dev": true - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "dev": true, - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "devOptional": true, "requires": { "function-bind": "^1.1.1" } @@ -3783,10 +3055,9 @@ "dev": true }, "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "devOptional": true + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "has-property-descriptors": { "version": "1.0.0", @@ -3800,14 +3071,12 @@ "has-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" }, "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "devOptional": true + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" }, "has-tostringtag": { "version": "1.0.0", @@ -3828,6 +3097,12 @@ "type-fest": "^0.8.0" }, "dependencies": { + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, "type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", @@ -3840,7 +3115,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "devOptional": true + "dev": true }, "hexer": { "version": "1.5.0", @@ -3854,64 +3129,33 @@ "xtend": "^4.0.0" } }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "http-reasons": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/http-reasons/-/http-reasons-0.1.0.tgz", - "integrity": "sha512-P6kYh0lKZ+y29T2Gqz+RlC9WBLhKe8kDmcJ+A+611jFfxdPsbMRQ5aNmFRM3lENqFkK+HTTL+tlQviAiv0AbLQ==", - "dev": true - }, - "http-signature": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", - "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^2.0.2", - "sshpk": "^1.14.1" - } - }, - "httpntlm": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/httpntlm/-/httpntlm-1.7.7.tgz", - "integrity": "sha512-Pv2Rvrz8H0qv1Dne5mAdZ9JegG1uc6Vu5lwLflIY6s8RKHdZQbW39L4dYswSgqMDT0pkJILUTKjeyU0VPNRZjA==", + "hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", "dev": true, "requires": { - "httpreq": ">=0.4.22", - "underscore": "~1.12.1" + "react-is": "^16.7.0" }, "dependencies": { - "underscore": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", - "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true } } }, - "httpreq": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/httpreq/-/httpreq-0.5.2.tgz", - "integrity": "sha512-2Jm+x9WkExDOeFRrdBCBSpLPT5SokTcRHkunV3pjKmX/cx6av8zQ0WtHUMDrYb6O4hBFzNU6sxJEypvRUVYKnw==", + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "http2-client": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/http2-client/-/http2-client-1.3.5.tgz", + "integrity": "sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==", "dev": true }, "human-signals": { @@ -3924,16 +3168,15 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "devOptional": true, + "optional": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } }, "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "optional": true + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" }, "ignore": { "version": "4.0.6", @@ -3967,7 +3210,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "devOptional": true, + "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -3976,131 +3219,72 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "devOptional": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "inquirer": { - "version": "9.1.5", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.1.5.tgz", - "integrity": "sha512-3ygAIh8gcZavV9bj6MTdYddG2zPSYswP808fKS46NOwlF0zZljVpnLCHODDqItWJDbDpLb3aouAxGaJbkxoppA==", + "version": "9.2.7", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.7.tgz", + "integrity": "sha512-Bf52lnfvNxGPJPltiNO2tLBp3zC339KNlGMqOkW+dsvNikBhcVDK5kqU2lVX2FTPzuXUFX5WJDlsw//w3ZwoTw==", "optional": true, "requires": { - "ansi-escapes": "^6.0.0", + "ansi-escapes": "^4.3.2", "chalk": "^5.2.0", - "cli-cursor": "^4.0.0", + "cli-cursor": "^3.1.0", "cli-width": "^4.0.0", "external-editor": "^3.0.3", "figures": "^5.0.0", "lodash": "^4.17.21", "mute-stream": "1.0.0", - "ora": "^6.1.2", - "run-async": "^2.4.0", - "rxjs": "^7.8.0", - "string-width": "^5.1.2", - "strip-ansi": "^7.0.1", + "ora": "^5.4.1", + "run-async": "^3.0.0", + "rxjs": "^7.8.1", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", "through": "^2.3.6", - "wrap-ansi": "^8.1.0" + "wrap-ansi": "^6.0.1" }, "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "optional": true - }, - "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "optional": true - }, - "chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", - "optional": true - }, "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "optional": true }, "string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "optional": true, - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - } - }, - "strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "optional": true, "requires": { - "ansi-regex": "^6.0.1" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" } }, "wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "optional": true, "requires": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" } } } }, "internal-slot": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz", - "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", "dev": true, "requires": { - "get-intrinsic": "^1.1.3", + "get-intrinsic": "^1.2.0", "has": "^1.0.3", "side-channel": "^1.0.4" - }, - "dependencies": { - "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - } } }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==", - "dev": true - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true - }, "is-arguments": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", @@ -4112,33 +3296,14 @@ } }, "is-array-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz", - "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", "dev": true, "requires": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", + "get-intrinsic": "^1.2.0", "is-typed-array": "^1.1.10" - }, - "dependencies": { - "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - } } }, "is-arrayish": { @@ -4160,7 +3325,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "devOptional": true, + "dev": true, "requires": { "binary-extensions": "^2.0.0" } @@ -4182,9 +3347,9 @@ "dev": true }, "is-core-module": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", - "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", "dev": true, "requires": { "has": "^1.0.3" @@ -4203,13 +3368,12 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "devOptional": true + "dev": true }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "devOptional": true + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "is-generator-function": { "version": "1.0.10", @@ -4224,15 +3388,15 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "devOptional": true, + "dev": true, "requires": { "is-extglob": "^2.1.1" } }, "is-interactive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", - "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "optional": true }, "is-negative-zero": { @@ -4245,7 +3409,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "devOptional": true + "dev": true }, "is-number-object": { "version": "1.0.7", @@ -4266,7 +3430,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "devOptional": true + "dev": true }, "is-regex": { "version": "1.1.4", @@ -4288,10 +3452,10 @@ } }, "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "optional": true }, "is-string": { "version": "1.0.7", @@ -4331,10 +3495,10 @@ "dev": true }, "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "devOptional": true + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "optional": true }, "is-weakref": { "version": "1.0.2", @@ -4355,19 +3519,12 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "devOptional": true + "dev": true }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "devOptional": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "dev": true + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "istanbul-lib-coverage": { "version": "3.2.0", @@ -4446,12 +3603,6 @@ "supports-color": "^7.1.0" }, "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -4492,6 +3643,15 @@ "istanbul-lib-report": "^3.0.0" } }, + "jackspeak": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.1.tgz", + "integrity": "sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw==", + "requires": { + "@isaacs/cliui": "^8.0.2", + "@pkgjs/parseargs": "^0.11.0" + } + }, "jaeger-client": { "version": "3.19.0", "resolved": "https://registry.npmjs.org/jaeger-client/-/jaeger-client-3.19.0.tgz", @@ -4513,37 +3673,6 @@ } } }, - "jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "optional": true, - "peer": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "optional": true, - "peer": true - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "optional": true, - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, "jiff": { "version": "0.7.3", "resolved": "https://registry.npmjs.org/jiff/-/jiff-0.7.3.tgz", @@ -4555,63 +3684,69 @@ "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==", "dev": true }, - "js-sha512": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha512/-/js-sha512-0.8.0.tgz", - "integrity": "sha512-PWsmefG6Jkodqt+ePTvBZCSMFgN7Clckjd0O7su3I0+BW2QWUTJNzjktHsztGLhncP2h8mcF9V9Y2Ha59pAViQ==", + "js-levenshtein": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", + "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", "dev": true }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "devOptional": true + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" } }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "dev": true - }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "devOptional": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "optional": true, - "peer": true + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" }, - "json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true + "json-pointer": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/json-pointer/-/json-pointer-0.6.2.tgz", + "integrity": "sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==", + "dev": true, + "requires": { + "foreach": "^2.0.4" + } }, "json-schema-faker": { - "version": "0.5.0-rcv.46", - "resolved": "https://registry.npmjs.org/json-schema-faker/-/json-schema-faker-0.5.0-rcv.46.tgz", - "integrity": "sha512-Q+sGrxptZfezwm7M9W9VmHT9E8s5fWPCaRC4J2zUjb3CmDsxokiCBdHdS/psu91Tafc/ITv+GtIztGzUVT2zIg==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/json-schema-faker/-/json-schema-faker-0.5.3.tgz", + "integrity": "sha512-BeIrR0+YSrTbAR9dOMnjbFl1MvHyXnq+Wpdw1FpWZDHWKLzK229hZ5huyPcmzFUfVq1ODwf40WdGVoE266UBUg==", "dev": true, "requires": { "json-schema-ref-parser": "^6.1.0", - "jsonpath-plus": "^5.1.0" + "jsonpath-plus": "^7.2.0" }, "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, "json-schema-ref-parser": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-6.1.0.tgz", @@ -4637,8 +3772,7 @@ "json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "devOptional": true + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -4653,13 +3787,9 @@ "dev": true }, "json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" }, "jsonfile": { "version": "4.0.0", @@ -4671,9 +3801,9 @@ } }, "jsonpath-plus": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-5.1.0.tgz", - "integrity": "sha512-890w2Pjtj0iswAxalRlt2kHthi6HKrXEfZcn+ZNZptv7F3rUGIeDuZo+C+h4vXBHLEsVjJrHeCm35nYeZLzSBQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-7.2.0.tgz", + "integrity": "sha512-zBfiUPM5nD0YZSBT/o/fbCUlCcepMIdP0CJZxM1+KgA4f2T206f6VAg9e7mX35+KlMaIc5qXW34f3BnwJ3w+RA==", "dev": true }, "jsonpointer": { @@ -4681,18 +3811,6 @@ "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==" }, - "jsprim": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", - "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - } - }, "just-extend": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", @@ -4715,24 +3833,11 @@ "type-check": "~0.4.0" } }, - "liquid-json": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/liquid-json/-/liquid-json-0.3.1.tgz", - "integrity": "sha512-wUayTU8MS827Dam6MxgD72Ui+KOSF+u/eIqpatOtjnvgJ0+mnDq33uC2M7J0tPK+upe/DpUAuK4JUU89iBoNKQ==", - "dev": true - }, - "loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "optional": true, - "peer": true - }, "locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "devOptional": true, + "dev": true, "requires": { "p-locate": "^5.0.0" } @@ -4740,8 +3845,7 @@ "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "devOptional": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "lodash.flatmap": { "version": "4.5.0", @@ -4761,6 +3865,12 @@ "integrity": "sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw==", "optional": true }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "dev": true + }, "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -4777,10 +3887,33 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "devOptional": true, "requires": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } } }, "log4js": { @@ -4794,32 +3927,16 @@ "flatted": "^3.2.7", "rfdc": "^1.3.0", "streamroller": "^3.1.5" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "optional": true, - "requires": { - "ms": "2.1.2" - } - }, - "flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "optional": true - } } }, "logform": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.4.2.tgz", - "integrity": "sha512-W4c9himeAwXEdZ05dQNerhFz2XG80P9Oj0loPUMV23VC2it0orMHQhJm4hdnnor3rd1HsGf6a2lPwBM1zeXHGw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.5.1.tgz", + "integrity": "sha512-9FyqAm9o9NKKfiAKfZoYo9bGXXuwMkxQiQttkT4YjjVtQVIQtK6LmVtlxmCaFswo6N4AfEkHqZTV0taDtPotNg==", "dev": true, "requires": { "@colors/colors": "1.5.0", + "@types/triple-beam": "^1.3.2", "fecha": "^4.2.0", "ms": "^2.1.1", "safe-stable-stringify": "^2.3.1", @@ -4838,6 +3955,15 @@ "integrity": "sha512-ijUtjmO/n2A5PaosNG9ZGDsQ3vxJg7ZW8vsY8Kp0f2yIZWhSJvjmegV7t+9RPQKxKrvj8yKGehhS+po14hPLGQ==", "optional": true }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, "loupe": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", @@ -4848,14 +3974,19 @@ } }, "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "devOptional": true, + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "requires": { - "yallist": "^4.0.0" + "yallist": "^3.0.2" } }, + "lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "dev": true + }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -4873,10 +4004,16 @@ } } }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", + "dev": true + }, + "marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", "dev": true }, "merge-descriptors": { @@ -4891,80 +4028,63 @@ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "optional": true }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "devOptional": true + "mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "optional": true }, - "mime-format": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mime-format/-/mime-format-2.0.1.tgz", - "integrity": "sha512-XxU3ngPbEnrYnNbIX+lYSaYg0M01v6p2ntd2YaFksTu0vayaw5OJvbdRyWs07EYRlLED5qadUZ+xo+XhOvFhwg==", + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, "requires": { - "charset": "^1.0.0" - } - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "devOptional": true, - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "optional": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "devOptional": true, - "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" } }, "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "devOptional": true + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" }, "minipass": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.5.tgz", - "integrity": "sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q==", - "devOptional": true + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-6.0.2.tgz", + "integrity": "sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==" }, "mkdirp": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.6.tgz", - "integrity": "sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true + }, + "mobx": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/mobx/-/mobx-6.9.0.tgz", + "integrity": "sha512-HdKewQEREEJgsWnErClfbFoVebze6rGazxFLU/XUyrII8dORfVszN1V0BMRnQSzcgsNNtkX8DHj3nC6cdWE9YQ==", + "dev": true + }, + "mobx-react": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/mobx-react/-/mobx-react-7.6.0.tgz", + "integrity": "sha512-+HQUNuh7AoQ9ZnU6c4rvbiVVl+wEkb9WqYsVDzGLng+Dqj1XntHu79PvEWKtSMoMj67vFp/ZPXcElosuJO8ckA==", + "dev": true, + "requires": { + "mobx-react-lite": "^3.4.0" + } + }, + "mobx-react-lite": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/mobx-react-lite/-/mobx-react-lite-3.4.3.tgz", + "integrity": "sha512-NkJREyFTSUXR772Qaai51BnE1voWx56LOL80xG7qkZr6vo8vEaLF3sz1JNUVh+rxmUzxYaqOhfuxTfqUh0FXUg==", "dev": true }, "mocha": { "version": "10.2.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", - "devOptional": true, + "dev": true, "requires": { "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", @@ -4993,66 +4113,54 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "devOptional": true - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "devOptional": true + "dev": true }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "devOptional": true, - "requires": { - "balanced-match": "^1.0.0" - } + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "devOptional": true, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, "requires": { - "ms": "2.1.2" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "dependencies": { - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "devOptional": true + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } } } }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "devOptional": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "devOptional": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "devOptional": true, - "requires": { - "argparse": "^2.0.1" - } - }, "minimatch": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "devOptional": true, + "dev": true, "requires": { "brace-expansion": "^2.0.1" } @@ -5061,15 +4169,32 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "devOptional": true + "dev": true }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "devOptional": true, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, "requires": { - "has-flag": "^4.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" } } } @@ -5093,8 +4218,7 @@ "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "devOptional": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "mustache": { "version": "4.2.0", @@ -5103,24 +4227,24 @@ "dev": true }, "mutation-testing-elements": { - "version": "1.7.14", - "resolved": "https://registry.npmjs.org/mutation-testing-elements/-/mutation-testing-elements-1.7.14.tgz", - "integrity": "sha512-/klVQtO0W9Y3zRUf3Xaf4hvzjCpLMKWetg6/bnLDPBrGTySt7JeW+muh2JQcBessDJMFFZyFYKdCTJOL5AhlBw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mutation-testing-elements/-/mutation-testing-elements-2.0.1.tgz", + "integrity": "sha512-4piLXKUp3iyQ8O+n7tshESwTJI18Olj8ZwW8G9vMpuODKmc8MvQG63zbsiPb9KFJ8yEiiMNodQUSSdgLXpYxPA==", "optional": true }, "mutation-testing-metrics": { - "version": "1.7.14", - "resolved": "https://registry.npmjs.org/mutation-testing-metrics/-/mutation-testing-metrics-1.7.14.tgz", - "integrity": "sha512-Y5I6p2gZy7sXYfWn9yR863vd3NA9IhjKccUdbybmHASRy5b7zit6B03DczuYU+cQDqZ7WX38gzQ9IFs/JdbHqQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mutation-testing-metrics/-/mutation-testing-metrics-2.0.1.tgz", + "integrity": "sha512-YuxxOxg7mFdxL8DQFyU4ueip/8PL7+2/4FPR+xEetBII/c7p2Gt4FqN23US+wdQhNxsos4PCdYJjL8ddqo6/2g==", "optional": true, "requires": { - "mutation-testing-report-schema": "1.7.14" + "mutation-testing-report-schema": "2.0.1" } }, "mutation-testing-report-schema": { - "version": "1.7.14", - "resolved": "https://registry.npmjs.org/mutation-testing-report-schema/-/mutation-testing-report-schema-1.7.14.tgz", - "integrity": "sha512-vN2Gw5dXWp1I7fj9PSzyBPy7KqNG4wN5qMdHwTV339fbW2pH19qlSU5Qg6VJlAZtlfgUiDJ1NYYgIEjpoqrRZA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mutation-testing-report-schema/-/mutation-testing-report-schema-2.0.1.tgz", + "integrity": "sha512-el8j0dzhhxICQZ3vbXGlb9iIDrouOvJo28bKSl3/2sPhpAPZccfvbuwcvlG7+vZv87wJkFaj5zTDQ4TFQoXXNA==", "optional": true }, "mute-stream": { @@ -5133,7 +4257,7 @@ "version": "3.3.3", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "devOptional": true + "dev": true }, "natural-compare": { "version": "1.4.0", @@ -5141,81 +4265,11 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true - }, "neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "devOptional": true - }, - "newman": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/newman/-/newman-5.3.2.tgz", - "integrity": "sha512-cWy8pV0iwvMOZLTw3hkAHcwo2ZA0GKkXm8oUMn1Ltii3ZI2nKpnrg9QGdIT0hGHChRkX6prY5e3Aar7uykMGNg==", - "dev": true, - "requires": { - "async": "3.2.3", - "chardet": "1.4.0", - "cli-progress": "3.10.0", - "cli-table3": "0.6.1", - "colors": "1.4.0", - "commander": "7.2.0", - "csv-parse": "4.16.3", - "eventemitter3": "4.0.7", - "filesize": "8.0.7", - "lodash": "4.17.21", - "mkdirp": "1.0.4", - "postman-collection": "4.1.1", - "postman-collection-transformer": "4.1.6", - "postman-request": "2.88.1-postman.31", - "postman-runtime": "7.29.0", - "pretty-ms": "7.0.1", - "semver": "7.3.5", - "serialised-error": "1.1.3", - "tough-cookie": "3.0.1", - "word-wrap": "1.2.3", - "xmlbuilder": "15.1.1" - }, - "dependencies": { - "chardet": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-1.4.0.tgz", - "integrity": "sha512-NpwMDdSIprbYx1CLnfbxEIarI0Z+s9MssEgggMNheGM+WD68yOhV7IEA/3r6tr0yTRgQD0HuZJDw32s99i6L+A==", - "dev": true - }, - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "xmlbuilder": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", - "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", - "dev": true - } - } + "dev": true }, "nise": { "version": "1.5.3", @@ -5293,6 +4347,24 @@ } } }, + "node-fetch": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", + "dev": true, + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "node-fetch-h2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/node-fetch-h2/-/node-fetch-h2-2.3.0.tgz", + "integrity": "sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg==", + "dev": true, + "requires": { + "http2-client": "^1.2.5" + } + }, "node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -5304,12 +4376,6 @@ "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "optional": true }, - "node-oauth1": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/node-oauth1/-/node-oauth1-1.3.0.tgz", - "integrity": "sha512-0yggixNfrA1KcBwvh/Hy2xAS1Wfs9dcg6TdFf2zN7gilcAigMdrtZ4ybrBSXBgLvGDw9V1p2MRnGBMq7XjTWLg==", - "dev": true - }, "node-preload": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", @@ -5319,17 +4385,25 @@ "process-on-spawn": "^1.0.0" } }, + "node-readfiles": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/node-readfiles/-/node-readfiles-0.2.0.tgz", + "integrity": "sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA==", + "dev": true, + "requires": { + "es6-promise": "^3.2.1" + } + }, "node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", - "devOptional": true + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", + "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==" }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "devOptional": true + "dev": true }, "npm-run-path": { "version": "5.1.0", @@ -5383,21 +4457,6 @@ "yargs": "^15.0.2" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, "cliui": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", @@ -5409,25 +4468,10 @@ "wrap-ansi": "^6.2.0" } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "find-up": { @@ -5467,12 +4511,6 @@ "p-limit": "^2.2.0" } }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -5488,6 +4526,17 @@ "glob": "^7.1.3" } }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, "wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -5536,23 +4585,71 @@ } } }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "oas-kit-common": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/oas-kit-common/-/oas-kit-common-1.0.8.tgz", + "integrity": "sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ==", + "dev": true, + "requires": { + "fast-safe-stringify": "^2.0.7" + } + }, + "oas-linter": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/oas-linter/-/oas-linter-3.2.2.tgz", + "integrity": "sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ==", + "dev": true, + "requires": { + "@exodus/schemasafe": "^1.0.0-rc.2", + "should": "^13.2.1", + "yaml": "^1.10.0" + } + }, + "oas-resolver": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/oas-resolver/-/oas-resolver-2.5.6.tgz", + "integrity": "sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ==", + "dev": true, + "requires": { + "node-fetch-h2": "^2.3.0", + "oas-kit-common": "^1.0.8", + "reftools": "^1.1.9", + "yaml": "^1.10.0", + "yargs": "^17.0.1" + } + }, + "oas-schema-walker": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/oas-schema-walker/-/oas-schema-walker-1.1.5.tgz", + "integrity": "sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ==", "dev": true }, - "object-hash": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", - "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==", + "oas-validator": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/oas-validator/-/oas-validator-5.0.8.tgz", + "integrity": "sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw==", + "dev": true, + "requires": { + "call-me-maybe": "^1.0.1", + "oas-kit-common": "^1.0.8", + "oas-linter": "^3.2.2", + "oas-resolver": "^2.5.6", + "oas-schema-walker": "^1.1.5", + "reftools": "^1.1.9", + "should": "^13.2.1", + "yaml": "^1.10.0" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true }, "object-inspect": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", - "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", - "devOptional": true + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" }, "object-is": { "version": "1.1.5", @@ -5580,14 +4677,6 @@ "define-properties": "^1.1.4", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" - }, - "dependencies": { - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - } } }, "object.entries": { @@ -5612,20 +4701,11 @@ "es-abstract": "^1.20.4" } }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "devOptional": true, + "dev": true, "requires": { "wrappy": "1" } @@ -5657,6 +4737,16 @@ "format-util": "^1.0.3" } }, + "openapi-sampler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/openapi-sampler/-/openapi-sampler-1.3.1.tgz", + "integrity": "sha512-Ert9mvc2tLPmmInwSyGZS+v4Ogu9/YoZuq9oP3EdUklg2cad6+IGndP9yqJJwbgdXwZibiq5fpv6vYujchdJFg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.7", + "json-pointer": "0.6.2" + } + }, "opentracing": { "version": "0.14.7", "resolved": "https://registry.npmjs.org/opentracing/-/opentracing-0.14.7.tgz", @@ -5678,57 +4768,45 @@ } }, "ora": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-6.3.0.tgz", - "integrity": "sha512-1/D8uRFY0ay2kgBpmAwmSA404w4OoPVhHMqRqtjvrcK/dnzcEZxMJ+V4DUbyICu8IIVRclHcOf5wlD1tMY4GUQ==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "optional": true, "requires": { - "chalk": "^5.0.0", - "cli-cursor": "^4.0.0", - "cli-spinners": "^2.6.1", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^1.1.0", - "log-symbols": "^5.1.0", - "stdin-discarder": "^0.1.0", - "strip-ansi": "^7.0.1", + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", "wcwidth": "^1.0.1" }, "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "optional": true - }, "chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", - "optional": true - }, - "is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", - "optional": true - }, - "log-symbols": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", - "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "optional": true, "requires": { - "chalk": "^5.0.0", - "is-unicode-supported": "^1.1.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "optional": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "optional": true, "requires": { - "ansi-regex": "^6.0.1" + "has-flag": "^4.0.0" } } } @@ -5743,7 +4821,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "devOptional": true, + "dev": true, "requires": { "yocto-queue": "^0.1.0" } @@ -5752,7 +4830,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "devOptional": true, + "dev": true, "requires": { "p-limit": "^3.0.2" } @@ -5766,6 +4844,12 @@ "aggregate-error": "^3.0.0" } }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, "package-hash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", @@ -5787,35 +4871,28 @@ "callsites": "^3.0.0" } }, - "parse-ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", - "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==", - "dev": true - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", "dev": true }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "devOptional": true + "dev": true }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "devOptional": true + "dev": true }, "path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "devOptional": true + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" }, "path-parse": { "version": "1.0.7", @@ -5824,52 +4901,43 @@ "dev": true }, "path-scurry": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.6.3.tgz", - "integrity": "sha512-RAmB+n30SlN+HnNx6EbcpoDy9nwdpcGPnEKrJnu6GZoDWBdIjo1UQMVtW2ybtC7LC2oKLcMq8y5g8WnKLiod9g==", - "devOptional": true, + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.9.2.tgz", + "integrity": "sha512-qSDLy2aGFPm8i4rsbHd4MNyTcrzHFsLQykrtbuGRknZZCBBVXSv2tSCDN2Cg6Rt/GFRw8GoW9y9Ecw5rIPG1sg==", "requires": { - "lru-cache": "^7.14.1", - "minipass": "^4.0.2" + "lru-cache": "^9.1.1", + "minipass": "^5.0.0 || ^6.0.2" }, "dependencies": { "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "devOptional": true + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.2.tgz", + "integrity": "sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ==" } } }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true - }, "pathval": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", "dev": true }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "perfect-scrollbar": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/perfect-scrollbar/-/perfect-scrollbar-1.5.5.tgz", + "integrity": "sha512-dzalfutyP3e/FOpdlhVryN4AJ5XDVauVWxybSkLZmakFE2sS3y3pc4JnSprw8tGmHvkaG5Edr5T7LBTZ+WWU2g==", "dev": true }, "picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "devOptional": true + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "devOptional": true + "dev": true }, "pkg-dir": { "version": "4.2.0", @@ -5916,219 +4984,60 @@ "requires": { "p-limit": "^2.2.0" } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true } } }, - "postman-collection": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/postman-collection/-/postman-collection-4.1.1.tgz", - "integrity": "sha512-ODpJtlf8r99DMcTU7gFmi/yvQYckFzcuE6zL/fWnyrFT34ugdCBFlX+DN7M+AnP6lmR822fv5s60H4DnL4+fAg==", - "dev": true, - "requires": { - "faker": "5.5.3", - "file-type": "3.9.0", - "http-reasons": "0.1.0", - "iconv-lite": "0.6.3", - "liquid-json": "0.3.1", - "lodash": "4.17.21", - "mime-format": "2.0.1", - "mime-types": "2.1.34", - "postman-url-encoder": "3.0.5", - "semver": "7.3.5", - "uuid": "8.3.2" + "pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true + }, + "polished": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/polished/-/polished-4.2.2.tgz", + "integrity": "sha512-Sz2Lkdxz6F2Pgnpi9U5Ng/WdWAUZxmHrNPoVlm3aAemxoy2Qy7LGjQg4uf8qKelDAUW94F4np3iH2YPf2qefcQ==", + "dev": true, + "requires": { + "@babel/runtime": "^7.17.8" + } + }, + "portfinder": { + "version": "1.0.32", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", + "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", + "dev": true, + "requires": { + "async": "^2.6.4", + "debug": "^3.2.7", + "mkdirp": "^0.5.6" }, "dependencies": { - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, - "mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", - "dev": true - }, - "mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", - "dev": true, - "requires": { - "mime-db": "1.51.0" - } - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true - } - } - }, - "postman-collection-transformer": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/postman-collection-transformer/-/postman-collection-transformer-4.1.6.tgz", - "integrity": "sha512-xvdQb6sZoWcG9xZXUPSuxocjcd6WCZlINlGGiuHdSfxhgiwQhj9qhF0JRFbagZ8xB0+pYUairD5MiCENc6DEVA==", - "dev": true, - "requires": { - "commander": "8.3.0", - "inherits": "2.0.4", - "lodash": "4.17.21", - "semver": "7.3.5", - "strip-json-comments": "3.1.1" - }, - "dependencies": { - "commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "postman-request": { - "version": "2.88.1-postman.31", - "resolved": "https://registry.npmjs.org/postman-request/-/postman-request-2.88.1-postman.31.tgz", - "integrity": "sha512-OJbYqP7ItxQ84yHyuNpDywCZB0HYbpHJisMQ9lb1cSL3N5H3Td6a2+3l/a74UMd3u82BiGC5yQyYmdOIETP/nQ==", - "dev": true, - "requires": { - "@postman/form-data": "~3.1.1", - "@postman/tunnel-agent": "^0.6.3", - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "brotli": "~1.3.2", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "har-validator": "~5.1.3", - "http-signature": "~1.3.1", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "stream-length": "^1.0.2", - "tough-cookie": "~2.5.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "dev": true - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" + "ms": "^2.1.1" } - } - } - }, - "postman-runtime": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/postman-runtime/-/postman-runtime-7.29.0.tgz", - "integrity": "sha512-eXxHREE/fUpohkGPRgBY1YccSGx9cyW3mtGiPyIE4zD5fYzasgBHqW6kbEND3Xrd3yf/uht/YI1H8O7J1+A1+w==", - "dev": true, - "requires": { - "async": "3.2.3", - "aws4": "1.11.0", - "handlebars": "4.7.7", - "httpntlm": "1.7.7", - "js-sha512": "0.8.0", - "lodash": "4.17.21", - "mime-types": "2.1.34", - "node-oauth1": "1.3.0", - "performance-now": "2.1.0", - "postman-collection": "4.1.1", - "postman-request": "2.88.1-postman.31", - "postman-sandbox": "4.0.6", - "postman-url-encoder": "3.0.5", - "serialised-error": "1.1.3", - "tough-cookie": "3.0.1", - "uuid": "8.3.2" - }, - "dependencies": { - "mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", - "dev": true }, - "mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "requires": { - "mime-db": "1.51.0" + "minimist": "^1.2.6" } - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true } } }, - "postman-sandbox": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/postman-sandbox/-/postman-sandbox-4.0.6.tgz", - "integrity": "sha512-PPRanSNEE4zy3kO7CeSBHmAfJnGdD9ecHY/Mjh26CQuZZarGkNO8c0U/n+xX3+5M1BRNc82UYq6YCtdsSDqcng==", - "dev": true, - "requires": { - "lodash": "4.17.21", - "teleport-javascript": "1.0.0", - "uvm": "2.0.2" - } - }, - "postman-url-encoder": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/postman-url-encoder/-/postman-url-encoder-3.0.5.tgz", - "integrity": "sha512-jOrdVvzUXBC7C+9gkIkpDJ3HIxOHTIqjpQ4C1EMt1ZGeMvSEpbFCKq23DEfgsj46vMnDgyQf+1ZLp2Wm+bKSsA==", - "dev": true, - "requires": { - "punycode": "^2.1.1" - } + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true }, "prelude-ls": { "version": "1.2.1", @@ -6136,14 +5045,11 @@ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, - "pretty-ms": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz", - "integrity": "sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==", - "dev": true, - "requires": { - "parse-ms": "^2.1.0" - } + "prismjs": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "dev": true }, "process": { "version": "0.10.1", @@ -6163,8 +5069,26 @@ "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "devOptional": true + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + }, + "prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + }, + "dependencies": { + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + } + } }, "propagate": { "version": "1.0.0", @@ -6172,16 +5096,6 @@ "integrity": "sha512-T/rqCJJaIPYObiLSmaDsIf4PGA7y+pkgYFHmwoXQyOHiDDSO1YCxcztNiRBmV4EZha4QIbID3vQIHkqKu5k0Xg==", "dev": true }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dev": true, - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - } - }, "proxyquire": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/proxyquire/-/proxyquire-2.1.3.tgz", @@ -6193,22 +5107,15 @@ "resolve": "^1.11.1" } }, - "psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true - }, "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" }, "qs": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "devOptional": true, "requires": { "side-channel": "^1.0.4" } @@ -6219,38 +5126,56 @@ "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", "dev": true }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "devOptional": true, + "dev": true, "requires": { "safe-buffer": "^5.1.0" } }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true + "react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "dev": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } }, - "raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "react-dom": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", "dev": true, "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + } + }, + "react-tabs": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/react-tabs/-/react-tabs-3.2.3.tgz", + "integrity": "sha512-jx325RhRVnS9DdFbeF511z0T0WEqEoMl1uCE3LoZ6VaZZm7ytatxbum0B8bCTmaiV0KsU+4TtLGTGevCic7SWg==", + "dev": true, + "requires": { + "clsx": "^1.1.0", + "prop-types": "^15.5.0" } }, "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "devOptional": true, + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -6261,2216 +5186,62 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "devOptional": true, + "dev": true, "requires": { "picomatch": "^2.2.1" } }, - "redoc-cli": { - "version": "0.13.21", - "resolved": "https://registry.npmjs.org/redoc-cli/-/redoc-cli-0.13.21.tgz", - "integrity": "sha512-pjuPf0HkKqo9qtoHxMK4x5dhC/lJ08O0hO0rJISbSRCf19bPBjQ5lb2mHRu9j6vypTMltyaLtFIfVNveuyF5fQ==", - "optional": true, - "requires": { - "boxen": "5.1.2", - "chokidar": "^3.5.1", - "handlebars": "^4.7.7", - "mkdirp": "^1.0.4", - "mobx": "^6.3.2", - "node-libs-browser": "^2.2.1", - "react": "^17.0.1", - "react-dom": "^17.0.1", - "redoc": "2.0.0", - "styled-components": "^5.3.0", - "yargs": "^17.3.1" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "optional": true, - "requires": { - "@babel/highlight": "^7.12.13" - } - }, - "@babel/generator": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.3.tgz", - "integrity": "sha512-bn0S6flG/j0xtQdz3hsjJ624h3W0r3llttBMfyHX3YrZ/KtLYr15bjA0FXkgW7FpvrDuTuElXeVjiKlYRpnOFA==", - "optional": true, - "requires": { - "@babel/types": "^7.14.2", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "optional": true - } - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz", - "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==", - "optional": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-function-name": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz", - "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==", - "optional": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.14.2" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", - "optional": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-module-imports": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", - "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", - "optional": true, - "requires": { - "@babel/types": "^7.13.12" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", - "optional": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", - "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", - "optional": true - }, - "@babel/highlight": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", - "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", - "optional": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.0", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.14.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.4.tgz", - "integrity": "sha512-ArliyUsWDUqEGfWcmzpGUzNfLxTdTp6WU4IuP6QFSp9gGfWS6boxFCkJSJ/L4+RG8z/FnIU3WxCk6hPL9SSWeA==", - "optional": true - }, - "@babel/runtime": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.7.tgz", - "integrity": "sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ==", - "optional": true, - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", - "optional": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "@babel/traverse": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz", - "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==", - "optional": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.14.2", - "@babel/helper-function-name": "^7.14.2", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.14.2", - "@babel/types": "^7.14.2", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.14.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.4.tgz", - "integrity": "sha512-lCj4aIs0xUefJFQnwwQv2Bxg7Omd6bgquZ6LGC+gGMh6/s5qDVfjuCMlDmYQ15SLsWHd9n+X3E75lKIhl5Lkiw==", - "optional": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.0", - "to-fast-properties": "^2.0.0" - } - }, - "@emotion/is-prop-valid": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", - "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", - "optional": true, - "requires": { - "@emotion/memoize": "0.7.4" - } - }, - "@emotion/memoize": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", - "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", - "optional": true - }, - "@emotion/stylis": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", - "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==", - "optional": true - }, - "@emotion/unitless": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", - "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==", - "optional": true - }, - "@exodus/schemasafe": { - "version": "1.0.0-rc.6", - "resolved": "https://registry.npmjs.org/@exodus/schemasafe/-/schemasafe-1.0.0-rc.6.tgz", - "integrity": "sha512-dDnQizD94EdBwEj/fh3zPRa/HWCS9O5au2PuHhZBbuM3xWHxuaKzPBOEWze7Nn0xW68MIpZ7Xdyn1CoCpjKCuQ==", - "optional": true - }, - "@redocly/ajv": { - "version": "8.6.4", - "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.6.4.tgz", - "integrity": "sha512-y9qNj0//tZtWB2jfXNK3BX18BSBp9zNR7KE7lMysVHwbZtY392OJCjm6Rb/h4UHH2r1AqjNEHFD6bRn+DqU9Mw==", - "optional": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "@redocly/openapi-core": { - "version": "1.0.0-beta.105", - "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.0.0-beta.105.tgz", - "integrity": "sha512-8uYDMcqBOPhFgjRlg5uetW/E2uTVVRpk+YsJhaH78ZNuzBkQP5Waw5s8P8ym6myvHs5me8l5AdniY/ePLMT5xg==", - "optional": true, - "requires": { - "@redocly/ajv": "^8.6.4", - "@types/node": "^14.11.8", - "colorette": "^1.2.0", - "js-levenshtein": "^1.1.6", - "js-yaml": "^4.1.0", - "lodash.isequal": "^4.5.0", - "minimatch": "^5.0.1", - "node-fetch": "^2.6.1", - "pluralize": "^8.0.0", - "yaml-ast-parser": "0.0.43" - }, - "dependencies": { - "@types/node": { - "version": "14.18.22", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.22.tgz", - "integrity": "sha512-qzaYbXVzin6EPjghf/hTdIbnVW1ErMx8rPzwRNJhlbyJhu2SyqlvjGOY/tbUt6VFyzg56lROcOeSQRInpt63Yw==", - "optional": true - } - } - }, - "@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", - "optional": true - }, - "ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "optional": true, - "requires": { - "string-width": "^4.1.0" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "optional": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "optional": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "optional": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "optional": true - }, - "asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "optional": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "optional": true - } - } - }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "optional": true, - "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "optional": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "optional": true, - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "babel-plugin-styled-components": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-1.12.0.tgz", - "integrity": "sha512-FEiD7l5ZABdJPpLssKXjBUJMYqzbcNzBowfXDCdJhOpbhWiewapUaY+LZGT8R4Jg2TwOjGjG4RKeyrO5p9sBkA==", - "optional": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-module-imports": "^7.0.0", - "babel-plugin-syntax-jsx": "^6.18.0", - "lodash": "^4.17.11" - } - }, - "babel-plugin-syntax-jsx": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", - "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", - "optional": true - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "optional": true - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "optional": true - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "optional": true - }, - "bn.js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", - "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", - "optional": true - }, - "boxen": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", - "optional": true, - "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.2", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "optional": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "optional": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "optional": true - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "optional": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "optional": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "optional": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "optional": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "optional": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "optional": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "optional": true - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "optional": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "optional": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "optional": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "optional": true, - "requires": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "optional": true, - "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "optional": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "optional": true, - "requires": { - "pako": "~1.0.5" - } - }, - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "optional": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "optional": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "optional": true - }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", - "optional": true - }, - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "optional": true - }, - "camelize": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", - "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=", - "optional": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "optional": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", - "optional": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.3.1", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" - } - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "optional": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "classnames": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", - "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==", - "optional": true - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "optional": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "clsx": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", - "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==", - "optional": true - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "optional": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "optional": true - }, - "colorette": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", - "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", - "optional": true - }, - "console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "optional": true - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "optional": true - }, - "core-js": { - "version": "3.25.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.25.0.tgz", - "integrity": "sha512-CVU1xvJEfJGhyCpBrzzzU1kjCfgsGUxhEvwUV2e/cOedYWHdmluamx+knDnmhqALddMG16fZvIqvs9aijsHHaA==", - "optional": true, - "peer": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "optional": true - }, - "create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "optional": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "optional": true - } - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "optional": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "optional": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "optional": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "css-color-keywords": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", - "integrity": "sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU=", - "optional": true - }, - "css-to-react-native": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.0.0.tgz", - "integrity": "sha512-Ro1yETZA813eoyUp2GDBhG2j+YggidUmzO1/v9eYBKR2EHVEniE2MI/NqpTQ954BMpTPZFsGNPm46qFB9dpaPQ==", - "optional": true, - "requires": { - "camelize": "^1.0.0", - "css-color-keywords": "^1.0.0", - "postcss-value-parser": "^4.0.2" - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "optional": true, - "requires": { - "ms": "2.1.2" - } - }, - "decko": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decko/-/decko-1.2.0.tgz", - "integrity": "sha1-/UPHNelnuAEzBohKVvvmZZlraBc=", - "optional": true - }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "optional": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "optional": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "optional": true - } - } - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "optional": true - }, - "dompurify": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.3.5.tgz", - "integrity": "sha512-kD+f8qEaa42+mjdOpKeztu9Mfx5bv9gVLO6K9jRx4uGvh6Wv06Srn4jr1wPNY2OOUGGSKHNFN+A8MA3v0E0QAQ==", - "optional": true - }, - "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "optional": true, - "requires": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "optional": true - } - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "optional": true - }, - "es6-promise": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", - "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=", - "optional": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "optional": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "optional": true - }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "optional": true - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "optional": true - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "optional": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "optional": true - }, - "fast-safe-stringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", - "optional": true - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "optional": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "foreach": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz", - "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==", - "optional": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "optional": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "optional": true - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "optional": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "optional": true - }, - "handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", - "optional": true, - "requires": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4", - "wordwrap": "^1.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "optional": true - }, - "hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "optional": true, - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "optional": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "optional": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "optional": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "optional": true, - "requires": { - "react-is": "^16.7.0" - }, - "dependencies": { - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "optional": true - } - } - }, - "http2-client": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/http2-client/-/http2-client-1.3.5.tgz", - "integrity": "sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==", - "optional": true - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "optional": true - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "optional": true - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "optional": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "optional": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "optional": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "optional": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "optional": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "optional": true - }, - "js-levenshtein": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", - "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", - "optional": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "optional": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "optional": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "optional": true - }, - "json-pointer": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/json-pointer/-/json-pointer-0.6.2.tgz", - "integrity": "sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==", - "optional": true, - "requires": { - "foreach": "^2.0.4" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "optional": true - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "optional": true - }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", - "optional": true - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "optional": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lunr": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "optional": true - }, - "mark.js": { - "version": "8.11.1", - "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", - "integrity": "sha1-GA8fnr74sOY45BZq1S24eb6y/8U=", - "optional": true - }, - "marked": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.15.tgz", - "integrity": "sha512-esX5lPdTfG4p8LDkv+obbRCyOKzB+820ZZyMOXJZygZBHrH9b3xXR64X4kT3sPe9Nx8qQXbmcz6kFSMt4Nfk6Q==", - "optional": true - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "optional": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "optional": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "optional": true - } - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "optional": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "optional": true - }, - "minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", - "optional": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "optional": true - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "optional": true - }, - "mobx": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/mobx/-/mobx-6.3.2.tgz", - "integrity": "sha512-xGPM9dIE1qkK9Nrhevp0gzpsmELKU4MFUJRORW/jqxVFIHHWIoQrjDjL8vkwoJYY3C2CeVJqgvl38hgKTalTWg==", - "optional": true - }, - "mobx-react": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/mobx-react/-/mobx-react-7.2.1.tgz", - "integrity": "sha512-LZS99KFLn75VWDXPdRJhILzVQ7qLcRjQbzkK+wVs0Qg4kWw5hOI2USp7tmu+9zP9KYsVBmKyx2k/8cTTBfsymw==", - "optional": true, - "requires": { - "mobx-react-lite": "^3.2.0" - } - }, - "mobx-react-lite": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/mobx-react-lite/-/mobx-react-lite-3.2.3.tgz", - "integrity": "sha512-7exWp1FV0M9dP08H9PIeHlJqDw4IdkQVRMfLYaZFMmlbzSS6ZU6p/kx392KN+rVf81hH3IQYewvRGQ70oiwmbw==", - "optional": true, - "requires": {} - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "optional": true - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "optional": true - }, - "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "optional": true, - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "node-fetch-h2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/node-fetch-h2/-/node-fetch-h2-2.3.0.tgz", - "integrity": "sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg==", - "optional": true, - "requires": { - "http2-client": "^1.2.5" - } - }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "optional": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - } - }, - "node-readfiles": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/node-readfiles/-/node-readfiles-0.2.0.tgz", - "integrity": "sha1-271K8SE04uY1wkXvk//Pb2BnOl0=", - "optional": true, - "requires": { - "es6-promise": "^3.2.1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "optional": true - }, - "oas-kit-common": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/oas-kit-common/-/oas-kit-common-1.0.8.tgz", - "integrity": "sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ==", - "optional": true, - "requires": { - "fast-safe-stringify": "^2.0.7" - } - }, - "oas-linter": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/oas-linter/-/oas-linter-3.2.2.tgz", - "integrity": "sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ==", - "optional": true, - "requires": { - "@exodus/schemasafe": "^1.0.0-rc.2", - "should": "^13.2.1", - "yaml": "^1.10.0" - } - }, - "oas-resolver": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/oas-resolver/-/oas-resolver-2.5.6.tgz", - "integrity": "sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ==", - "optional": true, - "requires": { - "node-fetch-h2": "^2.3.0", - "oas-kit-common": "^1.0.8", - "reftools": "^1.1.9", - "yaml": "^1.10.0", - "yargs": "^17.0.1" - } - }, - "oas-schema-walker": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/oas-schema-walker/-/oas-schema-walker-1.1.5.tgz", - "integrity": "sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ==", - "optional": true - }, - "oas-validator": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/oas-validator/-/oas-validator-5.0.8.tgz", - "integrity": "sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw==", - "optional": true, - "requires": { - "call-me-maybe": "^1.0.1", - "oas-kit-common": "^1.0.8", - "oas-linter": "^3.2.2", - "oas-resolver": "^2.5.6", - "oas-schema-walker": "^1.1.5", - "reftools": "^1.1.9", - "should": "^13.2.1", - "yaml": "^1.10.0" - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "optional": true - }, - "openapi-sampler": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/openapi-sampler/-/openapi-sampler-1.3.0.tgz", - "integrity": "sha512-2QfjK1oM9Sv0q82Ae1RrUe3yfFmAyjF548+6eAeb+h/cL1Uj51TW4UezraBEvwEdzoBgfo4AaTLVFGTKj+yYDw==", - "optional": true, - "requires": { - "@types/json-schema": "^7.0.7", - "json-pointer": "0.6.2" - } - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "optional": true - }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "optional": true - }, - "parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "optional": true, - "requires": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "optional": true - }, - "pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "optional": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "perfect-scrollbar": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/perfect-scrollbar/-/perfect-scrollbar-1.5.5.tgz", - "integrity": "sha512-dzalfutyP3e/FOpdlhVryN4AJ5XDVauVWxybSkLZmakFE2sS3y3pc4JnSprw8tGmHvkaG5Edr5T7LBTZ+WWU2g==", - "optional": true - }, - "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "optional": true - }, - "pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "optional": true - }, - "polished": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/polished/-/polished-4.1.4.tgz", - "integrity": "sha512-Nq5Mbza+Auo7N3sQb1QMFaQiDO+4UexWuSGR7Cjb4Sw11SZIJcrrFtiZ+L0jT9MBsUsxDboHVASbCLbE1rnECg==", - "optional": true, - "requires": { - "@babel/runtime": "^7.16.7" - } - }, - "postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", - "optional": true - }, - "prismjs": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz", - "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==", - "optional": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "optional": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "optional": true - }, - "prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "optional": true, - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - }, - "dependencies": { - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "optional": true - } - } - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "optional": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "optional": true - } - } - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "optional": true - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "optional": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "optional": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "optional": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "optional": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", - "optional": true, - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "react-dom": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", - "optional": true, - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" - } - }, - "react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "optional": true, - "peer": true - }, - "react-tabs": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/react-tabs/-/react-tabs-3.2.3.tgz", - "integrity": "sha512-jx325RhRVnS9DdFbeF511z0T0WEqEoMl1uCE3LoZ6VaZZm7ytatxbum0B8bCTmaiV0KsU+4TtLGTGevCic7SWg==", - "optional": true, - "requires": { - "clsx": "^1.1.0", - "prop-types": "^15.5.0" - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "optional": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", - "optional": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "redoc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/redoc/-/redoc-2.0.0.tgz", - "integrity": "sha512-rU8iLdAkT89ywOkYk66Mr+IofqaMASlRvTew0dJvopCORMIPUcPMxjlJbJNC6wsn2vvMnpUFLQ/0ISDWn9BWag==", - "optional": true, - "requires": { - "@redocly/openapi-core": "^1.0.0-beta.104", - "classnames": "^2.3.1", - "decko": "^1.2.0", - "dompurify": "^2.2.8", - "eventemitter3": "^4.0.7", - "json-pointer": "^0.6.2", - "lunr": "^2.3.9", - "mark.js": "^8.11.1", - "marked": "^4.0.15", - "mobx-react": "^7.2.0", - "openapi-sampler": "^1.3.0", - "path-browserify": "^1.0.1", - "perfect-scrollbar": "^1.5.5", - "polished": "^4.1.3", - "prismjs": "^1.27.0", - "prop-types": "^15.7.2", - "react-tabs": "^3.2.2", - "slugify": "~1.4.7", - "stickyfill": "^1.1.1", - "style-loader": "^3.3.1", - "swagger2openapi": "^7.0.6", - "url-template": "^2.0.8" - }, - "dependencies": { - "path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "optional": true - } - } - }, - "reftools": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/reftools/-/reftools-1.1.9.tgz", - "integrity": "sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w==", - "optional": true - }, - "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", - "optional": true - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "optional": true - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "optional": true - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "optional": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "optional": true - }, - "scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", - "optional": true, - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "optional": true - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "optional": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", - "optional": true - }, - "should": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/should/-/should-13.2.3.tgz", - "integrity": "sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==", - "optional": true, - "requires": { - "should-equal": "^2.0.0", - "should-format": "^3.0.3", - "should-type": "^1.4.0", - "should-type-adaptors": "^1.0.1", - "should-util": "^1.0.0" - } - }, - "should-equal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz", - "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==", - "optional": true, - "requires": { - "should-type": "^1.4.0" - } - }, - "should-format": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", - "integrity": "sha1-m/yPdPo5IFxT04w01xcwPidxJPE=", - "optional": true, - "requires": { - "should-type": "^1.3.0", - "should-type-adaptors": "^1.0.1" - } - }, - "should-type": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", - "integrity": "sha1-B1bYzoRt/QmEOmlHcZ36DUz/XPM=", - "optional": true - }, - "should-type-adaptors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz", - "integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==", - "optional": true, - "requires": { - "should-type": "^1.3.0", - "should-util": "^1.0.0" - } - }, - "should-util": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.1.tgz", - "integrity": "sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==", - "optional": true - }, - "slugify": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.4.7.tgz", - "integrity": "sha512-tf+h5W1IrjNm/9rKKj0JU2MDMruiopx0jjVA5zCdBtcGjfp0+c5rHw/zADLC3IeKlGHtVbHtpfzvYA0OYT+HKg==", - "optional": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "optional": true - }, - "stickyfill": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stickyfill/-/stickyfill-1.1.1.tgz", - "integrity": "sha1-OUE/7p0CXHSn5ZzuyyN4TMDxfwI=", - "optional": true - }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "optional": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "optional": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "optional": true, - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "optional": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "optional": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "style-loader": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", - "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", - "optional": true, - "requires": {} - }, - "styled-components": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.0.tgz", - "integrity": "sha512-bPJKwZCHjJPf/hwTJl6TbkSZg/3evha+XPEizrZUGb535jLImwDUdjTNxXqjjaASt2M4qO4AVfoHJNe3XB/tpQ==", - "optional": true, - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/traverse": "^7.4.5", - "@emotion/is-prop-valid": "^0.8.8", - "@emotion/stylis": "^0.8.4", - "@emotion/unitless": "^0.7.4", - "babel-plugin-styled-components": ">= 1.12.0", - "css-to-react-native": "^3.0.0", - "hoist-non-react-statics": "^3.0.0", - "shallowequal": "^1.1.0", - "supports-color": "^5.5.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "optional": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "swagger2openapi": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/swagger2openapi/-/swagger2openapi-7.0.8.tgz", - "integrity": "sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g==", - "optional": true, - "requires": { - "call-me-maybe": "^1.0.1", - "node-fetch": "^2.6.1", - "node-fetch-h2": "^2.3.0", - "node-readfiles": "^0.2.0", - "oas-kit-common": "^1.0.8", - "oas-resolver": "^2.5.6", - "oas-schema-walker": "^1.1.5", - "oas-validator": "^5.0.8", - "reftools": "^1.1.9", - "yaml": "^1.10.0", - "yargs": "^17.0.1" - } - }, - "timers-browserify": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", - "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", - "optional": true, - "requires": { - "setimmediate": "^1.0.4" - } - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "optional": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "optional": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "optional": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", - "optional": true - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "optional": true - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "optional": true - }, - "uglify-js": { - "version": "3.13.9", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.9.tgz", - "integrity": "sha512-wZbyTQ1w6Y7fHdt8sJnHfSIuWeDgk6B5rCb4E/AM6QNNPbOMIZph21PW5dRB3h7Df0GszN+t7RuUH6sWK5bF0g==", - "optional": true - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "optional": true, - "requires": { - "punycode": "^2.1.0" - }, - "dependencies": { - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "optional": true - } - } - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "optional": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "optional": true - } - } - }, - "url-template": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", - "integrity": "sha1-/FZaPMy/93MMd19WQflVV5FDnyE=", - "optional": true - }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "optional": true, - "requires": { - "inherits": "2.0.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "optional": true - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "optional": true - }, - "vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "optional": true - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", - "optional": true - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "optional": true, - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "optional": true, - "requires": { - "string-width": "^4.0.0" - } - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "optional": true - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "optional": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "optional": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "optional": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "optional": true - } - } - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "optional": true - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "optional": true - }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "optional": true - }, - "yaml-ast-parser": { - "version": "0.0.43", - "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz", - "integrity": "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==", - "optional": true - }, - "yargs": { - "version": "17.3.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz", - "integrity": "sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==", - "optional": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" - } - }, - "yargs-parser": { - "version": "21.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", - "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", - "optional": true - } - } + "redoc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redoc/-/redoc-2.0.0.tgz", + "integrity": "sha512-rU8iLdAkT89ywOkYk66Mr+IofqaMASlRvTew0dJvopCORMIPUcPMxjlJbJNC6wsn2vvMnpUFLQ/0ISDWn9BWag==", + "dev": true, + "requires": { + "@redocly/openapi-core": "^1.0.0-beta.104", + "classnames": "^2.3.1", + "decko": "^1.2.0", + "dompurify": "^2.2.8", + "eventemitter3": "^4.0.7", + "json-pointer": "^0.6.2", + "lunr": "^2.3.9", + "mark.js": "^8.11.1", + "marked": "^4.0.15", + "mobx-react": "^7.2.0", + "openapi-sampler": "^1.3.0", + "path-browserify": "^1.0.1", + "perfect-scrollbar": "^1.5.5", + "polished": "^4.1.3", + "prismjs": "^1.27.0", + "prop-types": "^15.7.2", + "react-tabs": "^3.2.2", + "slugify": "~1.4.7", + "stickyfill": "^1.1.1", + "style-loader": "^3.3.1", + "swagger2openapi": "^7.0.6", + "url-template": "^2.0.8" + } + }, + "reftools": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/reftools/-/reftools-1.1.9.tgz", + "integrity": "sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "dev": true }, "regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" } }, "regexpp": { @@ -8492,13 +5263,12 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "devOptional": true + "dev": true }, "require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "devOptional": true + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" }, "require-main-filename": { "version": "2.0.0", @@ -8507,12 +5277,12 @@ "dev": true }, "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "dev": true, "requires": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.11.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -8524,9 +5294,9 @@ "dev": true }, "restore-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "optional": true, "requires": { "onetime": "^5.1.0", @@ -8557,66 +5327,73 @@ "optional": true }, "rimraf": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", - "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.1.tgz", + "integrity": "sha512-OfFZdwtd3lZ+XZzYP/6gTACubwFcHdLRqS9UX3UwpU2dnGQYkPFISRwvM3w9IiB2w7bW5qGo/uAwE4SmXXSKvg==", "dev": true, "requires": { - "glob": "^9.2.0" + "glob": "^10.2.5" }, "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", "dev": true, "requires": { - "balanced-match": "^1.0.0" + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" } }, "glob": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.2.tgz", - "integrity": "sha512-BTv/JhKXFEHsErMte/AnfiSv8yYOLLiyH2lTg8vn02O21zWFgHPTfxtgn1QRe7NRgggUhC8hacR2Re94svHqeA==", + "version": "10.2.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.7.tgz", + "integrity": "sha512-jTKehsravOJo8IJxUGfZILnkvVJM/MOfHRs8QcXolVef2zNI9Tqyy5+SeuOAZd3upViEZQLyFpQhYiHLrMUNmA==", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "minimatch": "^7.4.1", - "minipass": "^4.2.4", - "path-scurry": "^1.6.1" + "foreground-child": "^3.1.0", + "jackspeak": "^2.0.3", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2", + "path-scurry": "^1.7.0" } }, "minimatch": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.3.tgz", - "integrity": "sha512-5UB4yYusDtkRPbRiy1cqZ1IpGNcJCGlEMG17RKzPddpyiPKoCdwohbED8g4QXT0ewCt8LTkQXuljsUfQ3FKM4A==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", + "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", "dev": true, "requires": { "brace-expansion": "^2.0.1" } + }, + "signal-exit": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz", + "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==", + "dev": true } } }, "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", + "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", "optional": true }, "rxjs": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", - "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "optional": true, "requires": { "tslib": "^2.1.0" } }, "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "devOptional": true + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, "safe-regex-test": { "version": "1.0.0", @@ -8627,54 +5404,33 @@ "call-bind": "^1.0.2", "get-intrinsic": "^1.1.3", "is-regex": "^1.1.4" - }, - "dependencies": { - "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - } } }, "safe-stable-stringify": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.0.tgz", - "integrity": "sha512-eehKHKpab6E741ud7ZIMcXhKcP6TSIezPkNZhy5U8xC6+VvrRdUA2tMgxGxaGl4cz7c2Ew5+mg5+wNB16KQqrA==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", "dev": true }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "devOptional": true + "optional": true }, "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "optional": true, - "peer": true, + "scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "dev": true, "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" } }, "semver": { @@ -8682,82 +5438,13 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" }, - "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - } - } - }, - "serialised-error": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/serialised-error/-/serialised-error-1.1.3.tgz", - "integrity": "sha512-vybp3GItaR1ZtO2nxZZo8eOo7fnVaNtP3XE2vJKgzkKR2bagCkdJ1EpYYhEMd3qu/80DwQk9KjsNSxE3fXWq0g==", - "dev": true, - "requires": { - "object-hash": "^1.1.2", - "stack-trace": "0.0.9", - "uuid": "^3.0.0" - } - }, "serialize-javascript": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "devOptional": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "dev": true, "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" + "randombytes": "^2.1.0" } }, "set-blocking": { @@ -8766,17 +5453,16 @@ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", "dev": true }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "devOptional": true, "requires": { "shebang-regex": "^3.0.0" } @@ -8784,14 +5470,66 @@ "shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "devOptional": true + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "should": { + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/should/-/should-13.2.3.tgz", + "integrity": "sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==", + "dev": true, + "requires": { + "should-equal": "^2.0.0", + "should-format": "^3.0.3", + "should-type": "^1.4.0", + "should-type-adaptors": "^1.0.1", + "should-util": "^1.0.0" + } + }, + "should-equal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz", + "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==", + "dev": true, + "requires": { + "should-type": "^1.4.0" + } + }, + "should-format": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", + "integrity": "sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==", + "dev": true, + "requires": { + "should-type": "^1.3.0", + "should-type-adaptors": "^1.0.1" + } + }, + "should-type": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", + "integrity": "sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==", + "dev": true + }, + "should-type-adaptors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz", + "integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==", + "dev": true, + "requires": { + "should-type": "^1.3.0", + "should-util": "^1.0.0" + } + }, + "should-util": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.1.tgz", + "integrity": "sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==", + "dev": true }, "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "devOptional": true, "requires": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", @@ -8799,10 +5537,9 @@ } }, "signal-exit": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz", - "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==", - "devOptional": true + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "simple-swizzle": { "version": "0.2.2", @@ -8813,6 +5550,19 @@ "is-arrayish": "^0.3.1" } }, + "simple-websocket": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/simple-websocket/-/simple-websocket-9.1.0.tgz", + "integrity": "sha512-8MJPnjRN6A8UCp1I+H/dSFyjwJhp6wta4hsVRhjf8w9qBHRzxYt14RaOcjvQnhD1N4yKOddEjflwMnQM4VtXjQ==", + "dev": true, + "requires": { + "debug": "^4.3.1", + "queue-microtask": "^1.2.2", + "randombytes": "^2.1.0", + "readable-stream": "^3.6.0", + "ws": "^7.4.2" + } + }, "sinon": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.5.0.tgz", @@ -8833,6 +5583,21 @@ "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -8845,60 +5610,20 @@ "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", "is-fullwidth-code-point": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } } }, + "slugify": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.4.7.tgz", + "integrity": "sha512-tf+h5W1IrjNm/9rKKj0JU2MDMruiopx0jjVA5zCdBtcGjfp0+c5rHw/zADLC3IeKlGHtVbHtpfzvYA0OYT+HKg==", + "dev": true + }, "source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "optional": true }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "optional": true, - "peer": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "optional": true, - "peer": true - } - } - }, "spawn-wrap": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", @@ -8930,53 +5655,18 @@ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, - "sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, "stack-trace": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz", - "integrity": "sha512-vjUc6sfgtgY0dxCdnc40mK6Oftjo9+2K8H/NG81TMhgL392FtiPA9tn9RLyTxXmTLPJPjF3VyzFp6bsWFLisMQ==", + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", "dev": true }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "stickyfill": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stickyfill/-/stickyfill-1.1.1.tgz", + "integrity": "sha512-GCp7vHAfpao+Qh/3Flh9DXEJ/qSi0KJwJw6zYlZOtRYXWUIpMM6mC2rIep/dK8RQqwW0KxGJIllmjPIBOGN8AA==", "dev": true }, - "stdin-discarder": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.1.0.tgz", - "integrity": "sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==", - "optional": true, - "requires": { - "bl": "^5.0.0" - } - }, - "stream-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stream-length/-/stream-length-1.0.2.tgz", - "integrity": "sha512-aI+qKFiwoDV4rsXiS7WRoCt+v2RX1nUj17+KJC5r2gfh5xoSJIfP6Y3Do/HtvesFcTSWthIuJ3l1cvKQY/+nZg==", - "dev": true, - "requires": { - "bluebird": "^2.6.2" - } - }, "streamroller": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", @@ -8986,34 +5676,6 @@ "date-format": "^4.0.14", "debug": "^4.3.4", "fs-extra": "^8.1.0" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "optional": true, - "requires": { - "ms": "2.1.2" - } - } - } - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "devOptional": true, - "requires": { - "safe-buffer": "~5.2.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "devOptional": true - } } }, "string-template": { @@ -9023,14 +5685,61 @@ "optional": true }, "string-width": { - "version": "4.2.3", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "requires": { + "ansi-regex": "^6.0.1" + } + } + } + }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "devOptional": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" + }, + "dependencies": { + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + } + } + }, + "string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, "string.prototype.trimend": { @@ -9055,40 +5764,96 @@ "es-abstract": "^1.20.4" } }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "devOptional": true, "requires": { "ansi-regex": "^5.0.1" } }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true - }, - "strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "optional": true - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "devOptional": true - }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "optional": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "style-loader": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.3.tgz", + "integrity": "sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw==", + "dev": true + }, + "styled-components": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.3.tgz", + "integrity": "sha512-++4iHwBM7ZN+x6DtPPWkCI4vdtwumQ+inA/DdAsqYd4SVgUKJie5vXyzotA00ttcFdQkCng7zc6grwlfIfw+lw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/traverse": "^7.4.5", + "@emotion/is-prop-valid": "^0.8.8", + "@emotion/stylis": "^0.8.4", + "@emotion/unitless": "^0.7.4", + "babel-plugin-styled-components": ">= 1.12.0", + "css-to-react-native": "^3.0.0", + "hoist-non-react-statics": "^3.0.0", + "shallowequal": "^1.1.0", + "supports-color": "^5.5.0" + }, + "dependencies": { + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "devOptional": true, + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" } }, "supports-preserve-symlinks-flag": { @@ -9097,10 +5862,29 @@ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true }, + "swagger2openapi": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/swagger2openapi/-/swagger2openapi-7.0.8.tgz", + "integrity": "sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g==", + "dev": true, + "requires": { + "call-me-maybe": "^1.0.1", + "node-fetch": "^2.6.1", + "node-fetch-h2": "^2.3.0", + "node-readfiles": "^0.2.0", + "oas-kit-common": "^1.0.8", + "oas-resolver": "^2.5.6", + "oas-schema-walker": "^1.1.5", + "oas-validator": "^5.0.8", + "reftools": "^1.1.9", + "yaml": "^1.10.0", + "yargs": "^17.0.1" + } + }, "table": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz", - "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==", + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", + "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", "dev": true, "requires": { "ajv": "^8.0.1", @@ -9111,9 +5895,9 @@ }, "dependencies": { "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -9121,73 +5905,22 @@ "require-from-string": "^2.0.2", "uri-js": "^4.2.2" } - } - } - }, - "tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "optional": true, - "peer": true - }, - "teleport-javascript": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/teleport-javascript/-/teleport-javascript-1.0.0.tgz", - "integrity": "sha512-j1llvWVFyEn/6XIFDfX5LAU43DXe0GCt3NfXDwJ8XpRRMkS+i50SAkonAONBy+vxwPFBd50MFU8a2uj8R/ccLg==", - "dev": true - }, - "terser": { - "version": "5.16.8", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.8.tgz", - "integrity": "sha512-QI5g1E/ef7d+PsDifb+a6nnVgC4F22Bg6T0xrBrz6iloVB4PUkkunp6V8nzoOOZJIzjWVdAGqCdlKlhLq/TbIA==", - "optional": true, - "peer": true, - "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "dependencies": { - "acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "optional": true, - "peer": true }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "optional": true, - "peer": true - } - } - }, - "terser-webpack-plugin": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz", - "integrity": "sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==", - "optional": true, - "peer": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.17", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.16.5" - }, - "dependencies": { - "serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", - "optional": true, - "peer": true, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, "requires": { - "randombytes": "^2.1.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" } } } @@ -9201,6 +5934,27 @@ "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } } }, "text-hex": { @@ -9256,35 +6010,23 @@ "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "devOptional": true + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "devOptional": true, + "dev": true, "requires": { "is-number": "^7.0.0" } }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "dev": true }, - "tough-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", - "dev": true, - "requires": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, "tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", @@ -9298,21 +6040,38 @@ "dev": true }, "tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", "dev": true, "requires": { "@types/json5": "^0.0.29", - "json5": "^1.0.1", + "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true + } } }, "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", + "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", "optional": true }, "tunnel": { @@ -9321,12 +6080,6 @@ "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", "optional": true }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true - }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -9343,21 +6096,11 @@ "dev": true }, "type-fest": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.7.2.tgz", - "integrity": "sha512-f9BHrLjRJ4MYkfOsnC/53PNDzZJcVo14MqLp2+hXE39p5bgwqohxR5hDZztwxlbxmIVuvC2EFAKrAkokq23PLA==", + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "optional": true }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, "typed-array-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", @@ -9370,9 +6113,9 @@ } }, "typed-inject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/typed-inject/-/typed-inject-3.0.1.tgz", - "integrity": "sha512-5yr8inrNos7uo/irp5PZ7WNwmYGfoa0w1NiDdCWW6hhIxYH2NCqYwX9BUOXpZgxk964rb1ElEfvBtftuvIPpvw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typed-inject/-/typed-inject-4.0.0.tgz", + "integrity": "sha512-OuBL3G8CJlS/kjbGV/cN8Ni32+ktyyi6ADDZpKvksbX0fYBV5WcukhRCYa7WqLce7dY/Br2dwtmJ9diiadLFpg==", "optional": true }, "typed-rest-client": { @@ -9396,9 +6139,9 @@ } }, "uglify-js": { - "version": "3.16.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.16.3.tgz", - "integrity": "sha512-uVbFqx9vvLhQg0iBaau9Z75AxWJ8tqM9AV890dIZCLApF4rTcyHwmAvLeEdYRs+BzYWu8Iw81F79ah0EfTXbaw==", + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", "dev": true, "optional": true }, @@ -9412,14 +6155,6 @@ "has-bigints": "^1.0.2", "has-symbols": "^1.0.3", "which-boxed-primitive": "^1.0.2" - }, - "dependencies": { - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - } } }, "underscore": { @@ -9434,17 +6169,10 @@ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "optional": true }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true - }, "update-browserslist-db": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", - "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", - "devOptional": true, + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", "requires": { "escalade": "^3.1.1", "picocolors": "^1.0.0" @@ -9476,6 +6204,12 @@ } } }, + "url-template": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", + "integrity": "sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==", + "dev": true + }, "util": { "version": "0.12.5", "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", @@ -9492,71 +6226,19 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "devOptional": true - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" }, - "uvm": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/uvm/-/uvm-2.0.2.tgz", - "integrity": "sha512-Ra+aPiS5GXAbwXmyNExqdS42sTqmmx4XWEDF8uJlsTfOkKf9Rd9xNgav1Yckv4HfVEZg4iOFODWHFYuJ+9Fzfg==", - "dev": true, - "requires": { - "flatted": "3.1.1" - }, - "dependencies": { - "flatted": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", - "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", - "dev": true - } - } - }, "v8-compile-cache": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "optional": true, - "peer": true, - "requires": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - } - }, "wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", @@ -9567,80 +6249,31 @@ } }, "weapon-regex": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/weapon-regex/-/weapon-regex-1.0.3.tgz", - "integrity": "sha512-V8X6hPIzY1juvrSVREmtRhK9AHn/8c2z8XxaibESU+jyG/RinZ9x9x6aw8qEuFAi7R6Kl/EWGbU2Yq/9u6TTjw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/weapon-regex/-/weapon-regex-1.1.0.tgz", + "integrity": "sha512-DxCiBA0U7+5DSWs900rbkCScvLIyJgkYNrj1XRSLOq46mIHuIAMlwCilC1bVuAE+XBYq1+rjABSE/PfizKafxQ==", "optional": true }, - "webpack": { - "version": "5.77.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.77.0.tgz", - "integrity": "sha512-sbGNjBr5Ya5ss91yzjeJTLKyfiwo5C628AFjEa6WSXcZa4E+F57om3Cc8xLb1Jh0b243AWuSYRf3dn7HVeFQ9Q==", - "optional": true, - "peer": true, - "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "dependencies": { - "acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "optional": true, - "peer": true - }, - "acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "optional": true, - "peer": true, - "requires": {} - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "optional": true, - "peer": true - } - } + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true }, - "webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "optional": true, - "peer": true + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "devOptional": true, "requires": { "isexe": "^2.0.0" } @@ -9659,9 +6292,9 @@ } }, "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", "dev": true }, "which-typed-array": { @@ -9679,9 +6312,9 @@ } }, "winston": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.8.2.tgz", - "integrity": "sha512-MsE1gRx1m5jdTTO9Ld/vND4krP2To+lgDoMEHGGa4HIlAUyXJtfc7CxQcGXVyz2IBpw5hbFkj2b/AtUdQwyRew==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.9.0.tgz", + "integrity": "sha512-jW51iW/X95BCW6MMtZWr2jKQBP4hV5bIDq9QrIjfDk6Q9QuxvTKEAlpUNAzP+HYHFFCeENhph16s0zEunu4uuQ==", "dev": true, "requires": { "@colors/colors": "1.5.0", @@ -9695,6 +6328,20 @@ "stack-trace": "0.0.x", "triple-beam": "^1.3.0", "winston-transport": "^4.5.0" + }, + "dependencies": { + "async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + } } }, "winston-transport": { @@ -9724,42 +6371,62 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", - "devOptional": true + "dev": true }, "wrap-ansi": { - "version": "7.0.0", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "requires": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" + }, + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "requires": { + "ansi-regex": "^6.0.1" + } + } + } + }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "devOptional": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "devOptional": true, - "requires": { - "color-convert": "^2.0.1" - } + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "devOptional": true, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "requires": { - "color-name": "~1.1.4" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "devOptional": true } } }, @@ -9767,7 +6434,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "devOptional": true + "dev": true }, "write-file-atomic": { "version": "3.0.3", @@ -9781,10 +6448,16 @@ "typedarray-to-buffer": "^3.1.5" } }, + "ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "dev": true + }, "xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.0.tgz", + "integrity": "sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==", "requires": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" @@ -9811,19 +6484,30 @@ "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "devOptional": true + "dev": true }, "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "devOptional": true + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true + }, + "yaml-ast-parser": { + "version": "0.0.43", + "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz", + "integrity": "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==", + "dev": true }, "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "devOptional": true, + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.0.1.tgz", + "integrity": "sha512-xBBulfCc8Y6gLFcrPvtqKz9hz8SO0l1Ni8GgDekvBX2ro0HRQImDGnikfc33cgzcYUSncapnNcZDjVFIH3f6KQ==", + "dev": true, "requires": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -9832,31 +6516,64 @@ "string-width": "^4.2.0", "y18n": "^5.0.5", "yargs-parser": "^20.2.2" + }, + "dependencies": { + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + } } }, "yargs-parser": { "version": "20.2.4", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "devOptional": true + "dev": true }, "yargs-unparser": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "devOptional": true, + "dev": true, "requires": { "camelcase": "^6.0.0", "decamelize": "^4.0.0", "flat": "^5.0.2", "is-plain-obj": "^2.1.0" + }, + "dependencies": { + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + }, + "decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true + } } }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "devOptional": true + "dev": true } } } diff --git a/package.json b/package.json index 36237e6b..d20838d7 100644 --- a/package.json +++ b/package.json @@ -1,13 +1,13 @@ { "name": "f5-appsvcs", - "version": "3.45.0-5", + "version": "3.46.0-5", "license": "Apache-2.0", "scripts": { "build": "./scripts/build/build.sh", "buildperf": "F5_PERF_TRACING_ENABLED='true' npm run build", "build-schema": "node scripts/build/schema-build.js", "lint": "npx eslint .", - "make-api-docs": "redoc-cli bundle docs/openapi.yaml", + "make-api-docs": "redocly build-docs docs/openapi.yaml", "test": "npm run build-schema && mocha test/unit/ --recursive --exit", "test-no-build": "mocha test/unit/ --recursive --exit", "coverage": "nyc npm test", @@ -19,33 +19,31 @@ "misc": "mocha test/integration/bigip/misc --require test/integration/bigip/property/mochaHooks.js" }, "devDependencies": { - "@automation-toolchain/f5-appsvcs-schema": "^0.10.6", + "@automation-toolchain/f5-appsvcs-schema": "^0.11.5", "@f5devcentral/atg-shared-utilities-dev": "^0.2.13", "@f5devcentral/eslint-config-f5-atg": "^0.1.8", - "aws-sdk": "^2.1346.0", + "@redocly/cli": "^1.0.0-beta.128", + "aws-sdk": "^2.1396.0", "chai": "^4.3.7", "chai-as-promised": "^7.1.1", "eslint": "7.32.0", - "express": "^4.18.2", "f5-schema-doc": "file:packages/f5-schema-doc-0.1.0.tgz", - "json-schema-faker": "^0.5.0-rcv.46", - "mkdirp": "^2.1.6", + "json-schema-faker": "^0.5.3", + "mkdirp": "^3.0.1", "mocha": "^10.2.0", "mocha-multi-reporters": "^1.5.1", - "newman": "^5.3.2", "nock": "10.0.0", "nyc": "^15.1.0", "proxyquire": "^2.1.3", - "rimraf": "^4.4.1", + "rimraf": "^5.0.1", "sinon": "7.5.0", - "winston": "^3.8.2" + "winston": "^3.9.0" }, "optionalDependencies": { - "@stryker-mutator/core": "^6.4.2", - "@stryker-mutator/mocha-runner": "^6.4.2", + "@stryker-mutator/core": "^7.0.2", + "@stryker-mutator/mocha-runner": "^7.0.2", "error": "7.2.1", - "jaeger-client": "^3.19.0", - "redoc-cli": "0.13.21" + "jaeger-client": "^3.19.0" }, "nyc": { "reporter": [ @@ -65,9 +63,9 @@ ] }, "dependencies": { - "@f5devcentral/atg-shared-utilities": "^0.5.7", - "@f5devcentral/atg-storage": "^1.3.8", - "@f5devcentral/f5-teem": "^1.5.0", + "@f5devcentral/atg-shared-utilities": "^0.8.0", + "@f5devcentral/atg-storage": "^1.3.9", + "@f5devcentral/f5-teem": "^1.6.1", "ajv": "6.12.6", "deep-diff": "^1.0.2", "fast-deep-equal": "^3.1.3", @@ -76,7 +74,7 @@ "node-forge": "^1.3.1", "semver": "5.7.1", "uuid": "3.4.0", - "xml2js": "^0.4.23" + "xml2js": "^0.6.0" }, "eslintConfig": { "extends": "@f5devcentral/eslint-config-f5-atg", diff --git a/schema/3.46.0/as3-schema-3.46.0-4.json b/schema/3.46.0/as3-schema-3.46.0-4.json new file mode 100644 index 00000000..0148cb6d --- /dev/null +++ b/schema/3.46.0/as3-schema-3.46.0-4.json @@ -0,0 +1,35462 @@ +{ + "$id": "urn:uuid:85626792-9ee7-46bb-8fc8-4ba708cfdc1d", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "AS3 API Request", + "description": "BIG-IP AS3 API request body", + "oneOf": [ + { + "$ref": "#/definitions/AS3" + }, + { + "$ref": "#/definitions/ADC" + }, + { + "$ref": "#/definitions/AS3_Patch_Body" + }, + { + "$ref": "#/definitions/AS3_Array" + }, + { + "$ref": "#/definitions/ADC_Array" + } + ], + "definitions": { + "ADC": { + "title": "ADC", + "description": "A declarative configuration for an ADC such as F5 BIG-IP", + "type": "object", + "properties": { + "class": { + "title": "Class", + "description": "Indicates this JSON document is an ADC declaration", + "type": "string", + "const": "ADC" + }, + "$schema": { + "description": "URL of schema against which to validate. Used by validation in your local environment only (via Visual Studio Code, for example)", + "type": "string", + "format": "uri" + }, + "updateMode": { + "title": "Update mode", + "description": "When set to 'selective' (default) BIG-IP AS3 does not modify Tenants not referenced in the declaration. Otherwise ('complete') BIG-IP AS3 removes unreferenced Tenants.", + "type": "string", + "enum": [ + "complete", + "selective" + ], + "default": "selective" + }, + "schemaVersion": { + "title": "Schema version", + "description": "Version of ADC Declaration schema this declaration uses", + "type": "string", + "$comment": "IMPORTANT: In enum array, please put current schema version first, oldest-supported version last. Keep enum array sorted most-recent-first.", + "enum": [ + "3.46.0", + "3.45.0", + "3.44.0", + "3.43.0", + "3.42.0", + "3.41.0", + "3.40.0", + "3.39.0", + "3.38.0", + "3.37.0", + "3.36.0", + "3.35.0", + "3.34.0", + "3.33.0", + "3.32.0", + "3.31.0", + "3.30.0", + "3.29.0", + "3.28.0", + "3.27.0", + "3.26.0", + "3.25.0", + "3.24.0", + "3.23.0", + "3.22.0", + "3.21.0", + "3.20.0", + "3.19.0", + "3.18.0", + "3.17.0", + "3.16.0", + "3.15.0", + "3.14.0", + "3.13.0", + "3.12.0", + "3.11.0", + "3.10.0", + "3.9.0", + "3.8.0", + "3.7.0", + "3.6.0", + "3.5.0", + "3.4.0", + "3.3.0", + "3.2.0", + "3.1.0", + "3.0.0" + ] + }, + "id": { + "title": "Declaration ID", + "description": "Unique identifier for this declaration (max 255 printable chars with no spaces, quotation marks, angle brackets, nor backslashes)", + "type": "string", + "pattern": "^[^\\x00-\\x20\\x22'<>\\x5c^`|\\x7f]*$", + "minLength": 0, + "maxLength": 255 + }, + "target": { + "title": "Target Device", + "description": "Trusted target for config when configuring with BIG-IQ", + "type": "object", + "properties": { + "hostname": { + "title": "Host Name", + "description": "Host name of managed device to be configured", + "type": "string" + }, + "address": { + "title": "IP Address", + "description": "IP address of managed device to be configured", + "type": "string", + "format": "f5ip" + } + }, + "maxProperties": 1 + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "constants": { + "title": "Constants", + "description": "Declaration metadata and/or named values for (re-)use by declaration objects", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Constants", + "default": "Constants" + }, + "version": { + "title": "Declaration version", + "description": "Version number of declaration; update when you change contents but not ID (optional but recommended)", + "type": [ + "number", + "string" + ] + }, + "timestamp": { + "title": "Declaration timestamp", + "description": "Date+time (this version of) declaration was created (optional but recommended)", + "type": "string", + "format": "date-time" + } + }, + "additionalProperties": { + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object" + ], + "if": { + "type": "object", + "required": [ + "protected", + "ciphertext" + ] + }, + "then": { + "properties": { + "allowReuse": { + "title": "Allow reuse", + "description": "If true (default), different declaration objects may reuse a cryptogram, WHICH MAY POSE A SECURITY RISK!", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false, + "allOf": [ + { + "$ref": "#/definitions/JWE" + } + ] + } + }, + "propertyNames": { + "pattern": "^[A-Za-z][0-9A-Za-z_]*$", + "maxLength": 64 + } + }, + "Common": { + "title": "Common tenant", + "description": "Special tenant Common holds objects other tenants can share", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Tenant", + "default": "Tenant" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "verifiers": { + "title": "Verifiers", + "description": "Data (in 'key':'value' properties) used to verify automated tests. Ordinary declarations do not need this", + "type": "object" + }, + "enable": { + "title": "Enable", + "description": "If declared, you must enable the Common tenant", + "type": "boolean", + "const": true + }, + "Shared": { + "$ref": "#/definitions/Application_Shared" + }, + "constants": { + "$ref": "#/definitions/Constants" + }, + "controls": { + "$ref": "#/definitions/Controls" + }, + "optimisticLockKey": { + "title": "Optimistic lock key", + "description": "When you deploy a declaration with a non-empty 'key' value here, that activates an optimistic lock on changes to this Tenant. If the key in your declaration does not match the key BIG-IP AS3 computes for the most-recent previous declaration, then BIG-IP AS3 will NOT update this Tenant and will return an error code. To use optimistic locking, first retrieve a declaration using option 'showHash=true' to get the current per-Tenant keys. Make any changes you desire, then deploy your updated declaration. Deployment of each Tenant with a key will succeed only if that Tenant has not been modified since the time you retrieved the declaration. (To overwrite all previous changes to a Tenant simply do NOT include any opportunistic-lock key for that Tenant when you deploy a declaration. That is the default.) Note that only keys computed by BIG-IP AS3 may be used here-- you cannot generate your own. If 'showHash=true' is used on a POST then the optimisticLockKey will be shown as a part of the output (This helps to avoid the need to do a GET request).", + "type": "string", + "maxLength": 128, + "default": "" + } + }, + "additionalProperties": false + }, + "controls": { + "$ref": "#/definitions/Controls" + }, + "scratch": { + "title": "f5 scratch", + "description": "Holds some system data during declaration processing", + "type": "string", + "readOnly": true + } + }, + "additionalProperties": { + "$ref": "#/definitions/Tenant" + }, + "propertyNames": { + "oneOf": [ + { + "pattern": "^[A-Za-z][0-9A-Za-z_.-]*$", + "maxLength": 190 + }, + { + "enum": [ + "$schema" + ] + } + ] + }, + "required": [ + "class", + "schemaVersion" + ] + }, + "ADC_Array": { + "title": "Declaration Array", + "description": "An array of declarations (ADC) to process", + "type": "array", + "items": { + "$ref": "#/definitions/ADC" + }, + "minItems": 1 + }, + "AS3_Patch_Item": { + "type": "object", + "title": "AS3 PATCH item", + "description": "Defines a PATCH operation to perform", + "properties": { + "op": { + "title": "Op", + "description": "Operation to perform", + "type": "string" + }, + "path": { + "title": "Path", + "description": "Declaration Object Path relative to URI on which the operation is to be performed", + "type": "string" + }, + "value": { + "title": "Value", + "description": "Value to use for the operation", + "type": [ + "string", + "number", + "boolean", + "object", + "array" + ] + }, + "target": { + "title": "Optional Target Device", + "description": "Optional target device (only applies when configuring with certain hosts such as BIG-IQ)", + "type": "object", + "properties": { + "hostname": { + "title": "Host Name", + "description": "Host name of managed device to be configured", + "type": "string" + }, + "address": { + "title": "IP Address", + "description": "IP address of managed device to be configured", + "type": "string", + "format": "f5ip" + } + }, + "maxProperties": 1 + } + }, + "required": [ + "op", + "path" + ] + }, + "AS3_Patch_Body": { + "title": "AS3 PATCH Body", + "description": "An array containing the patch operations to apply on the declaration", + "type": "array", + "items": { + "$ref": "#/definitions/AS3_Patch_Item" + }, + "$comment": "Refer to docs for additional information on patch request syntax", + "minItems": 1 + }, + "AS3": { + "title": "AS3 Request", + "description": "A body with AS3 Class", + "type": "object", + "properties": { + "class": { + "title": "Class", + "description": "Indicates a BIG-IP AS3 request", + "type": "string", + "const": "AS3" + }, + "$schema": { + "description": "URL of schema against which to validate. Used by validation in your local environment only (via Visual Studio Code, for example)", + "type": "string", + "format": "uri" + }, + "action": { + "title": "Action", + "description": "Indicates desired action: 'deploy' means deploy the included declaration to targetHost; 'dry-run' does NOT deploy the declaration but does do everything short of changing targetHost's configuration; 'patch' modifies the declaration based on the provided set of commands and then deploys the updated declaration; 'redeploy' causes an old declaration from targetHost's declaration history to be re-deployed (property redeployAge (default 0) selects the old declaration, and note redeployUpdateMode as well); 'retrieve' returns a copy of a previously-deployed declaration; 'remove' deletes the declaration or declaration component.", + "type": "string", + "enum": [ + "deploy", + "dry-run", + "patch", + "redeploy", + "retrieve", + "remove" + ], + "default": "deploy" + }, + "redeployAge": { + "title": "Redeploy age", + "description": "For action=redeploy (only), chooses which old declaration to deploy again. Value 0 (default) means re-deploy the most recent declaration (the one which set the current configuration of targetHost-- useful to erase changes introduced by manual configuration). Value 1 means re-deploy the declaration prior to the most-recent one, etc. Note that whenever re-deploying an old declaration causes ADC configuration changes, that declaration becomes the current declaration (age 0) and the ages of all other declarations in the history increase (0 => 1, 1 => 2, u.s.w.)", + "type": "integer", + "minimum": 0, + "maximum": 15, + "default": 0 + }, + "redeployUpdateMode": { + "title": "Redeploy update mode", + "description": "Value 'original' (default) means re-deploy the chosen declaration using its original updateMode (which if not explicitly specified in that declaration will default to 'selective'). Otherwise, forces the updateMode for re-deployment to 'complete' or 'selective' as specified. Remember, 'selective' updates do not affect Tenants not explicitly named. To simply roll-back the targetHost configuration to the state it had immediately after deploying some earlier declaration, put 'complete' here (that will remove Tenants created later than the redeployAge declaration). To use action=redeploy as a simple roll-back facility, always deploy (updateMode=)complete declarations.", + "type": "string", + "enum": [ + "original", + "complete", + "selective" + ], + "default": "original" + }, + "persist": { + "title": "Persist on device", + "description": "When true (default) make the whole working configuration persistent on targetHost after (and only if) this request deploys any changes. If false, leave the working configuration in memory only (if targetHost restart, you may lose the configuration from memory)", + "type": "boolean", + "default": true + }, + "syncToGroup": { + "title": "Sync to device group", + "description": "Name (like /Common/my_dg) of the config-sync group TO which the system should synchronize the targetHost configuration after (and only if) this request deploys any changes. When empty (default) this request will not affect config-sync at all. Leave undefined or empty whenever you use auto-sync or manage configuration synchronization separately", + "type": "string", + "default": "" + }, + "historyLimit": { + "title": "History limit", + "description": "This value (default 4) limits the number of previously-deployed declarations saved on targetHost for review using GET and for use with POST action=redeploy and redeployAge=N. The limit includes the current and immediately-previous declarations so may not be less than two", + "type": "number", + "minimum": 2, + "maximum": 15, + "default": 4 + }, + "logLevel": { + "title": "Log level", + "description": "Controls level of detail in logs using RFC 5424 severity levels (default is 'warning'). Portions of declaration may use different logLevels", + "type": "string", + "enum": [ + "emergency", + "alert", + "critical", + "error", + "warning", + "notice", + "info", + "debug" + ], + "default": "warning" + }, + "trace": { + "title": "Trace", + "description": "If true, BIG-IP AS3 creates a detailed trace of the configuration process for subsequent analysis (default false). May be overridden on a per-Declaration and/or per-Tenant basis. Warning: trace files may contain sensitive configuration data", + "type": "boolean", + "default": false + }, + "retrieveAge": { + "title": "Retrieve age", + "description": "Use this property with action=retrieve. You can usually get a copy of the declaration most recently deployed to targetHost, and often copies of previously-deployed declarations are also available. Value 0 (default) means 'the last-deployed declaration,' value 1 means 'the declaration previous to 0' and so-forth. To get a list of available declarations, set value 'list'", + "oneOf": [ + { + "type": "integer", + "minimum": 0 + }, + { + "type": "string", + "const": "list" + } + ], + "default": 0 + }, + "targetHost": { + "title": "Target host", + "description": "Hostname or IP address of ADC to which request applies (default localhost)", + "type": "string", + "anyOf": [ + { + "format": "hostname" + }, + { + "format": "f5ip" + } + ], + "default": "localhost" + }, + "targetPort": { + "title": "Target port", + "description": "TCP port number of management service on targetHost; default 0 means auto-discover", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 0 + }, + "targetUsername": { + "title": "Target username", + "description": "Username of principal authorized to modify configuration of targetHost (may not include the character ':'). NOTE: this is generally not required to configure 'localhost' because client authentication and authorization precede invocation of BIG-IP AS3. It is also not required for any targetHost if you populate targetTokens", + "type": "string", + "pattern": "^[^:]*$", + "maxLength": 254 + }, + "targetPassphrase": { + "title": "Target passphrase", + "description": "Passphrase for targetUsername account. This is generally not required to configure 'localhost' and is not required when you populate targetTokens", + "type": "string", + "maxLength": 254 + }, + "targetTokens": { + "title": "Target tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABC123') you want to send with queries to the targetHost management service as authentication/authorization tokens", + "type": "object", + "patternProperties": { + "^[^\\x00-\\x20:\\x7f-\\xff]{1,254}$": { + "title": "HTTP header", + "type": "string", + "pattern": "^[^\\x00-\\x1f\\x7f-\\xff]*$", + "maxLength": 8192 + } + }, + "additionalProperties": false + }, + "targetTimeout": { + "title": "Target timeout", + "description": "Maximum delay allowed while communicating with targetHost device (seconds, default 150)", + "type": "integer", + "minimum": 1, + "maximum": 900, + "default": 150 + }, + "resourceTimeout": { + "title": "Resource timeout", + "description": "Maximum delay allowed while communicating with URL resources (seconds, default 5)", + "type": "integer", + "minimum": 1, + "maximum": 900, + "default": 5 + }, + "declaration": { + "$ref": "#/definitions/ADC" + }, + "patchBody": { + "$ref": "#/definitions/AS3_Patch_Body" + } + }, + "dependencies": { + "declaration": { + "not": { + "required": [ + "patchBody" + ] + } + }, + "patchBody": { + "not": { + "required": [ + "declaration" + ] + } + } + }, + "required": [ + "class" + ] + }, + "AS3_Array": { + "title": "AS3 Array", + "description": "An array of BIG-IP AS3 requests to process", + "type": "array", + "items": { + "$ref": "#/definitions/AS3" + }, + "minItems": 1 + }, + "Include": { + "title": "Include", + "description": "Defines inclusion of one part of the schema into another", + "type": "object", + "properties": { + "include": { + "description": "Keyword to allow for inclusion of one part of the declaration into another", + "oneOf": [ + { + "type": "string", + "format": "f5pointer" + }, + { + "type": "array", + "items": { + "type": "string", + "format": "f5pointer" + } + } + ], + "f5PostProcess": { + "tag": "include", + "data": "object" + } + } + } + }, + "Tenant": { + "title": "Tenant", + "description": "Declares a Tenant", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Tenant" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "verifiers": { + "title": "Verifiers", + "description": "Data (in 'key':'value' properties) used to verify automated tests. Ordinary declarations do not need this", + "type": "object" + }, + "enable": { + "title": "Enable", + "description": "Tenant handles traffic only when enabled (default)", + "type": "boolean", + "default": true + }, + "defaultRouteDomain": { + "title": "Default route domain", + "description": "Using the route-domain ID, this property selects the default route domain for IP traffic to and from this Tenant's application resources (note: affects declared IP addresses which do not include a %RD route-domain specifier). You must choose an existing route domain--this option cannot create one. Route domain 0 (default) is always available", + "$comment": "TMSH forces this value to be an integer", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 0, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query net route-domain" + ] + } + }, + "Shared": { + "$ref": "#/definitions/Application_Shared" + }, + "constants": { + "$ref": "#/definitions/Constants" + }, + "controls": { + "$ref": "#/definitions/Controls" + }, + "optimisticLockKey": { + "title": "Optimistic lock key", + "description": "When you deploy a declaration with a non-empty 'key' value here, that activates an optimistic lock on changes to this Tenant. If the key in your declaration does not match the key BIG-IP AS3 computes for the most-recent previous declaration, then BIG-IP AS3 will NOT update this Tenant and will return an error code. To use optimistic locking, first retrieve a declaration using option 'showHash=true' to get the current per-Tenant keys. Make any changes you desire, then deploy your updated declaration. Deployment of each Tenant with a key will succeed only if that Tenant has not been modified since the time you retrieved the declaration. (To overwrite all previous changes to a Tenant simply do NOT include any opportunistic-lock key for that Tenant when you deploy a declaration. That is the default.) Note that only keys computed by BIG-IP AS3 may be used here-- you cannot generate your own. If 'showHash=true' is used on a POST then the optimisticLockKey will be shown as a part of the output (This helps to avoid the need to do a GET request).", + "type": "string", + "maxLength": 128, + "default": "" + } + }, + "additionalProperties": { + "$ref": "#/definitions/Application" + }, + "propertyNames": { + "pattern": "^[A-Za-z][0-9A-Za-z_.-]*$", + "maxLength": 190 + }, + "required": [ + "class" + ] + }, + "Application_Shared": { + "title": "Shared Application", + "description": "Special application Shared holds objects other applications can share", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Application" + }, + "template": { + "title": "Template Name", + "description": "Shared Application template is always generic", + "type": "string", + "const": "shared" + }, + "enable": { + "title": "Enable", + "description": "If declared, you must enable the Shared Application", + "type": "boolean", + "const": true, + "default": true + } + }, + "allOf": [ + { + "$ref": "#/definitions/Application" + } + ], + "required": [ + "class", + "template" + ] + }, + "Application": { + "title": "Application", + "description": "Application declaration main schema", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Application" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "template": { + "title": "Template Name", + "description": "Each application type has certain required and default elements and selects appropriate setup of various ADC/Security features", + "type": "string", + "default": "generic" + }, + "schemaOverlay": { + "title": "Schema Overlay", + "description": "BIG-IQ name for a supplemental validation schema is applied to the Application class definition before the main BIG-IP AS3 schema", + "type": "string" + }, + "enable": { + "title": "Enable", + "description": "Application handles traffic only when enabled (default)", + "type": "boolean", + "default": true + }, + "constants": { + "$ref": "#/definitions/Constants" + }, + "serviceMain": { + "description": "Primary service of the application" + } + }, + "additionalProperties": { + "properties": { + "class": { + "type": "string", + "enum": [ + "Service_HTTP", + "Service_HTTPS", + "Service_TCP", + "Service_UDP", + "Service_SCTP", + "Service_L4", + "Service_Generic", + "Service_Forwarding", + "Service_Address", + "SNAT_Pool", + "SNAT_Translation", + "WAF_Policy", + "Persist", + "Pool", + "Address_Discovery", + "Monitor", + "TLS_Server", + "TLS_Client", + "FIX_Profile", + "RTSP_Profile", + "SIP_Profile", + "Statistics_Profile", + "TFTP_Profile", + "FTP_Profile", + "HTML_Rule", + "HTML_Profile", + "WebSocket_Profile", + "Multiplex_Profile", + "SOCKS_Profile", + "TCP_Profile", + "Classification_Profile", + "Radius_Profile", + "IP_Other_Profile", + "Rewrite_Profile", + "Stream_Profile", + "Access_Profile", + "Per_Request_Access_Policy", + "ICAP_Profile", + "Adapt_Profile", + "Cipher_Rule", + "Cipher_Group", + "iFile", + "Firewall_Address_List", + "Firewall_Port_List", + "Firewall_Rule_List", + "Firewall_Policy", + "NAT_Policy", + "NAT_Source_Translation", + "Protocol_Inspection_Profile", + "SSH_Proxy_Profile", + "Data_Group", + "DNS_Cache", + "DNS_Profile", + "DNS_TSIG_Key", + "DNS_Zone", + "DNS_Nameserver", + "DOS_Profile", + "GSLB_Domain", + "GSLB_iRule", + "GSLB_Monitor", + "GSLB_Pool", + "GSLB_Server", + "GSLB_Data_Center", + "GSLB_Prober_Pool", + "GSLB_Topology_Records", + "GSLB_Topology_Region", + "ALG_Log_Profile", + "Security_Log_Profile", + "Traffic_Log_Profile", + "Endpoint_Policy", + "Endpoint_Strategy", + "Bandwidth_Control_Policy", + "Idle_Timeout_Policy", + "Net_Address_List", + "Net_Port_List", + "Enforcement_Policy", + "Enforcement_Diameter_Endpoint_Profile", + "Enforcement_iRule", + "Enforcement_Radius_AAA_Profile", + "Enforcement_Profile", + "Enforcement_Subscriber_Management_Profile", + "Enforcement_Listener", + "Enforcement_Interception_Endpoint", + "Enforcement_Format_Script", + "Enforcement_Forwarding_Endpoint", + "Enforcement_Service_Chain_Endpoint", + "Analytics_Profile", + "Analytics_TCP_Profile", + "CA_Bundle", + "Certificate", + "Certificate_Validator_OCSP", + "DNS_Logging_Profile", + "HTTP_Acceleration_Profile", + "HTTP_Compress", + "HTTP_Profile", + "HTTP2_Profile", + "iRule", + "L4_Profile", + "Log_Destination", + "Log_Publisher", + "UDP_Profile" + ] + } + }, + "allOf": [ + { + "if": { + "properties": { + "class": { + "const": "Service_HTTP" + } + } + }, + "then": { + "$ref": "#/definitions/Service_HTTP" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Service_HTTPS" + } + } + }, + "then": { + "$ref": "#/definitions/Service_HTTPS" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Service_TCP" + } + } + }, + "then": { + "$ref": "#/definitions/Service_TCP" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Service_UDP" + } + } + }, + "then": { + "$ref": "#/definitions/Service_UDP" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Service_SCTP" + } + } + }, + "then": { + "$ref": "#/definitions/Service_SCTP" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Service_L4" + } + } + }, + "then": { + "$ref": "#/definitions/Service_L4" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Service_Generic" + } + } + }, + "then": { + "$ref": "#/definitions/Service_Generic" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Service_Forwarding" + } + } + }, + "then": { + "$ref": "#/definitions/Service_Forwarding" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Service_Address" + } + } + }, + "then": { + "$ref": "#/definitions/Service_Address" + } + }, + { + "if": { + "properties": { + "class": { + "const": "SNAT_Pool" + } + } + }, + "then": { + "$ref": "#/definitions/SNAT_Pool" + } + }, + { + "if": { + "properties": { + "class": { + "const": "SNAT_Translation" + } + } + }, + "then": { + "$ref": "#/definitions/SNAT_Translation" + } + }, + { + "if": { + "properties": { + "class": { + "const": "WAF_Policy" + } + } + }, + "then": { + "$ref": "#/definitions/WAF_Policy" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Persist" + } + } + }, + "then": { + "$ref": "#/definitions/Persist" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Pool" + } + } + }, + "then": { + "$ref": "#/definitions/Pool" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Address_Discovery" + } + } + }, + "then": { + "$ref": "#/definitions/Address_Discovery" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Monitor" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor" + } + }, + { + "if": { + "properties": { + "class": { + "const": "TLS_Server" + } + } + }, + "then": { + "$ref": "#/definitions/TLS_Server" + } + }, + { + "if": { + "properties": { + "class": { + "const": "TLS_Client" + } + } + }, + "then": { + "$ref": "#/definitions/TLS_Client" + } + }, + { + "if": { + "properties": { + "class": { + "const": "FIX_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/FIX_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "RTSP_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/RTSP_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "SIP_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/SIP_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Statistics_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Statistics_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "TFTP_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/TFTP_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "FTP_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/FTP_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "HTML_Rule" + } + } + }, + "then": { + "$ref": "#/definitions/HTML_Rule" + } + }, + { + "if": { + "properties": { + "class": { + "const": "HTML_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/HTML_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "WebSocket_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/WebSocket_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Multiplex_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Multiplex_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "SOCKS_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/SOCKS_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "TCP_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/TCP_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Classification_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Classification_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Radius_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Radius_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "IP_Other_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/IP_Other_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Rewrite_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Rewrite_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Stream_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Stream_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Access_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Access_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Per_Request_Access_Policy" + } + } + }, + "then": { + "$ref": "#/definitions/Per_Request_Access_Policy" + } + }, + { + "if": { + "properties": { + "class": { + "const": "ICAP_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/ICAP_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Adapt_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Adapt_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Cipher_Rule" + } + } + }, + "then": { + "$ref": "#/definitions/Cipher_Rule" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Cipher_Group" + } + } + }, + "then": { + "$ref": "#/definitions/Cipher_Group" + } + }, + { + "if": { + "properties": { + "class": { + "const": "iFile" + } + } + }, + "then": { + "$ref": "#/definitions/iFile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Firewall_Address_List" + } + } + }, + "then": { + "$ref": "#/definitions/Firewall_Address_List" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Firewall_Port_List" + } + } + }, + "then": { + "$ref": "#/definitions/Firewall_Port_List" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Firewall_Rule_List" + } + } + }, + "then": { + "$ref": "#/definitions/Firewall_Rule_List" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Firewall_Policy" + } + } + }, + "then": { + "$ref": "#/definitions/Firewall_Policy" + } + }, + { + "if": { + "properties": { + "class": { + "const": "NAT_Policy" + } + } + }, + "then": { + "$ref": "#/definitions/NAT_Policy" + } + }, + { + "if": { + "properties": { + "class": { + "const": "NAT_Source_Translation" + } + } + }, + "then": { + "$ref": "#/definitions/NAT_Source_Translation" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Protocol_Inspection_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Protocol_Inspection_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "SSH_Proxy_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/SSH_Proxy_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Data_Group" + } + } + }, + "then": { + "$ref": "#/definitions/Data_Group" + } + }, + { + "if": { + "properties": { + "class": { + "const": "DNS_Cache" + } + } + }, + "then": { + "$ref": "#/definitions/DNS_Cache" + } + }, + { + "if": { + "properties": { + "class": { + "const": "DNS_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/DNS_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "DNS_TSIG_Key" + } + } + }, + "then": { + "$ref": "#/definitions/DNS_TSIG_Key" + } + }, + { + "if": { + "properties": { + "class": { + "const": "DNS_Zone" + } + } + }, + "then": { + "$ref": "#/definitions/DNS_Zone" + } + }, + { + "if": { + "properties": { + "class": { + "const": "DNS_Nameserver" + } + } + }, + "then": { + "$ref": "#/definitions/DNS_Nameserver" + } + }, + { + "if": { + "properties": { + "class": { + "const": "DOS_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/DOS_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "GSLB_Domain" + } + } + }, + "then": { + "$ref": "#/definitions/GSLB_Domain" + } + }, + { + "if": { + "properties": { + "class": { + "const": "GSLB_iRule" + } + } + }, + "then": { + "$ref": "#/definitions/GSLB_iRule" + } + }, + { + "if": { + "properties": { + "class": { + "const": "GSLB_Monitor" + } + } + }, + "then": { + "$ref": "#/definitions/GSLB_Monitor" + } + }, + { + "if": { + "properties": { + "class": { + "const": "GSLB_Pool" + } + } + }, + "then": { + "$ref": "#/definitions/GSLB_Pool" + } + }, + { + "if": { + "properties": { + "class": { + "const": "GSLB_Server" + } + } + }, + "then": { + "$ref": "#/definitions/GSLB_Server" + } + }, + { + "if": { + "properties": { + "class": { + "const": "GSLB_Data_Center" + } + } + }, + "then": { + "$ref": "#/definitions/GSLB_Data_Center" + } + }, + { + "if": { + "properties": { + "class": { + "const": "GSLB_Prober_Pool" + } + } + }, + "then": { + "$ref": "#/definitions/GSLB_Prober_Pool" + } + }, + { + "if": { + "properties": { + "class": { + "const": "GSLB_Topology_Records" + } + } + }, + "then": { + "$ref": "#/definitions/GSLB_Topology_Records" + } + }, + { + "if": { + "properties": { + "class": { + "const": "GSLB_Topology_Region" + } + } + }, + "then": { + "$ref": "#/definitions/GSLB_Topology_Region" + } + }, + { + "if": { + "properties": { + "class": { + "const": "ALG_Log_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/ALG_Log_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Security_Log_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Security_Log_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Traffic_Log_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Traffic_Log_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Endpoint_Policy" + } + } + }, + "then": { + "$ref": "#/definitions/Endpoint_Policy" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Endpoint_Strategy" + } + } + }, + "then": { + "$ref": "#/definitions/Endpoint_Strategy" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Bandwidth_Control_Policy" + } + } + }, + "then": { + "$ref": "#/definitions/Bandwidth_Control_Policy" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Idle_Timeout_Policy" + } + } + }, + "then": { + "$ref": "#/definitions/Idle_Timeout_Policy" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Net_Address_List" + } + } + }, + "then": { + "$ref": "#/definitions/Net_Address_List" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Net_Port_List" + } + } + }, + "then": { + "$ref": "#/definitions/Net_Port_List" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Enforcement_Policy" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Policy" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Enforcement_Diameter_Endpoint_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Diameter_Endpoint_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Enforcement_iRule" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_iRule" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Enforcement_Radius_AAA_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Radius_AAA_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Enforcement_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Enforcement_Subscriber_Management_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Subscriber_Management_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Enforcement_Listener" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Listener" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Enforcement_Interception_Endpoint" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Interception_Endpoint" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Enforcement_Format_Script" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Format_Script" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Enforcement_Forwarding_Endpoint" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Forwarding_Endpoint" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Enforcement_Service_Chain_Endpoint" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Service_Chain_Endpoint" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Analytics_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Analytics_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Analytics_TCP_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Analytics_TCP_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "CA_Bundle" + } + } + }, + "then": { + "$ref": "#/definitions/CA_Bundle" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Certificate" + } + } + }, + "then": { + "$ref": "#/definitions/Certificate" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Certificate_Validator_OCSP" + } + } + }, + "then": { + "$ref": "#/definitions/Certificate_Validator_OCSP" + } + }, + { + "if": { + "properties": { + "class": { + "const": "DNS_Logging_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/DNS_Logging_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "HTTP_Acceleration_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/HTTP_Acceleration_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "HTTP_Compress" + } + } + }, + "then": { + "$ref": "#/definitions/HTTP_Compress" + } + }, + { + "if": { + "properties": { + "class": { + "const": "HTTP_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/HTTP_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "HTTP2_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/HTTP2_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "iRule" + } + } + }, + "then": { + "$ref": "#/definitions/IRule" + } + }, + { + "if": { + "properties": { + "class": { + "const": "L4_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/L4_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Log_Destination" + } + } + }, + "then": { + "$ref": "#/definitions/Log_Destination" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Log_Publisher" + } + } + }, + "then": { + "$ref": "#/definitions/Log_Publisher" + } + }, + { + "if": { + "properties": { + "class": { + "const": "UDP_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/UDP_Profile" + } + } + ] + }, + "propertyNames": { + "pattern": "^[A-Za-z]([0-9A-Za-z_.-]{0,188}[0-9A-Za-z_.])?$", + "maxLength": 190 + }, + "allOf": [ + { + "if": { + "required": [ + "template" + ], + "properties": { + "template": { + "const": "https" + } + } + }, + "then": { + "$ref": "#/definitions/Template_https" + } + }, + { + "if": { + "required": [ + "template" + ], + "properties": { + "template": { + "const": "http" + } + } + }, + "then": { + "$ref": "#/definitions/Template_http" + } + }, + { + "if": { + "required": [ + "template" + ], + "properties": { + "template": { + "const": "tcp" + } + } + }, + "then": { + "$ref": "#/definitions/Template_tcp" + } + }, + { + "if": { + "required": [ + "template" + ], + "properties": { + "template": { + "const": "udp" + } + } + }, + "then": { + "$ref": "#/definitions/Template_udp" + } + }, + { + "if": { + "required": [ + "template" + ], + "properties": { + "template": { + "const": "sctp" + } + } + }, + "then": { + "$ref": "#/definitions/Template_sctp" + } + }, + { + "if": { + "required": [ + "template" + ], + "properties": { + "template": { + "const": "l4" + } + } + }, + "then": { + "$ref": "#/definitions/Template_l4" + } + }, + { + "if": { + "required": [ + "template" + ], + "properties": { + "template": { + "const": "generic" + } + } + }, + "then": { + "$ref": "#/definitions/Template_generic" + } + } + ], + "required": [ + "class" + ] + }, + "Template_https": { + "title": "HTTPS application", + "description": "Declares an HTTPS application", + "type": "object", + "properties": { + "serviceMain": { + "$ref": "#/definitions/Service_HTTPS" + } + }, + "required": [ + "serviceMain" + ] + }, + "Template_http": { + "title": "HTTP application", + "description": "Declares an HTTP application", + "type": "object", + "properties": { + "serviceMain": { + "$ref": "#/definitions/Service_HTTP" + } + }, + "required": [ + "serviceMain" + ] + }, + "Template_tcp": { + "title": "TCP application", + "description": "Declares a TCP application", + "type": "object", + "properties": { + "serviceMain": { + "$ref": "#/definitions/Service_TCP" + } + }, + "required": [ + "serviceMain" + ] + }, + "Template_udp": { + "title": "UDP application", + "description": "Declares a UDP application", + "type": "object", + "properties": { + "serviceMain": { + "$ref": "#/definitions/Service_UDP" + } + }, + "required": [ + "serviceMain" + ] + }, + "Template_sctp": { + "title": "SCTP application", + "description": "Declares a SCTP application", + "type": "object", + "properties": { + "serviceMain": { + "$ref": "#/definitions/Service_SCTP" + } + }, + "required": [ + "serviceMain" + ] + }, + "Template_l4": { + "title": "L4 application", + "description": "Declares a L4 application", + "type": "object", + "properties": { + "serviceMain": { + "$ref": "#/definitions/Service_L4" + } + }, + "required": [ + "serviceMain" + ] + }, + "Template_generic": { + "title": "Generic application", + "description": "Declares a generic application", + "type": "object", + "properties": { + "template": { + "title": "Template Name", + "description": "In addition to 'generic' and 'shared' other values may appear here for extensibility", + "type": "string" + }, + "serviceMain": { + "$ref": "#/definitions/Service_Generic" + } + } + }, + "Service_HTTP": { + "title": "Service_HTTP", + "description": "HTTP virtual server", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Service_HTTP" + }, + "virtualPort": { + "title": "Virtual server TCP port", + "description": "Default 80 is well-known HTTP port. Accepts either an integer or a reference to a Firewall_Port_List that contains the ports on which to listen. Firewall_Port_List is only supported on BIG-IP 14.1 and later. If a Firewall_Port_List is provided, BIG-IP AS3 will create a traffic-matching-criteria for the virtual.", + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Port_List" + }, + { + "f5PostProcess": { + "tag": "minVersion", + "data": { + "version": "14.1", + "strict": true + } + } + } + ] + } + ], + "default": 80 + } + }, + "allOf": [ + { + "$ref": "#/definitions/Service_HTTP_Core" + } + ], + "dependencies": { + "serverTLS": { + "not": {} + }, + "profileConnectivity": { + "oneOf": [ + { + "required": [ + "profileAccess" + ] + }, + { + "required": [ + "policyIAM" + ] + } + ] + }, + "policyPerRequestAccess": { + "oneOf": [ + { + "required": [ + "profileAccess" + ] + }, + { + "required": [ + "policyIAM" + ] + } + ] + } + }, + "required": [ + "class" + ] + }, + "Service_HTTPS": { + "title": "Service_HTTPS", + "description": "HTTPS (HTTP+TLS) virtual server", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Service_HTTPS" + }, + "virtualPort": { + "title": "Virtual server TCP port", + "description": "Default 443 is well-known HTTPS port. Accepts either an integer or a reference to a Firewall_Port_List that contains the ports on which to listen. Firewall_Port_List is only supported on BIG-IP 14.1 and later. If a Firewall_Port_List is provided, BIG-IP AS3 will create a traffic-matching-criteria for the virtual.", + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Port_List" + }, + { + "f5PostProcess": { + "tag": "minVersion", + "data": { + "version": "14.1", + "strict": true + } + } + } + ] + } + ], + "default": 443 + }, + "redirect80": { + "title": "Redirect HTTP", + "description": "If true, BIG-IP AS3 redirects HTTP traffic to any virtualAddress on port 80 to virtualPort", + "type": "boolean", + "default": true + }, + "profileHTTP2": { + "title": "HTTP/2 profile", + "type": [ + "string", + "object" + ], + "description": "HTTP/2 profile; name of built-in or else BIG-IP AS3 pointer", + "oneOf": [ + { + "type": "string", + "enum": [ + "basic" + ] + }, + { + "$ref": "#/definitions/Pointer_HTTP2_Profile" + }, + { + "type": "object", + "properties": { + "ingress": { + "type": "object", + "description": "Ingress (client-side context) HTTP2 profile. This property is available on BIGIP 14.1 and above.", + "allOf": [ + { + "$ref": "#/definitions/Pointer_HTTP2_Profile" + } + ] + }, + "egress": { + "type": "object", + "description": "Egress (server-side context) HTTP2 profile. This property is available on BIGIP 14.1 and above.", + "allOf": [ + { + "$ref": "#/definitions/Pointer_HTTP2_Profile" + } + ] + } + }, + "minProperties": 1, + "maxProperties": 1, + "additionalProperties": false + } + ] + } + }, + "allOf": [ + { + "$ref": "#/definitions/Service_HTTP_Core" + } + ], + "dependencies": { + "serverTLS": { + "properties": { + "serverTLS": { + "minLength": 1 + } + } + } + }, + "required": [ + "class", + "serverTLS" + ] + }, + "Service_HTTP_Core": { + "title": "HTTP VS core", + "type": "object", + "description": "Core attributes of HTTP(S) virtual server", + "properties": { + "persistenceMethods": { + "title": "Persistence methods", + "description": "Default 'cookie' is generally good. Use 'persistenceMethods: []' for no persistence.", + "type": "array", + "items": { + "$ref": "#/definitions/Basic_Persist" + }, + "default": [ + "cookie" + ] + }, + "profileAnalytics": { + "$ref": "#/definitions/Pointer_Analytics_Profile" + }, + "profileAnalyticsTcp": { + "$ref": "#/definitions/Pointer_Analytics_TCP_Profile" + }, + "profileHTTP": { + "title": "HTTP profile", + "description": "HTTP profile; name of built-in or else BIG-IP AS3 pointer", + "oneOf": [ + { + "type": "string", + "enum": [ + "basic" + ] + }, + { + "$ref": "#/definitions/Pointer_HTTP_Profile" + } + ], + "default": "basic" + }, + "profileHTTPCompression": { + "title": "HTTP compression profile", + "description": "HTTP compression profile; name of built-in or else BIG-IP AS3 pointer", + "if": { + "not": { + "type": "object" + } + }, + "then": { + "type": "string", + "enum": [ + "basic", + "wan" + ] + }, + "else": { + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to HTTP compression profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "HTTP_Compress" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP HTTP compression profile", + "description": "Pathname of existing BIG-IP HTTP compression profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile http-compression" + ] + } + } + }, + "profileHTTPAcceleration": { + "title": "Web acceleration profile", + "description": "Web acceleration profile; name of built-in or else BIG-IP AS3 pointer", + "if": { + "not": { + "type": "object" + } + }, + "then": { + "type": "string", + "enum": [ + "basic" + ] + }, + "else": { + "$ref": "#/definitions/Pointer_HTTP_Acceleration_Profile" + } + }, + "profileHTML": { + "$ref": "#/definitions/Pointer_HTML_Profile" + }, + "profileMultiplex": { + "title": "Multiplex profile", + "description": "Multiplex (OneConnect) profile; name of built-in or else BIG-IP AS3 pointer", + "if": { + "not": { + "type": "object" + } + }, + "then": { + "type": "string", + "enum": [ + "basic" + ] + }, + "else": { + "$ref": "#/definitions/Pointer_Multiplex_Profile" + } + }, + "profileNTLM": { + "$ref": "#/definitions/Pointer_NTLM_Profile" + }, + "policyWAF": { + "$ref": "#/definitions/Pointer_WAF_Policy" + }, + "policyIAM": { + "title": "IAM policy", + "description": "BIG-IP AS3 pointer to IAM (APM) policy declaration", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "apm" + ] + } + }, + { + "$ref": "#/definitions/Pointer_Access_Profile" + } + ] + }, + "profileFPS": { + "description": "FPS Profile to attach to service", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "fps" + ] + } + }, + { + "$ref": "#/definitions/Pointer_FPS_Profile" + } + ] + }, + "profileRequestAdapt": { + "$ref": "#/definitions/Pointer_Request_Adapt_Profile" + }, + "profileResponseAdapt": { + "$ref": "#/definitions/Pointer_Response_Adapt_Profile" + }, + "profileAccess": { + "title": "Access profile", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "apm" + ] + } + }, + { + "$ref": "#/definitions/Pointer_Access_Profile" + } + ] + }, + "profileConnectivity": { + "title": "Connectivity profile", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "apm" + ] + } + }, + { + "$ref": "#/definitions/Pointer_Connectivity_Profile" + } + ] + }, + "policyPerRequestAccess": { + "title": "Per Request Access Policy", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "apm" + ] + } + }, + { + "$ref": "#/definitions/Pointer_Per_Request_Access_Policy" + } + ] + }, + "profileVdi": { + "title": "VDI profile", + "description": "VDI profile to attach to service.", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "apm" + ] + } + }, + { + "$ref": "#/definitions/Pointer_VDI_Profile" + } + ] + }, + "profileApiProtection": { + "title": "API Protection Profile", + "description": "API protection profile to attach to service. This property is available on BIGIP 14.1 and above.", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "apm", + "asm" + ] + } + }, + { + "$ref": "#/definitions/Pointer_API_Protection_Profile" + } + ] + }, + "profileDOS": { + "$ref": "#/definitions/Pointer_DOS_Profile" + }, + "profileBotDefense": { + "description": "Attaches a Bot Defense profile to the service. This property is available on BIGIP 14.1 and above.", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Bot_Defense_Profile" + } + ] + }, + "profileWebSocket": { + "description": "Attaches a WebSocket profile to the Service.", + "allOf": [ + { + "$ref": "#/definitions/Pointer_WebSocket_Profile" + } + ] + } + }, + "allOf": [ + { + "if": { + "properties": { + "policyIAM": {} + }, + "required": [ + "policyIAM" + ] + }, + "then": { + "not": { + "properties": { + "profileAccess": {} + }, + "required": [ + "profileAccess" + ] + } + } + }, + { + "$ref": "#/definitions/Service_TCP_Core" + } + ], + "required": [ + "class" + ] + }, + "Service_TCP": { + "title": "Service_TCP", + "description": "Declares a TCP virtual server (w/optional TLS)", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Service_TCP" + }, + "mqttEnabled": { + "title": "MQTT profile", + "description": "Attaches the MQTT profile /Common/mqtt. MQTT profiles have no configurable properties.", + "type": "boolean", + "default": false + }, + "persistenceMethods": { + "title": "Persistence methods", + "description": "Default 'source-address' is generally good. Use 'persistenceMethods: []' for no persistence.", + "type": "array", + "items": { + "$ref": "#/definitions/Basic_Persist" + }, + "default": [ + "source-address" + ] + }, + "profileSIP": { + "$ref": "#/definitions/Pointer_SIP_Profile" + }, + "profileFTP": { + "$ref": "#/definitions/Pointer_FTP_Profile" + }, + "profileILX": { + "$ref": "#/definitions/Pointer_ILX_Profile" + }, + "profilePPTP": { + "$ref": "#/definitions/Pointer_PPTP_Profile" + }, + "profileRTSP": { + "$ref": "#/definitions/Pointer_RTSP_Profile" + }, + "profileSOCKS": { + "$ref": "#/definitions/Pointer_SOCKS_Profile" + }, + "profileICAP": { + "$ref": "#/definitions/Pointer_ICAP_Profile" + } + }, + "allOf": [ + { + "$ref": "#/definitions/Service_TCP_Core" + } + ], + "required": [ + "class" + ], + "if": { + "not": { + "properties": { + "virtualType": { + "const": "internal" + } + } + } + }, + "then": { + "required": [ + "virtualPort" + ], + "not": { + "required": [ + "profileICAP" + ] + } + } + }, + "Service_TCP_Core": { + "title": "Service_TCP core", + "description": "Core attributes of TCP virtual server", + "type": "object", + "properties": { + "virtualType": { + "title": "Virtual addresses", + "description": "Type of the virtual", + "type": "string", + "enum": [ + "standard", + "internal" + ], + "default": "standard" + }, + "virtualPort": { + "title": "virtual server TCP port", + "description": "Accepts either an integer or a reference to a Firewall_Port_List that contains the ports on which to listen. Firewall_Port_List is only supported on BIG-IP 14.1 and later. If a Firewall_Port_List is provided, BIG-IP AS3 will create a traffic-matching-criteria for the virtual.", + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Port_List" + }, + { + "f5PostProcess": { + "tag": "minVersion", + "data": { + "version": "14.1", + "strict": true + } + } + } + ] + } + ], + "minimum": 0, + "maximum": 65535 + }, + "layer4": { + "title": "L4 protocol", + "description": "For TCP virtual server, Layer 4 protocol must be TCP", + "type": "string", + "const": "tcp", + "default": "tcp" + }, + "profileFIX": { + "$ref": "#/definitions/Pointer_FIX_Profile" + }, + "profileTCP": { + "title": "TCP profile", + "description": "TCP profile; name of built-in or else BIG-IP AS3 pointer", + "if": { + "not": { + "type": "object" + } + }, + "then": { + "type": "string", + "enum": [ + "normal", + "lan", + "wan", + "mobile" + ] + }, + "else": { + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to TCP profile declaration for ingress and egress", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "TCP_Profile" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP TCP profile", + "description": "Pathname of existing BIG-IP TCP profile for both ingress and egress", + "type": "string", + "format": "f5bigip" + }, + "ingress": { + "title": "Ingress profile", + "description": "Ingress (client-side context) TCP profile", + "if": { + "not": { + "type": "object" + } + }, + "then": { + "type": "string", + "enum": [ + "normal", + "lan", + "wan", + "mobile" + ], + "default": "normal" + }, + "else": { + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to TCP profile declaration for incoming connections", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "TCP_Profile" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP TCP profile", + "description": "Pathname of existing BIG-IP TCP profile in client-side context", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1 + } + }, + "egress": { + "title": "Egress TCP profile", + "description": "Egress (server-side context) TCP profile", + "if": { + "not": { + "type": "object" + } + }, + "then": { + "type": "string", + "enum": [ + "normal", + "lan", + "wan", + "mobile" + ], + "default": "normal" + }, + "else": { + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to TCP profile declaration for outgoing connections", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "TCP_Profile" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP server-side TCP profile", + "description": "Pathname of existing BIG-IP TCP profile in server-side context", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1 + } + } + }, + "additionalProperties": false, + "dependencies": { + "use": { + "minProperties": 1, + "maxProperties": 1 + }, + "bigip": { + "minProperties": 1, + "maxProperties": 1 + }, + "ingress": { + "minProperties": 2, + "maxProperties": 2 + }, + "egress": { + "minProperties": 2, + "maxProperties": 2 + } + }, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile tcp" + ] + } + }, + "default": "normal" + }, + "profileAnalyticsTcp": { + "$ref": "#/definitions/Pointer_Analytics_TCP_Profile" + }, + "profileSSHProxy": { + "$ref": "#/definitions/Pointer_SSH_Proxy_Profile" + }, + "serverTLS": { + "title": "TLS server", + "description": "BIG-IP AS3 pointer to TLS Server declaration", + "if": { + "type": "string" + }, + "then": { + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "TLS_Server" + } + }, + "required": [ + "class" + ] + } + } + }, + "else": { + "if": { + "type": "object" + }, + "then": { + "$ref": "#/definitions/Pointer_Existing_TLS_Server_Profile" + }, + "else": { + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Existing_TLS_Server_Profile" + } + } + } + }, + "clientTLS": { + "title": "TLS client", + "description": "BIG-IP AS3 pointer to TLS Client declaration", + "if": { + "type": "string" + }, + "then": { + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "TLS_Client" + } + }, + "required": [ + "class" + ] + } + } + }, + "else": { + "if": { + "type": "object" + }, + "then": { + "$ref": "#/definitions/Pointer_Existing_TLS_Client_Profile" + }, + "else": { + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Existing_TLS_Client_Profile" + } + } + } + }, + "policyEndpoint": { + "title": "Endpoint policy", + "description": "BIG-IP AS3 pointer to Endpoint policy declaration", + "if": { + "type": "array" + }, + "then": { + "items": { + "$ref": "#/definitions/Pointer_Endpoint_Policy" + } + }, + "else": { + "$ref": "#/definitions/Pointer_Endpoint_Policy" + } + }, + "profileStream": { + "$ref": "#/definitions/Pointer_Stream_Profile" + } + }, + "allOf": [ + { + "$ref": "#/definitions/Service_Core" + } + ] + }, + "Service_UDP": { + "title": "Service_UDP", + "description": "Declares a UDP virtual server (w/optional (D)TLS)", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Service_UDP" + }, + "persistenceMethods": { + "title": "Persistence methods", + "description": "Default 'source-address' is generally good. Use 'persistenceMethods: []' for no persistence.", + "type": "array", + "items": { + "$ref": "#/definitions/Basic_Persist" + }, + "default": [ + "source-address" + ] + } + }, + "allOf": [ + { + "$ref": "#/definitions/Service_UDP_Core" + } + ], + "required": [ + "class" + ], + "if": { + "not": { + "properties": { + "virtualType": { + "const": "internal" + } + } + } + }, + "then": { + "required": [ + "virtualPort" + ] + }, + "dependencies": { + "virtualType": { + "if": { + "properties": { + "virtualType": { + "const": "stateless" + } + } + }, + "then": { + "properties": { + "translateClientPort": { + "const": false + }, + "translateServerPort": { + "const": false + } + }, + "required": [ + "pool" + ] + } + } + } + }, + "Service_UDP_Core": { + "title": "Service_UDP core", + "description": "Core attributes of UDP virtual server", + "type": "object", + "properties": { + "virtualType": { + "title": "Virtual addresses", + "description": "Type of the virtual", + "type": "string", + "enum": [ + "standard", + "internal", + "stateless" + ], + "default": "standard" + }, + "virtualPort": { + "title": "Virtual server UDP port", + "description": "Accepts either an integer or a reference to a Firewall_Port_List that contains the ports on which to listen. Firewall_Port_List is only supported on BIG-IP 14.1 and later. If a Firewall_Port_List is provided, BIG-IP AS3 will create a traffic-matching-criteria for the virtual.", + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Port_List" + }, + { + "f5PostProcess": { + "tag": "minVersion", + "data": { + "version": "14.1", + "strict": true + } + } + } + ] + } + ], + "minimum": 0, + "maximum": 65535 + }, + "layer4": { + "title": "L4 protocol", + "description": "For UDP virtual server, Layer 4 protocol must be UDP", + "type": "string", + "const": "udp", + "default": "udp" + }, + "profileUDP": { + "title": "UDP profile", + "description": "UDP profile; name of built-in or else BIG-IP AS3 pointer", + "if": { + "not": { + "type": "object" + } + }, + "then": { + "type": "string", + "enum": [ + "normal" + ] + }, + "else": { + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to UDP profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "UDP_Profile" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP UDP profile", + "description": "Pathname of existing BIG-IP UDP profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile udp" + ] + } + }, + "default": "normal" + }, + "serverTLS": { + "title": "TLS server", + "description": "BIG-IP AS3 pointer to TLS Server declaration", + "if": { + "type": "string" + }, + "then": { + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "TLS_Server" + } + }, + "required": [ + "class" + ] + } + } + }, + "else": { + "if": { + "type": "object" + }, + "then": { + "$ref": "#/definitions/Pointer_Existing_TLS_Server_Profile" + }, + "else": { + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Existing_TLS_Server_Profile" + } + } + } + }, + "clientTLS": { + "title": "TLS client", + "description": "BIG-IP AS3 pointer to TLS Client declaration", + "if": { + "type": "string" + }, + "then": { + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "TLS_Client" + } + }, + "required": [ + "class" + ] + } + } + }, + "else": { + "if": { + "type": "object" + }, + "then": { + "$ref": "#/definitions/Pointer_Existing_TLS_Client_Profile" + }, + "else": { + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Existing_TLS_Client_Profile" + } + } + } + }, + "policyEndpoint": { + "title": "Endpoint policy", + "description": "BIG-IP AS3 pointer to Endpoint policy declaration", + "if": { + "type": "array" + }, + "then": { + "items": { + "$ref": "#/definitions/Pointer_Endpoint_Policy" + } + }, + "else": { + "$ref": "#/definitions/Pointer_Endpoint_Policy" + } + }, + "profileRADIUS": { + "$ref": "#/definitions/Pointer_Radius_Profile" + }, + "profileSIP": { + "$ref": "#/definitions/Pointer_SIP_Profile" + }, + "profileTFTP": { + "$ref": "#/definitions/Pointer_TFTP_Profile" + } + }, + "allOf": [ + { + "$ref": "#/definitions/Service_Core" + } + ] + }, + "Service_SCTP": { + "title": "Service_SCTP", + "description": "Declares a SCTP virtual server", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Service_SCTP" + }, + "virtualPort": { + "title": "virtual server SCTP port", + "description": "Accepts either an integer or a reference to a Firewall_Port_List that contains the ports on which to listen. Firewall_Port_List is only supported on BIG-IP 14.1 and later. If a Firewall_Port_List is provided, BIG-IP AS3 will create a traffic-matching-criteria for the virtual.", + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Port_List" + }, + { + "f5PostProcess": { + "tag": "minVersion", + "data": { + "version": "14.1", + "strict": true + } + } + } + ] + } + ], + "minimum": 0, + "maximum": 65535 + }, + "profileSCTP": { + "$ref": "#/definitions/Pointer_SCTP_Profile" + }, + "layer4": { + "title": "L4 protocol", + "description": "For SCTP virtual server, Layer 4 protocol must be SCTP", + "type": "string", + "const": "sctp", + "default": "sctp" + } + }, + "allOf": [ + { + "$ref": "#/definitions/Service_Core" + } + ], + "required": [ + "class", + "virtualPort" + ] + }, + "Service_L4": { + "title": "Service_L4", + "description": "Declares a L4 (FastL4) virtual server", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Service_L4" + }, + "persistenceMethods": { + "title": "Persistence methods", + "description": "Default 'source-address' is generally good. Use 'persistenceMethods: []' for no persistence.", + "type": "array", + "items": { + "$ref": "#/definitions/Basic_Persist" + }, + "default": [ + "source-address" + ] + } + }, + "allOf": [ + { + "$ref": "#/definitions/Service_L4_Core" + } + ], + "required": [ + "class", + "virtualPort" + ], + "not": { + "required": [ + "profileTrafficLog" + ] + } + }, + "Service_Generic": { + "title": "Service_Generic", + "description": "Declares an 'Any IP' (IPOther) virtual server", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Service_Generic" + }, + "layer4": { + "title": "L4 protocol", + "description": "The L4 protocol type for this virtual server", + "type": "string", + "default": "any" + }, + "profileIPOther": { + "allOf": [ + { + "$ref": "#/definitions/Pointer_IP_Other_Profile" + } + ], + "default": { + "bigip": "/Common/ipother" + } + } + }, + "allOf": [ + { + "$ref": "#/definitions/Service_L4_Core" + } + ], + "required": [ + "class" + ] + }, + "Service_L4_Core": { + "title": "Service_L4 core", + "description": "Core attributes of L4 virtual server", + "type": "object", + "properties": { + "virtualPort": { + "title": "virtual server TCP port", + "description": "Accepts either an integer or a reference to a Firewall_Port_List that contains the ports on which to listen. Firewall_Port_List is only supported on BIG-IP 14.1 and later. If a Firewall_Port_List is provided, BIG-IP AS3 will create a traffic-matching-criteria for the virtual.", + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Port_List" + }, + { + "f5PostProcess": { + "tag": "minVersion", + "data": { + "version": "14.1", + "strict": true + } + } + } + ] + } + ], + "minimum": 0, + "maximum": 65535 + }, + "layer4": { + "title": "L4 protocol", + "description": "The L4 protocol type for this virtual server", + "type": "string", + "enum": [ + "any", + "tcp", + "udp", + "3pc", + "a/n", + "ah", + "argus", + "aris", + "ax.25", + "bbn-rcc", + "bna", + "br-sat-mon", + "cbt", + "cftp", + "chaos", + "compaq-peer", + "cphb", + "cpnx", + "crdup", + "crtp", + "dccp", + "dcn", + "ddp", + "ddx", + "dgp", + "dsr", + "egp", + "eigrp", + "emcon", + "encap", + "esp", + "etherip", + "fc", + "fire", + "ggp", + "gmtp", + "gre", + "hip", + "hmp", + "hopopt", + "i-nlsp", + "iatp", + "icmp", + "idpr", + "idpr-cmtp", + "idrp", + "ifmp", + "igmp", + "igp", + "il", + "ip", + "ipcomp", + "ipcv", + "ipencap", + "ipip", + "iplt", + "ippc", + "ipv6", + "ipv6-auth", + "ipv6-crypt", + "ipv6-frag", + "ipv6-icmp", + "ipv6-nonxt", + "ipv6-opts", + "ipv6-route", + "ipx-in-ip", + "irtp", + "isis", + "iso-ip", + "iso-tp4", + "kryptolan", + "l2tp", + "larp", + "leaf-1", + "leaf-2", + "manet", + "merit-inp", + "mfe-nsp", + "micp", + "mobile", + "mpls-in-ip", + "mtp", + "mux", + "narp", + "netblt", + "nsfnet-igp", + "nvp", + "ospf", + "pgm", + "pim", + "pipe", + "pnni", + "prm", + "ptp", + "pup", + "pvp", + "qnx", + "rdp", + "rsvp", + "rsvp-e2e-ignore", + "rvd", + "sat-expak", + "sat-mon", + "scc-sp", + "scps", + "sctp", + "sdrp", + "secure-vmtp", + "shim6", + "skip", + "sm", + "smp", + "snp", + "sprite-rpc", + "sps", + "srp", + "sscopmce", + "st", + "stp", + "sun-nd", + "swipe", + "tcf", + "tlsp", + "tp++", + "trunk-1", + "trunk-2", + "ttp", + "udplite", + "uti", + "vines", + "visa", + "vmtp", + "vrrp", + "wb-expak", + "wb-mon", + "wesp", + "wsn", + "xnet", + "xns-idp", + "xtp" + ], + "default": "tcp" + }, + "profileFIX": { + "$ref": "#/definitions/Pointer_FIX_Profile" + }, + "profileL4": { + "title": "L4 profile", + "description": "L4 profile; name of built-in or else BIG-IP AS3 pointer", + "if": { + "not": { + "type": "object" + } + }, + "then": { + "type": "string", + "enum": [ + "basic" + ] + }, + "else": { + "$ref": "#/definitions/Pointer_L4_Profile" + }, + "default": "basic" + }, + "profileAnalyticsTcp": { + "$ref": "#/definitions/Pointer_Analytics_TCP_Profile" + } + }, + "allOf": [ + { + "$ref": "#/definitions/Service_Core" + } + ] + }, + "Service_Forwarding": { + "title": "Service_Forwarding", + "description": "Attributes of a forwarding virtual server. ARP and ICMP Echo will be disabled on virtualAddresses by default.", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Service_Forwarding" + }, + "forwardingType": { + "title": "Forwarding Type", + "description": "Controls whether the forwarding service uses IP or L2 forwarding", + "type": "string", + "enum": [ + "ip", + "l2" + ] + }, + "layer4": { + "title": "L4 protocol", + "description": "Layer 4 protocol", + "type": "string", + "default": "any" + }, + "profileL4": { + "title": "L4 profile", + "description": "L4 profile; name of built-in or else BIG-IP AS3 pointer", + "if": { + "not": { + "type": "object" + } + }, + "then": { + "type": "string", + "enum": [ + "basic" + ] + }, + "else": { + "$ref": "#/definitions/Pointer_L4_Profile" + } + } + }, + "allOf": [ + { + "if": { + "properties": { + "forwardingType": { + "const": "ip" + } + } + }, + "then": { + "properties": { + "translateServerPort": { + "type": "boolean", + "default": false, + "const": false + }, + "translateServerAddress": { + "type": "boolean", + "default": false, + "const": false + } + } + } + }, + { + "$ref": "#/definitions/Service_Core" + } + ], + "required": [ + "class", + "forwardingType" + ], + "not": { + "anyOf": [ + { + "required": [ + "fallbackPersistenceMethod" + ] + }, + { + "required": [ + "persistenceMethods" + ] + }, + { + "required": [ + "pool" + ] + }, + { + "required": [ + "profileBotDefense" + ] + }, + { + "required": [ + "profileDiameterEndpoint" + ] + }, + { + "required": [ + "profileDNS" + ] + }, + { + "required": [ + "profileIPOther" + ] + }, + { + "required": [ + "profileProtocolInspection" + ] + }, + { + "required": [ + "profileRewrite" + ] + }, + { + "required": [ + "profileTrafficLog" + ] + }, + { + "required": [ + "sourceAddress" + ] + } + ] + } + }, + "Service_Core": { + "title": "Virtual-server core", + "description": "Core attributes of a virtual server", + "type": "object", + "properties": { + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "virtualAddresses": { + "title": "Virtual addresses", + "description": "Accepts either an array or a reference to an Address_List which contains destination addresses to which this virtual will listen. To accept connections only from certain subnet(s), replace IP address in the provided array with array [IP-address, accept-from-subnet]. IP address in the provided array can also be replaced by a reference to a Service_Address. A reference to an Address_List is only supported on BIG-IP 14.1 and later. If an Address_List is provided, BIG-IP AS3 will create a traffic-matching-criteria for the virtual.", + "oneOf": [ + { + "type": "array", + "f5PostProcess": { + "tag": "virtualAddress" + }, + "items": { + "if": { + "type": "string" + }, + "then": { + "format": "f5ip" + }, + "else": { + "if": { + "type": "array" + }, + "then": { + "type": "array", + "items": { + "title": "Virtual address", + "if": { + "type": "string" + }, + "then": { + "format": "f5ip" + }, + "else": { + "$ref": "#/definitions/Pointer_Service_Address" + } + }, + "minItems": 2, + "maxItems": 2, + "uniqueItems": true + }, + "else": { + "$ref": "#/definitions/Pointer_Service_Address" + } + } + }, + "minItems": 1, + "uniqueItems": true + }, + { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Address_List" + }, + { + "f5PostProcess": { + "tag": "minVersion", + "data": { + "version": "14.1", + "strict": true + } + } + } + ] + } + ] + }, + "serviceDownImmediateAction": { + "title": "Service Down Immediate Action", + "description": "Specifies the immediate action the BIG-IP system should respond with upon the receipt of the initial client's SYN packet if the availability status of the virtual server is Offline or Unavailable. This is supported for the virtual server of Standard type and TCP protocol. The default value is none.", + "type": "string", + "enum": [ + "none", + "drop", + "reset" + ], + "default": "none" + }, + "shareAddresses": { + "title": "Share addresses", + "description": "A user set boolean that indicates whether the virtualAddresses should be added to or checked for /Common instead of the tenant. This value defaults to false, and so will put the virtualAddresses into their tenant.", + "type": "boolean", + "default": false + }, + "sourceAddress": { + "title": "Source address", + "description": "Accepts either a string or a reference to an Address_List which contains source addresses from which this virtual will listen. A reference to an Address_List is only supported on BIG-IP 14.1 and later. If an Address_List is provided, BIG-IP AS3 will create a traffic-matching-criteria for the virtual.", + "oneOf": [ + { + "type": "string", + "format": "f5ip" + }, + { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Address_List" + }, + { + "f5PostProcess": { + "tag": "minVersion", + "data": { + "version": "14.1", + "strict": true + } + } + } + ] + } + ] + }, + "enable": { + "title": "Enable", + "description": "Virtual server handles traffic only when enabled (default)", + "type": "boolean", + "default": true + }, + "maxConnections": { + "title": "Maximum connections", + "description": "Specifies the maximum number of concurrent connections you want to allow for the virtual server", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "snat": { + "title": "SNAT", + "description": "Name of built-in SNAT method or BIG-IP AS3 pointer to SNAT pool. If 'self', the system uses the virtual-server address as SNAT address", + "if": { + "not": { + "type": "object" + } + }, + "then": { + "type": "string", + "enum": [ + "none", + "self", + "auto" + ] + }, + "else": { + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to SNAT pool declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "SNAT_Pool" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP SNAT pool", + "description": "Pathname of existing BIG-IP SNAT pool", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm snatpool" + ] + } + }, + "default": "auto" + }, + "iRules": { + "title": "iRules", + "description": "List iRules for this virtual server (order is significant)", + "type": "array", + "items": { + "title": "iRule", + "description": "BIG-IP AS3 pointer to iRule (declared separately)", + "if": { + "type": "string" + }, + "then": { + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "iRule" + } + }, + "required": [ + "class" + ] + } + } + }, + "else": { + "type": "object", + "properties": { + "bigip": { + "title": "BIG-IP iRule", + "description": "Pathname of existing BIG-IP iRule", + "type": "string", + "format": "f5bigip" + }, + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to iRule (declared separately)", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "iRule" + } + }, + "required": [ + "class" + ] + } + } + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm rule" + ] + } + } + }, + "$comment": "uniqueItems: true" + }, + "pool": { + "title": "Pool", + "description": "BIG-IP AS3 pointer to pool if any (declared separately)", + "if": { + "type": "string" + }, + "then": { + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Pool" + } + }, + "required": [ + "class" + ] + } + } + }, + "else": { + "type": "object", + "properties": { + "bigip": { + "title": "BIG-IP pool", + "description": "Pathname of existing BIG-IP pool", + "type": "string", + "format": "f5bigip" + }, + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to pool if any (declared separately)", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Pool" + } + }, + "required": [ + "class" + ] + } + } + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm pool" + ] + } + } + }, + "addressStatus": { + "title": "Address status", + "description": "Specifies whether the virtual server will contribute to the operational status of the associated virtual address", + "type": "boolean", + "default": true + }, + "mirroring": { + "title": "Mirroring", + "description": "Controls connection-mirroring for high-availability", + "type": "string", + "enum": [ + "none", + "L4" + ], + "default": "none" + }, + "policyBandwidthControl": { + "title": "Bandwidth Control Policy", + "description": "BIG-IP AS3 pointer to Bandwidth Control Policy (policy must be static)", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Bandwidth_Control_Policy" + } + ] + }, + "policyFirewallEnforced": { + "title": "Firewall policy (enforced)", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + } + }, + { + "$ref": "#/definitions/Pointer_Firewall_Policy" + } + ] + }, + "policyFirewallStaged": { + "title": "Firewall policy (staged)", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + } + }, + { + "$ref": "#/definitions/Pointer_Firewall_Policy" + } + ] + }, + "policyNAT": { + "description": "BIG-IP AS3 pointer to NAT policy declaration", + "type": "object", + "properties": { + "bigip": { + "title": "BIG-IP NAT policy", + "description": "Pathname of existing BIG-IP NAT policy", + "type": "string", + "format": "f5bigip" + }, + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to NAT policy declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "NAT_Policy" + } + }, + "required": [ + "class" + ] + } + } + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + } + }, + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security nat policy" + ] + } + } + ] + }, + "policyIdleTimeout": { + "$ref": "#/definitions/Pointer_Idle_Timeout_Policy" + }, + "lastHop": { + "title": "Last hop", + "description": "Name of built-in last-hop method or BIG-IP AS3 pointer to last-hop pool (default 'default' means use system setting)", + "if": { + "not": { + "type": "object" + } + }, + "then": { + "type": "string", + "enum": [ + "default", + "auto", + "disable" + ] + }, + "else": { + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to last-hop pool declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Pool" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP last-hop pool", + "description": "Pathname of existing BIG-IP pool", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm pool" + ] + } + }, + "default": "default" + }, + "translateClientPort": { + "title": "Translate client port", + "description": "If true, hide client's port number from server. A value of true is the same as the string 'change' while a value of false is the same as the string 'preserve'. The value 'preserve-strict' is the only other allowed value for a string", + "type": [ + "boolean", + "string" + ], + "default": false, + "oneOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "change", + "preserve", + "preserve-strict" + ] + } + ] + }, + "translateServerAddress": { + "title": "Translate server address", + "description": "If true (default), make server-side connection to server address (otherwise, treat server as gateway to virtual-server address)", + "type": "boolean", + "default": true + }, + "translateServerPort": { + "title": "Translate server port", + "description": "If true (default), make server-side connection to server port (otherwise, connect to server on virtual-server port)", + "type": "boolean", + "default": true + }, + "nat64Enabled": { + "title": "Translate IPv6 to IPv4", + "description": "If true, translate IPv6 traffic into IPv4 (default false)", + "type": "boolean", + "default": false + }, + "httpMrfRoutingEnabled": { + "title": "HTTP MRF Router", + "description": "Specifies whether to use the HTTP message routing framework (MRF) functionality. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + }, + "persistenceMethods": { + "title": "Persistence method(s)", + "description": "List of persistence methods (each by name or BIG-IP AS3 pointer). Element 0 is primary (default) persistence method. Use 'persistenceMethods: []' for no persistence.", + "type": "array", + "items": { + "$ref": "#/definitions/Basic_Persist" + }, + "$comment": "uniqueItems: true" + }, + "fallbackPersistenceMethod": { + "$ref": "#/definitions/Basic_Persist" + }, + "allowVlans": { + "title": "VLAN list to allow", + "description": "Names of existing VLANs to add to this virtual server to allow.", + "type": "array", + "items": { + "bigip": { + "title": "BIG-IP VLAN", + "description": "Pathname of existing BIG-IP VLAN", + "type": "string", + "format": "f5bigip" + } + } + }, + "rejectVlans": { + "title": "VLAN list to reject", + "description": "Names of existing VLANs to add to this virtual server to reject.", + "type": "array", + "items": { + "bigip": { + "title": "BIG-IP VLAN", + "description": "Pathname of existing BIG-IP VLAN", + "type": "string", + "format": "f5bigip" + } + } + }, + "securityLogProfiles": { + "title": "Security Log Profiles", + "description": "Specifies the log profile applied to the virtual server", + "type": "array", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm", + "asm" + ] + }, + "items": { + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to security log profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Security_Log_Profile" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP security log profile", + "description": "Pathname of existing BIG-IP security log profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security log profile" + ] + } + } + }, + "profileDiameterEndpoint": { + "$ref": "#/definitions/Pointer_Enforcement_Diameter_Endpoint_Profile" + }, + "profileEnforcement": { + "$ref": "#/definitions/Pointer_Enforcement_Profile" + }, + "profileSubscriberManagement": { + "$ref": "#/definitions/Pointer_Enforcement_Subscriber_Management_Profile" + }, + "profileIPOther": { + "$ref": "#/definitions/Pointer_IP_Other_Profile" + }, + "profileClassification": { + "$ref": "#/definitions/Pointer_Classification_Profile" + }, + "profileDNS": { + "$ref": "#/definitions/Pointer_DNS_Profile" + }, + "profileStatistics": { + "$ref": "#/definitions/Pointer_Statistics_Profile" + }, + "profileTrafficLog": { + "$ref": "#/definitions/Pointer_Traffic_Log_Profile" + }, + "profileRewrite": { + "$ref": "#/definitions/Pointer_Rewrite_Profile" + }, + "profileProtocolInspection": { + "description": "BIG-IP AS3 pointer to Protocol Inspection Profile declaration", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + } + }, + { + "$ref": "#/definitions/Pointer_Protocol_Inspection_Profile" + } + ] + }, + "metadata": { + "$ref": "#/definitions/Metadata" + }, + "rateLimit": { + "description": "Specifies the maximum number of connections per second allowed for a virtual server", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "clonePools": { + "$ref": "#/definitions/Clone_Pools" + }, + "maximumBandwidth": { + "description": "Specifies the maximum bandwidth allowed, in Mbps.", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + }, + "oneOf": [ + { + "type": "integer", + "minimum": 10, + "maximum": 1000000 + }, + { + "type": "string", + "const": "infinite" + } + ] + }, + "ipIntelligencePolicy": { + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm", + "asm" + ] + } + }, + { + "$ref": "#/definitions/Pointer_IP_Intelligence_Policy" + } + ] + }, + "profileIntegratedBotDefense": { + "description": "BIG-IP AS3 pointer to an Integrated Bot Defense Profile. These are only supported in tmos version 17.0+.", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Integrated_Bot_Defense_Profile" + } + ] + }, + "adminState": { + "title": "Administration State", + "description": "Specifies the state of the Service. When set to disable the Service no longer accepts new connection requests, but will allow current connections to finish processing before going to a down state.", + "type": "string", + "enum": [ + "enable", + "disable" + ], + "default": "enable" + } + }, + "allOf": [ + { + "if": { + "properties": { + "allowVlans": {} + }, + "required": [ + "allowVlans" + ] + }, + "then": { + "not": { + "properties": { + "rejectVlans": {} + }, + "required": [ + "rejectVlans" + ] + } + } + }, + { + "if": { + "not": { + "required": [ + "virtualType" + ], + "properties": { + "virtualType": { + "const": "internal" + } + } + } + }, + "then": { + "required": [ + "virtualAddresses" + ] + } + }, + { + "$ref": "#/definitions/Include" + } + ], + "dependencies": { + "fallbackPersistenceMethod": [ + "persistenceMethods" + ] + } + }, + "Clone_Pools": { + "title": "Clone Pools", + "description": "Specifies a pool that the virtual server uses to replicate either client or server traffic", + "type": "object", + "properties": { + "ingress": { + "title": "Ingress Clone Pool", + "description": "Ingress (client-side context) clone pool", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Pool" + } + ] + }, + "egress": { + "title": "Egress Clone Pool", + "description": "Egress (server-side context) clone pool", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Pool" + } + ] + } + }, + "additionalProperties": false, + "anyOf": [ + { + "required": [ + "ingress" + ] + }, + { + "required": [ + "egress" + ] + } + ] + }, + "Service_Address": { + "title": "Service_Address", + "description": "Service IP address definition (BIG-IP virtual-address). NOTE: When BIG-IP AS3 creates a Service_Address, it is placed in /tenant/serviceAddress (and not /tenant/app/serviceAddress) on the BIG-IP system.", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Service_Address" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "virtualAddress": { + "title": "Virtual address", + "description": "The virtual IP address. Defaults to mask /32.", + "type": "string", + "format": "f5ip" + }, + "arpEnabled": { + "title": "Enable ARP", + "description": "If true (default), the system services ARP requests on this address", + "type": "boolean", + "default": true + }, + "icmpEcho": { + "title": "Enable ICMP echo", + "description": "If true (default), the system answers ICMP echo requests on this address", + "type": "string", + "enum": [ + "enable", + "disable", + "selective" + ], + "default": "enable" + }, + "routeAdvertisement": { + "title": "Enable route advertisement", + "description": "If true, the route is advertised", + "type": "string", + "enum": [ + "enable", + "disable", + "selective", + "always", + "any", + "all" + ], + "default": "disable" + }, + "spanningEnabled": { + "title": "Enable spanning", + "description": "Enable all BIG-IP systems in device group to listen for and process traffic on the same virtual address", + "type": "boolean", + "default": false + }, + "trafficGroup": { + "title": "Traffic Group", + "description": "Specifies the traffic group which the Service_Address belongs.", + "type": "string", + "default": "default" + } + }, + "dependencies": { + "arpEnabled": { + "$comment": "Only 1 of 2 can be true.", + "if": { + "properties": { + "arpEnabled": { + "const": true + } + } + }, + "then": { + "properties": { + "spanningEnabled": { + "const": false + } + } + } + } + }, + "required": [ + "virtualAddress" + ], + "additionalProperties": false + }, + "SNAT_Pool": { + "title": "SNAT_Pool", + "description": "Declares a list of SNAT addresses", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "SNAT_Pool" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "snatAddresses": { + "title": "SNAT addresses", + "description": "List of SNAT addresses-- may include both IPv4 and IPv6", + "type": "array", + "items": { + "title": "SNAT address", + "type": "string", + "format": "f5ip" + }, + "minItems": 1, + "uniqueItems": true + } + }, + "additionalProperties": false, + "required": [ + "class", + "snatAddresses" + ] + }, + "SNAT_Translation": { + "title": "SNAT_Translation", + "description": "Configures explicit secure network address translation (SNAT) address", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "SNAT_Translation" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "address": { + "title": "Address", + "description": "The IP address of the SNAT translation", + "type": "string", + "format": "f5ip" + }, + "adminState": { + "title": "Administration State", + "description": "Specifies the state of the SNAT translation", + "type": "string", + "enum": [ + "enable", + "disable" + ], + "default": "enable" + }, + "arpEnabled": { + "title": "Enable ARP", + "description": "Specifies that the NAT sends ARP requests", + "type": "boolean", + "default": true + }, + "ipIdleTimeout": { + "title": "IP Idle Timeout", + "description": "Specifies time in seconds that connections to an IP address initiated using a SNAT address are allowed to remain idle before being automatically disconnected. Specifying 'indefinite' prevents the connection from timing out.", + "oneOf": [ + { + "type": "integer", + "maximum": 4294967295, + "minimum": 1 + }, + { + "type": "string", + "const": "indefinite" + } + ], + "default": "indefinite" + }, + "maxConnections": { + "title": "Maximum Connections", + "description": "Specifies a limit on the number of connections a translation address must reach before it no longer initiates a connection. A value of 0 indicates the setting is disabled.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 0 + }, + "tcpIdleTimeout": { + "title": "TCP Idle Timeout", + "description": "Specifies time in seconds that TCP connections initiated using a SNAT address are allowed to remain idle before being automatically disconnected. Specifying 'indefinite' prevents the connection from timing out.", + "oneOf": [ + { + "type": "integer", + "maximum": 4294967295, + "minimum": 1 + }, + { + "type": "string", + "const": "indefinite" + } + ], + "default": "indefinite" + }, + "trafficGroup": { + "title": "Traffic Group", + "description": "Specifies the traffic group which the SNAT_Translation belongs", + "type": "string", + "default": "default" + }, + "udpIdleTimeout": { + "title": "UDP Idle Timeout", + "description": "Specifies time in seconds that UDP connections initiated using a SNAT address are allowed to remain idle before being automatically disconnected. Specifying 'indefinite' prevents the connection from timing out.", + "oneOf": [ + { + "type": "integer", + "maximum": 4294967295, + "minimum": 1 + }, + { + "type": "string", + "const": "indefinite" + } + ], + "default": "indefinite" + } + }, + "additionalProperties": false, + "required": [ + "class", + "address" + ] + }, + "WAF_Policy": { + "title": "WAF_Policy", + "description": "A Web Application Firewall Policy. Supports both traditional and advanced WAF policies. Advanced WAF policies require TMOS version 16.0 or newer.", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "asm" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "WAF_Policy" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "url": { + "title": "URL", + "description": "The URL to pull the ASM policy from", + "allOf": [ + { + "$ref": "#/definitions/Resource_URL" + } + ] + }, + "file": { + "title": "File", + "description": "The absolute file path for the ASM policy stored on the BIG-IP", + "type": "string", + "minLength": 3, + "allOf": [ + { + "f5PostProcess": { + "tag": "expand" + } + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "string" + } + } + ] + }, + "policy": { + "description": "Reference to a WAF Policy", + "allOf": [ + { + "$ref": "#/definitions/F5string" + }, + { + "f5PostProcess": { + "tag": "expand", + "data": { + "when": "1/expand" + } + } + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "string" + } + } + ] + }, + "ignoreChanges": { + "title": "Ignore changes", + "description": "If false (default), the system updates the policy in every BIG-IP AS3 declaration deployment. If true, BIG-IP AS3 creates the policy on first deployment, and leaves it untouched afterwards", + "type": "boolean", + "default": false + }, + "enforcementMode": { + "title": "Enforcement Mode", + "description": "Overrides the enforcement mode setting of the WAF policy. Ignored on Advanced WAF policies", + "type": "string", + "enum": [ + "blocking", + "transparent" + ] + }, + "serverTechnologies": { + "title": "Server Technologies", + "description": "Define server technologies for the WAF Policy, such as Java Servlets or Apache Struts. Ignored on Advanced WAF policies", + "type": "array", + "items": { + "title": "Server Technology", + "type": "string" + }, + "uniqueItems": true + }, + "disabledSignatures": { + "title": "Disabled attack signatures", + "description": "Disable various attack signatures by ID. Ignored on Advanced WAF policies", + "type": "array", + "items": { + "title": "Attack Signature ID", + "type": "integer", + "minimum": 200000000, + "maximum": 399999999 + }, + "uniqueItems": true + }, + "expand": { + "title": "Expand", + "description": "Performs AS3 string expansion on specified values within the WAF Policy. WAF Policies that are not in JSON format will be ignored", + "type": "array", + "items": { + "title": "JSON pointer", + "description": "A JSON pointer to a value within the WAF Policy that requires AS3 string expansion. Pointing to a parent property results in AS3 traversing the sub-properties and expanding any strings that it may find", + "type": "string" + }, + "uniqueItems": true + } + }, + "additionalProperties": false, + "required": [ + "class" + ], + "oneOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "file" + ] + }, + { + "required": [ + "policy" + ] + } + ] + }, + "Basic_Persist": { + "title": "Basic Persist", + "description": "Holds name of simple persistence method or BIG-IP AS3 pointer to persistence method", + "if": { + "type": "string" + }, + "then": { + "enum": [ + "cookie", + "destination-address", + "msrdp", + "source-address", + "tls-session-id" + ] + }, + "else": { + "$ref": "#/definitions/Pointer_Persist_Profile" + } + }, + "Persist": { + "title": "Persist", + "description": "Declares a persistence method", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Persist" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "persistenceMethod": { + "title": "Persistence method", + "description": "You may customize each basic persistence method", + "type": "string", + "enum": [ + "cookie", + "destination-address", + "hash", + "msrdp", + "sip-info", + "source-address", + "tls-session-id", + "universal" + ] + }, + "matchAcrossPools": { + "title": "Match across pools", + "description": "Specifies that the system can use any pool that contains this persistence record", + "type": "boolean", + "default": false + }, + "matchAcrossVirtualPorts": { + "title": "Match across virtual ports", + "description": "Specifies that all persistent connections from a client IP address that go to the same virtual IP address also go to the same node", + "type": "boolean", + "default": false + }, + "matchAcrossVirtualAddresses": { + "title": "Match across virtual addresses", + "description": "Specifies that all persistent connections from the same client IP address go to the same node", + "type": "boolean", + "default": false + }, + "mirror": { + "title": "Mirror", + "description": "If true, try to maintain persistence even after HA failover of ADC (default false)", + "type": "boolean", + "default": false + }, + "overrideConnectionLimit": { + "title": "Override connection limit", + "description": "If true, do not enforce pool member connection limit for persisted connections (default false)", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "if": { + "properties": { + "persistenceMethod": { + "const": "cookie" + } + } + }, + "then": { + "$ref": "#/definitions/Persist_Cookie" + } + }, + { + "if": { + "properties": { + "persistenceMethod": { + "enum": [ + "destination-address", + "source-address" + ] + } + } + }, + "then": { + "$ref": "#/definitions/Persist_Addr" + } + }, + { + "if": { + "properties": { + "persistenceMethod": { + "const": "hash" + } + } + }, + "then": { + "$ref": "#/definitions/Persist_Hash" + } + }, + { + "if": { + "properties": { + "persistenceMethod": { + "const": "msrdp" + } + } + }, + "then": { + "$ref": "#/definitions/Persist_MSRDP" + } + }, + { + "if": { + "properties": { + "persistenceMethod": { + "const": "sip-info" + } + } + }, + "then": { + "$ref": "#/definitions/Persist_SIP" + } + }, + { + "if": { + "properties": { + "persistenceMethod": { + "const": "tls-session-id" + } + } + }, + "then": { + "$ref": "#/definitions/Persist_TLS_Session" + } + }, + { + "if": { + "properties": { + "persistenceMethod": { + "const": "universal" + } + } + }, + "then": { + "$ref": "#/definitions/Persist_UIE" + } + } + ], + "dependencies": { + "use": { + "not": {} + }, + "bigip": { + "not": {} + } + }, + "required": [ + "class", + "persistenceMethod" + ] + }, + "Persist_Addr": { + "title": "Address persistence", + "description": "Configures an address affinity persistence profile", + "type": "object", + "properties": { + "duration": { + "title": "Duration", + "description": "Lifetime of persistence record (seconds, default 180)", + "type": "integer", + "minimum": 0, + "maximum": 604800, + "default": 180 + }, + "hashAlgorithm": { + "title": "Hash algorithm", + "description": "Specifies the algorithm the system uses for hash persistence load balancing. The hash result is the input for the algorithm.", + "type": "string", + "enum": [ + "carp", + "default" + ], + "default": "default" + }, + "addressMask": { + "title": "Address mask", + "description": "Optional mask selects portion of address used by simple persistence (if omitted the system uses all address bits)", + "type": "string", + "format": "f5ip" + } + } + }, + "Persist_Cookie": { + "title": "Cookie persistence", + "description": "Configures a cookie persistence profile", + "type": "object", + "properties": { + "duration": { + "title": "Duration", + "description": "Lifetime of persistence record (seconds, default 0 means indefinite)", + "type": "integer", + "minimum": 0, + "maximum": 604800, + "default": 0 + }, + "cookieMethod": { + "title": "Method", + "description": "Selects cookie processing method (default is insert)", + "type": "string", + "enum": [ + "insert", + "hash", + "passive", + "rewrite" + ], + "default": "insert" + }, + "cookieName": { + "title": "Cookie name", + "description": "Cookie name (for method 'insert', default (empty-string) yields system-generated name)", + "type": "string", + "pattern": "^[0-9A-Za-z.~#$%^&*_-]*$", + "maxLength": 64, + "default": "" + } + }, + "if": { + "properties": { + "cookieMethod": { + "const": "insert" + } + } + }, + "then": { + "properties": { + "ttl": { + "title": "TTL", + "description": "Requested cookie lifetime (seconds, default 0 means session cookie)", + "type": "integer", + "minimum": 0, + "maximum": 604800, + "default": 0 + }, + "httpOnly": { + "title": "HTTP only flag", + "description": "If true (default) the system sets the HTTPOnly flag", + "type": "boolean", + "default": true + }, + "secure": { + "title": "Secure flag", + "description": "If true (default) the system sets the Secure (TLS) flag", + "type": "boolean", + "default": true + }, + "alwaysSet": { + "title": "Always set", + "description": "If true, set cookie with every HTTP response (default false)", + "type": "boolean", + "default": false + }, + "encrypt": { + "title": "Encrypt cookie", + "description": "If true, prevent disclosure of (or tampering with) ADC info in cookie (default false, to reduce latency)", + "type": "boolean", + "default": false + }, + "passphrase": { + "title": "Passphrase", + "description": "Used to create secret key for cookie encryption", + "type": "object", + "properties": { + "allowReuse": { + "description": "If true, other declaration objects may reuse this value", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Secret" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "object" + } + }, + { + "f5PostProcess": { + "tag": "secret" + } + } + ] + } + }, + "if": { + "properties": { + "encrypt": { + "const": true + } + }, + "required": [ + "encrypt" + ] + }, + "then": { + "required": [ + "passphrase" + ] + } + }, + "else": { + "if": { + "properties": { + "cookieMethod": { + "const": "hash" + } + } + }, + "then": { + "properties": { + "cookieName": { + "minLength": 1 + }, + "startAt": { + "title": "Start at", + "description": "Index of first octet in cookie value to hash", + "type": "integer", + "minimum": 0, + "maximum": 4096, + "default": 0 + }, + "hashCount": { + "title": "Hash count", + "description": "Number of octets in cookie value to hash; 0 (default) means all", + "type": "integer", + "minimum": 0, + "maximum": 4096, + "default": 0 + } + } + }, + "else": { + "$comment": "No extra properties for passive or rewrite." + } + } + }, + "Persist_Hash": { + "title": "Hash persistence", + "description": "Configures a hash persistence profile", + "type": "object", + "properties": { + "duration": { + "title": "Duration", + "description": "Lifetime of persistence record (seconds, default 180)", + "type": "integer", + "minimum": 0, + "maximum": 604800, + "default": 180 + }, + "hashAlgorithm": { + "title": "Hash algorithm", + "description": "Specifies the algorithm the system uses for hash persistence load balancing. The hash result is the input for the algorithm.", + "type": "string", + "enum": [ + "carp", + "default" + ], + "default": "default" + }, + "startAt": { + "title": "Start at", + "description": "Index of first octet in packet to hash", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 0 + }, + "count": { + "title": "Hash count", + "description": "Number of octets in cookie value to hash; 0 (default) means all", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 0 + }, + "startPattern": { + "title": "Start pattern", + "description": "Regular expression which matches start of data to hash; default \"\" averts matching", + "type": "string", + "default": "" + }, + "endPattern": { + "title": "End pattern", + "description": "Regular expression which matches end of data to hash; default \"\" averts matching", + "type": "string", + "default": "" + }, + "bufferLimit": { + "title": "Buffer limit", + "description": "Number of octets to buffer while pattern-matching", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 0 + }, + "iRule": { + "title": "iRule", + "description": "BIG-IP AS3 pointer to iRule if any (declared separately)", + "if": { + "type": "string" + }, + "then": { + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "iRule" + } + }, + "required": [ + "class" + ] + } + } + }, + "else": { + "type": "object", + "properties": { + "bigip": { + "title": "BIG-IP iRule", + "description": "Pathname of existing BIG-IP iRule", + "type": "string", + "format": "f5bigip" + }, + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to iRule (declared separately)", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "iRule" + } + }, + "required": [ + "class" + ] + } + } + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm rule" + ] + } + } + } + } + }, + "Persist_MSRDP": { + "title": "MSRDP persistence", + "description": "Configures a Microsoft(r) Remote Display Protocol (MSRDP) persistence profile", + "type": "object", + "properties": { + "duration": { + "title": "Duration", + "description": "Lifetime of persistence record (seconds, default 300)", + "type": "integer", + "minimum": 0, + "maximum": 604800, + "default": 300 + }, + "sessionBroker": { + "title": "Session broker", + "description": "If true (default), the system will persist the client to the server chosen by session broker", + "type": "boolean", + "default": true + } + } + }, + "Persist_SIP": { + "title": "SIP info persistence", + "description": "Configures a Session Initiation Protocol (SIP) persistence profile", + "type": "object", + "properties": { + "duration": { + "title": "Duration", + "description": "Lifetime of persistence record (seconds, default 180)", + "type": "integer", + "minimum": 0, + "maximum": 604800, + "default": 180 + }, + "header": { + "title": "SIP header", + "description": "Suggested values include: Call-ID, To, From, SIP-ETag, and Subject", + "type": "string", + "minLength": 1 + } + }, + "required": [ + "header" + ] + }, + "Persist_TLS_Session": { + "title": "TLS session persistence", + "description": "Configures a Secure Socket Layer (SSL) persistence profile", + "type": "object", + "properties": { + "duration": { + "title": "Duration", + "description": "Lifetime of persistence record (seconds, default 300)", + "type": "integer", + "minimum": 0, + "maximum": 604800, + "default": 300 + } + } + }, + "Persist_UIE": { + "title": "Universal persistence", + "description": "Configures a universal persistence profile", + "type": "object", + "properties": { + "duration": { + "title": "Duration", + "description": "Lifetime of persistence record (seconds, default 180)", + "type": "integer", + "minimum": 0, + "maximum": 604800, + "default": 180 + }, + "iRule": { + "title": "iRule", + "description": "BIG-IP AS3 pointer to required iRule (declared separately)", + "if": { + "type": "string" + }, + "then": { + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "iRule" + } + }, + "required": [ + "class" + ] + } + } + }, + "else": { + "type": "object", + "properties": { + "bigip": { + "title": "BIG-IP iRule", + "description": "Pathname of existing BIG-IP iRule", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "required": [ + "bigip" + ], + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm rule" + ] + } + } + } + }, + "required": [ + "iRule" + ] + }, + "Pool": { + "title": "Pool", + "description": "Declares a service pool", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Pool" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "allowNATEnabled": { + "title": "Enable Allow NAT", + "description": "If true (default), NATs are automatically enabled for any connections using this pool.", + "type": "boolean", + "default": true + }, + "allowSNATEnabled": { + "title": "Enable Allow SNAT", + "description": "If true (default), SNATs are automatically enabled for any connections using this pool.", + "type": "boolean", + "default": true + }, + "loadBalancingMode": { + "title": "LB mode", + "description": "Load-balancing mode", + "type": "string", + "enum": [ + "dynamic-ratio-member", + "dynamic-ratio-node", + "fastest-app-response", + "fastest-node", + "least-connections-member", + "least-connections-node", + "least-sessions", + "observed-member", + "observed-node", + "predictive-member", + "predictive-node", + "ratio-least-connections-member", + "ratio-least-connections-node", + "ratio-member", + "ratio-node", + "ratio-session", + "round-robin", + "weighted-least-connections-member", + "weighted-least-connections-node" + ], + "default": "round-robin" + }, + "minimumMembersActive": { + "title": "Minimum active", + "description": "Pool is down when fewer than this number of members are up", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 1 + }, + "monitors": { + "title": "Monitors", + "description": "List of health monitors (each by name or BIG-IP AS3 pointer)", + "type": "array", + "items": { + "$ref": "#/definitions/Basic_Monitor" + }, + "$comment": "uniqueItems: true" + }, + "minimumMonitors": { + "title": "Minimum monitors", + "description": "Member is down when fewer than minimum monitors report it healthy. Specify 'all' to require all monitors to be up.", + "oneOf": [ + { + "type": "string", + "const": "all" + }, + { + "type": "integer", + "minimum": 1, + "maximum": 63 + } + ] + }, + "members": { + "title": "Members", + "description": "Set of Pool members", + "type": "array", + "items": { + "$ref": "#/definitions/Pool_Member" + }, + "$comment": "uniqueItems: true", + "f5PostProcess": { + "tag": "node" + } + }, + "metadata": { + "$ref": "#/definitions/Metadata" + }, + "reselectTries": { + "title": "Reselect tries", + "description": "Maximum number of attempts to find a responsive member for a connection", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 0 + }, + "serviceDownAction": { + "title": "Service-down action", + "description": "Specifies connection handling when member is non-responsive", + "type": "string", + "enum": [ + "drop", + "none", + "reselect", + "reset" + ], + "default": "none" + }, + "slowRampTime": { + "title": "Slow ramp time", + "description": "BIG-IP AS3 slowly the connection rate to a newly-active member slowly during this interval (seconds)", + "type": "integer", + "minimum": 0, + "maximum": 900, + "default": 10 + } + }, + "additionalProperties": false, + "if": { + "required": [ + "monitors" + ] + }, + "then": { + "properties": { + "minimumMonitors": { + "default": 1 + } + } + }, + "required": [ + "class" + ] + }, + "Address_Discovery_Common": { + "type": "object", + "allOf": [ + { + "if": { + "properties": { + "addressDiscovery": { + "enum": [ + "fqdn", + "aws", + "azure", + "gce", + "consul" + ] + } + }, + "required": [ + "addressDiscovery" + ] + }, + "then": { + "properties": { + "updateInterval": { + "title": "Update interval", + "description": "Server-discovery update interval (seconds)", + "type": "integer", + "minimum": 1, + "maximum": 3600, + "default": 60 + } + }, + "not": { + "required": [ + "bigip" + ] + } + } + }, + { + "if": { + "properties": { + "addressDiscovery": { + "const": "static" + } + } + }, + "then": { + "oneOf": [ + { + "required": [ + "bigip" + ] + }, + { + "properties": { + "serverAddresses": { + "title": "Server addresses", + "description": "Static IP addresses of servers (nodes). Shorthand for 'servers' where you only want to specify the address property.", + "type": "array", + "items": { + "title": "Server address", + "description": "Static IP address for this server (node)", + "type": "string", + "format": "f5ip" + }, + "uniqueItems": true + }, + "servers": { + "title": "Servers", + "description": "Same as serverAddresses, but allowing for further specification of each node.", + "type": "array", + "items": { + "title": "Servers", + "description": "Static IP address and other details for this server (node)", + "type": "object", + "properties": { + "address": { + "title": "Server address", + "description": "Static IP address for this server (node)", + "type": "string", + "format": "f5ip" + }, + "name": { + "title": "Name", + "type": "string", + "pattern": "^[A-Za-z][0-9A-Za-z_.-]*$", + "maxLength": 64 + } + }, + "required": [ + "address" + ], + "additionalProperties": false + } + } + }, + "if": { + "required": [ + "monitors" + ] + }, + "then": { + "properties": { + "minimumMonitors": { + "default": 1 + } + } + }, + "anyOf": [ + { + "required": [ + "serverAddresses" + ] + }, + { + "required": [ + "servers" + ] + } + ] + } + ] + } + }, + { + "if": { + "properties": { + "addressDiscovery": { + "const": "fqdn" + } + }, + "required": [ + "addressDiscovery" + ] + }, + "then": { + "properties": { + "hostname": { + "title": "Hostname", + "type": "string", + "format": "hostname" + }, + "addressFamily": { + "title": "Address family", + "description": "Selects IPv4/6 and DNS A/AAAA RR's", + "type": "string", + "enum": [ + "IPv4", + "IPv6" + ], + "default": "IPv4" + }, + "autoPopulate": { + "title": "Auto-populate", + "description": "If true use multiple server (node) addresses when available, otherwise use only one", + "type": "boolean", + "default": false + }, + "queryInterval": { + "title": "Query interval", + "description": "Normal DNS query interval (seconds, default 0 means RR TTL)", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "downInterval": { + "title": "Down interval", + "description": "DNS retry interval after resolution failure (seconds)", + "type": "integer", + "minimum": 0, + "default": 5 + }, + "fqdnPrefix": { + "description": "String to prepend onto the hostname to create the node name", + "type": "string", + "oneOf": [ + { + "pattern": "^[A-Za-z][0-9A-Za-z_.-]*$" + }, + { + "const": "" + } + ], + "default": "" + } + }, + "if": { + "required": [ + "monitors" + ] + }, + "then": { + "properties": { + "minimumMonitors": { + "default": 1 + } + } + }, + "required": [ + "hostname" + ] + } + }, + { + "if": { + "properties": { + "addressDiscovery": { + "const": "aws" + } + }, + "required": [ + "addressDiscovery" + ] + }, + "then": { + "$ref": "#/definitions/Service_Discovery_AWS" + } + }, + { + "if": { + "properties": { + "addressDiscovery": { + "const": "azure" + } + }, + "required": [ + "addressDiscovery" + ] + }, + "then": { + "$ref": "#/definitions/Service_Discovery_Azure" + } + }, + { + "if": { + "properties": { + "addressDiscovery": { + "const": "gce" + } + }, + "required": [ + "addressDiscovery" + ] + }, + "then": { + "$ref": "#/definitions/Service_Discovery_GCE" + } + }, + { + "if": { + "properties": { + "addressDiscovery": { + "const": "consul" + } + }, + "required": [ + "addressDiscovery" + ] + }, + "then": { + "$ref": "#/definitions/Service_Discovery_Consul" + } + } + ] + }, + "Address_Discovery": { + "title": "Address_Discovery", + "description": "Sharable Pool Member information", + "type": "object", + "properties": { + "class": { + "type": "string", + "const": "Address_Discovery" + }, + "addressDiscovery": { + "title": "Address discovery", + "description": "Selects how server (node) addresses are discovered", + "type": "string", + "enum": [ + "static", + "fqdn", + "event", + "aws", + "gce", + "azure", + "consul" + ], + "f5serviceDiscovery": true + }, + "shareNodes": { + "description": "If enabled, nodes are created in /Common instead of the tenant's partition", + "type": "boolean", + "default": false + } + }, + "required": [ + "addressDiscovery" + ], + "allOf": [ + { + "$ref": "#/definitions/Address_Discovery_Common" + } + ] + }, + "Pool_Member": { + "title": "Pool member", + "description": "Declares a service-pool member", + "type": "object", + "properties": { + "remark": { + "$ref": "#/definitions/Remark" + }, + "servicePort": { + "title": "Service port", + "description": "Service L4 port (optional port-discovery may override)", + "type": "integer", + "minimum": 0, + "maximum": 65535 + }, + "bigip": { + "title": "BIG-IP node", + "description": "If defined, pathname of existing BIG-IP node", + "type": "string", + "format": "f5bigip" + }, + "enable": { + "description": "Maps to BIG-IP pool member state", + "type": "boolean", + "default": true + }, + "connectionLimit": { + "title": "Connection limit", + "description": "Maximum concurrent connections to member", + "type": "integer", + "minimum": 0, + "maximum": 2147483647, + "default": 0 + }, + "rateLimit": { + "title": "Rate limit", + "description": "Value zero prevents use of member", + "type": "integer", + "minimum": -1, + "maximum": 2147483647, + "default": -1 + }, + "dynamicRatio": { + "title": "Dynamic ratio", + "description": "Specifies a range of numbers that you want the system to use in conjunction with the ratio load balancing method", + "type": "integer", + "minimum": 0, + "maximum": 100, + "default": 1 + }, + "ratio": { + "title": "Ratio", + "description": "Specifies the weight of the pool member for load balancing purposes", + "type": "integer", + "minimum": 0, + "maximum": 100, + "default": 1 + }, + "priorityGroup": { + "title": "Priority group", + "description": "Specifies the priority group within the pool for this pool member", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 0 + }, + "monitors": { + "title": "Monitors", + "description": "List of monitors (each by name or BIG-IP AS3 pointer)", + "type": "array", + "items": { + "$ref": "#/definitions/Basic_Monitor" + }, + "$comment": "uniqueItems: true" + }, + "minimumMonitors": { + "title": "Minimum monitors", + "description": "Member is down when fewer than minimum monitors report it healthy", + "type": "integer", + "minimum": 0, + "maximum": 63 + }, + "metadata": { + "$ref": "#/definitions/Metadata" + }, + "adminState": { + "title": "Administration State", + "description": "Setting adminState to enable will create the node in an operational state. Set to disable to disallow new connections but allow existing connections to drain. Set to offline to force immediate termination of all connections.", + "type": "string", + "enum": [ + "enable", + "disable", + "offline" + ], + "default": "enable" + }, + "addressDiscovery": { + "title": "Address discovery", + "description": "Selects how server (node) addresses are discovered", + "type": [ + "string", + "object" + ], + "if": { + "type": "string" + }, + "then": { + "enum": [ + "static", + "fqdn", + "event", + "aws", + "gce", + "azure", + "consul" + ] + }, + "else": { + "$ref": "#/definitions/Pointer_Address_Discovery" + }, + "default": "static", + "f5serviceDiscovery": { + "exceptions": [ + "static", + "fqdn" + ] + } + }, + "shareNodes": { + "description": "If enabled, nodes are created in /Common instead of the tenant's partition", + "type": "boolean", + "default": false + }, + "routeDomain": { + "description": "The Route Domain to use for the pool member", + "$comment": "Due to the fact the Route Domain id is required for address modification, BIG-IP AS3 does NOT support this route domain reference as anything but the id.", + "type": "integer", + "minimum": 0, + "maximum": 65534 + } + }, + "required": [ + "servicePort" + ], + "allOf": [ + { + "$ref": "#/definitions/Address_Discovery_Common" + }, + { + "if": { + "required": [ + "bigip" + ] + }, + "then": { + "if": { + "required": [ + "monitors" + ] + }, + "then": { + "properties": { + "minimumMonitors": { + "default": 1 + } + } + } + } + }, + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm node" + ] + } + } + ] + }, + "Service_Discovery_Polling_Core": { + "type": "object", + "properties": { + "addressRealm": { + "title": "Address realm", + "description": "Specifies whether to look for public or private IP addresses", + "type": "string", + "enum": [ + "public", + "private" + ], + "default": "private" + }, + "credentialUpdate": { + "title": "Credential Update", + "type": "boolean", + "description": "Specifies whether you are updating your credentials", + "default": false + }, + "undetectableAction": { + "title": "Undetectable Action", + "description": "Action to take when node cannot be detected", + "type": "string", + "enum": [ + "disable", + "remove" + ], + "default": "remove" + } + } + }, + "Service_Discovery_Polling_Core_Tagged": { + "properties": { + "tagKey": { + "title": "Tag key", + "type": "string", + "minLength": 1, + "description": "The tag key associated with the node to add to this pool" + }, + "tagValue": { + "title": "Tag value", + "type": "string", + "minLength": 1, + "description": "The tag value associated with the node to add to this pool" + } + }, + "allOf": [ + { + "$ref": "#/definitions/Service_Discovery_Polling_Core" + } + ] + }, + "Service_Discovery_AWS": { + "description": "Service Discovery properties for Amazon Web Services (AWS)", + "properties": { + "region": { + "title": "AWS region", + "description": "Empty string (default) means region in which ADC is running", + "type": "string", + "default": "" + }, + "roleARN": { + "title": "Role Amazon Resource Name", + "description": "Assume a role (also requires the externalId field)", + "type": "string", + "minLength": 1 + }, + "externalId": { + "title": "External Id", + "description": "External Id", + "type": "string", + "minLength": 1 + }, + "accessKeyId": { + "title": "Access Key Id", + "description": "Information for discovering AWS nodes that are not in the same region as your BIG-IP (also requires the secretAccessKey field", + "type": "string", + "minLength": 1 + }, + "secretAccessKey": { + "title": "Secret Access Key", + "description": "Will be stored in the declaration as an encrypted string", + "oneOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "allOf": [ + { + "required": [ + "ciphertext" + ] + }, + { + "$ref": "#/definitions/Secret" + } + ] + } + ], + "f5PostProcess": { + "tag": "longSecret" + } + } + }, + "dependencies": { + "roleARN": { + "required": [ + "externalId" + ] + }, + "externalId": { + "required": [ + "roleARN" + ] + }, + "accessKeyId": { + "required": [ + "secretAccessKey" + ] + }, + "secretAccessKey": { + "required": [ + "accessKeyId" + ] + } + }, + "if": { + "required": [ + "monitors" + ] + }, + "then": { + "properties": { + "minimumMonitors": { + "type": "integer", + "default": 1 + } + } + }, + "required": [ + "region", + "tagKey", + "tagValue" + ], + "allOf": [ + { + "$ref": "#/definitions/Service_Discovery_Polling_Core_Tagged" + } + ] + }, + "Service_Discovery_Azure": { + "description": "Service Discovery properties for Azure", + "properties": { + "resourceGroup": { + "title": "Resource group", + "description": "Azure Resource Group name", + "type": "string" + }, + "subscriptionId": { + "title": "Subscription ID", + "description": "Azure subscription ID", + "type": "string" + }, + "useManagedIdentity": { + "title": "Use Managed Identity", + "description": "Use Azure managed identity rather than directoryId, applicationId, and apiAccessKey", + "type": "boolean", + "default": false + }, + "directoryId": { + "title": "(Azure) Directory ID", + "description": "Azure Active Directory ID (AKA tenant ID)", + "type": "string" + }, + "applicationId": { + "title": "(Azure) Application ID", + "description": "Azure registered application ID (AKA client ID)", + "type": "string" + }, + "apiAccessKey": { + "title": "Azure API access key", + "description": "Azure registered application API access key (AKA service principal secret). Will be stored in the declaration in an encrypted format.", + "oneOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "allOf": [ + { + "required": [ + "ciphertext" + ] + }, + { + "$ref": "#/definitions/Secret" + } + ] + } + ], + "f5PostProcess": { + "tag": "longSecret" + } + }, + "resourceType": { + "description": "Type of resource identified by resourceId. This can be used in place of tagKey/tagValue.", + "type": "string", + "enum": [ + "tag", + "scaleSet" + ] + }, + "resourceId": { + "description": "ID of resource to find nodes by.", + "type": "string" + }, + "environment": { + "title": "Azure environment", + "description": "Azure environment name. Required if environment should not be determined by instance metadata.", + "type": "string", + "default": "Azure" + } + }, + "required": [ + "resourceGroup", + "subscriptionId" + ], + "allOf": [ + { + "$ref": "#/definitions/Service_Discovery_Polling_Core_Tagged" + }, + { + "if": { + "required": [ + "monitors" + ] + }, + "then": { + "properties": { + "minimumMonitors": { + "type": "integer", + "default": 1 + } + } + } + }, + { + "if": { + "required": [ + "tagKey", + "tagValue" + ] + }, + "then": { + "not": { + "required": [ + "resourceId", + "resourceType" + ] + } + }, + "else": { + "required": [ + "resourceId", + "resourceType" + ], + "not": { + "required": [ + "tagKey", + "tagValue" + ] + } + } + }, + { + "if": { + "properties": { + "useManagedIdentity": { + "const": true + } + } + }, + "then": { + "allOf": [ + { + "not": { + "required": [ + "directoryId" + ] + } + }, + { + "not": { + "required": [ + "applicationId" + ] + } + }, + { + "not": { + "required": [ + "apiAccessKey" + ] + } + } + ] + }, + "else": { + "required": [ + "directoryId", + "applicationId", + "apiAccessKey" + ] + } + } + ] + }, + "Service_Discovery_GCE": { + "description": "Service Discovery properties for Google Compute Engine (GCE)", + "properties": { + "region": { + "title": "GCE region", + "description": "Empty string (default) means region in which ADC is running", + "type": "string" + }, + "encodedCredentials": { + "title": "Encoded Service Account Credentials", + "description": "Base 64 encoded service account credentials JSON", + "oneOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "allOf": [ + { + "required": [ + "ciphertext" + ] + }, + { + "$ref": "#/definitions/Secret" + } + ] + } + ], + "f5PostProcess": { + "tag": "longSecret" + } + }, + "projectId": { + "title": "Project Id", + "description": "For Google Cloud Engine (GCE) only: The ID of the project in which the members are located", + "type": "string" + } + }, + "if": { + "required": [ + "monitors" + ] + }, + "then": { + "properties": { + "minimumMonitors": { + "type": "integer", + "default": 1 + } + } + }, + "required": [ + "region", + "tagKey", + "tagValue" + ], + "allOf": [ + { + "$ref": "#/definitions/Service_Discovery_Polling_Core_Tagged" + } + ] + }, + "Service_Discovery_Consul": { + "description": "Service Discovery properties for Consul", + "properties": { + "uri": { + "title": "URI", + "type": "string", + "minLength": 1, + "description": "The location of the node data" + }, + "encodedToken": { + "title": "Encoded ACL Token", + "description": "Base 64 encoded bearer token to make requests to the Consul API. Will be stored in the declaration in an encrypted format.", + "oneOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "allOf": [ + { + "required": [ + "ciphertext" + ] + }, + { + "$ref": "#/definitions/Secret" + } + ] + } + ], + "f5PostProcess": { + "tag": "longSecret" + } + }, + "trustCA": { + "title": "Trusted CA bundle", + "description": "CA Bundle to validate server certificates", + "allOf": [ + { + "$ref": "#/definitions/Pointer_CA_Bundle" + } + ] + }, + "rejectUnauthorized": { + "title": "Reject Unauthorized Connection", + "description": "If true, the server certificate is verified against the list of supplied/default CAs when making requests to the Consul API.", + "type": "boolean", + "default": true + }, + "jmesPathQuery": { + "title": "JMESPath Query", + "type": "string", + "description": "Custom JMESPath Query" + } + }, + "if": { + "required": [ + "monitors" + ] + }, + "then": { + "properties": { + "minimumMonitors": { + "type": "integer", + "default": 1 + } + } + }, + "required": [ + "uri" + ], + "allOf": [ + { + "$ref": "#/definitions/Service_Discovery_Polling_Core" + } + ] + }, + "Basic_Monitor": { + "title": "Basic Monitor", + "description": "Holds name of simple monitor or BIG-IP AS3 pointer to a monitor declaration", + "if": { + "type": "string" + }, + "then": { + "enum": [ + "http", + "https", + "http2", + "icmp", + "tcp-half-open", + "tcp" + ] + }, + "else": { + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to monitor declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Monitor" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP monitor", + "description": "Pathname of existing BIG-IP monitor", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "probe ltm monitor icmp" + ] + } + } + }, + "Monitor": { + "title": "Monitor", + "description": "Declares a (possibly complex) monitor", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Monitor" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "monitorType": { + "title": "Monitor type", + "description": "You may customize each monitor type", + "type": "string", + "enum": [ + "dns", + "external", + "ftp", + "http", + "https", + "http2", + "icmp", + "inband", + "ldap", + "mysql", + "postgresql", + "radius", + "sip", + "smtp", + "tcp", + "tcp-half-open", + "udp" + ] + } + }, + "allOf": [ + { + "if": { + "not": { + "properties": { + "monitorType": { + "const": "inband" + } + } + } + }, + "then": { + "properties": { + "targetAddress": { + "title": "Address", + "description": "IP address monitor should probe; if empty (default) then pool member address", + "type": "string", + "format": "f5ip", + "default": "" + }, + "interval": { + "title": "Interval", + "description": "Poll interval (seconds)", + "type": "integer", + "minimum": 0, + "maximum": 3600, + "default": 5 + }, + "upInterval": { + "title": "Up-Interval", + "description": "Poll interval when service is already up (seconds)", + "type": "integer", + "minimum": 0, + "maximum": 3600, + "default": 0 + }, + "timeUntilUp": { + "title": "Time until up", + "description": "Delay between successful probe and sending traffic to node (seconds)", + "type": "integer", + "minimum": 0, + "maximum": 1800, + "default": 0 + }, + "timeout": { + "title": "Timeout", + "description": "Time limit for node to respond (seconds)", + "type": "integer", + "minimum": 0, + "maximum": 900, + "default": 16 + } + } + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "icmp" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor_ICMP" + }, + "else": { + "if": { + "properties": { + "monitorType": { + "const": "inband" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor_Inband" + }, + "else": { + "properties": { + "targetPort": { + "title": "Port", + "description": "L4 port (if any) monitor should probe; if 0 (default) then pool member port", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 0 + } + } + } + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "http" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor_HTTP" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "https" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor_HTTPS" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "http2" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor_HTTP2" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "external" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor_External" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "tcp" + } + } + }, + "then": { + "properties": { + "dscp": { + "title": "IP DSCP", + "description": "Value for IP DSCP (ex-TOS) field (default 0)", + "type": "integer", + "minimum": 0, + "maximum": 63, + "default": 0 + } + }, + "allOf": [ + { + "$ref": "#/definitions/Monitor_TCP" + } + ] + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "udp" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor_UDP" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "smtp" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor_SMTP" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "mysql" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor_MySQL" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "postgresql" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor_PostgreSQL" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "sip" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor_SIP" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "tcp-half-open" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor_TCP_Half_Open" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "ldap" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor_LDAP" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "dns" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor_DNS" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "radius" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor_RADIUS" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "ftp" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor_FTP" + } + } + ], + "required": [ + "class", + "monitorType" + ] + }, + "Monitor_May_Adapt": { + "description": "Additional Monitor class properties available when monitorType = http, https, tcp, udp, or icmp", + "type": "object", + "properties": { + "adaptive": { + "title": "Adaptive", + "description": "If true, use adaptive probe timing", + "type": "boolean", + "default": false + }, + "adaptiveDivergenceType": { + "title": "Adaptive divergence type", + "description": "Adaptive divergence, 'absolute' selects milliseconds, 'relative' (default) selects percentage", + "type": "string", + "enum": [ + "absolute", + "relative" + ], + "default": "relative" + }, + "adaptiveDivergenceMilliseconds": { + "title": "Adaptive divergence msec", + "description": "Probe fails if response latency exceeds mean by this number of milliseconds", + "type": "integer", + "minimum": 1, + "maximum": 10000, + "default": 500 + }, + "adaptiveDivergencePercentage": { + "title": "Adaptive divergence percent", + "description": "Probe fails if response latency exceeds mean by this percentage", + "type": "integer", + "minimum": 1, + "maximum": 500, + "default": 100 + }, + "adaptiveLimitMilliseconds": { + "title": "Adaptive limit msec", + "description": "Probe fails if response latency exceeds this number of milliseconds", + "type": "integer", + "minimum": 1, + "maximum": 10000, + "default": 1000 + }, + "adaptiveWindow": { + "title": "Adaptive window", + "description": "Time window over which the system samples latency (seconds)", + "type": "integer", + "minimum": 60, + "maximum": 1800, + "default": 180 + } + } + }, + "Monitor_External": { + "description": "Additional Monitor class properties available when monitorType = external", + "type": "object", + "properties": { + "pathname": { + "title": "pathname", + "description": "Tmsh object path name of an imported existing external monitor (e.g. /Common/arg_example)", + "type": "string", + "minLength": 2, + "f5PostProcess": { + "tag": "expand" + } + }, + "expand": { + "title": "Expand", + "description": "If true (default), expand backquoted variables in script", + "type": "boolean", + "default": true + }, + "script": { + "title": "External monitor script", + "description": "Bash(1) script which implements external monitor", + "allOf": [ + { + "$ref": "#/definitions/F5string" + }, + { + "f5PostProcess": { + "tag": "expand", + "data": { + "when": "1/expand" + } + } + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "string" + } + } + ] + }, + "arguments": { + "title": "Arguments", + "description": "Arguments to specified external monitor (will be backquote-expanded)", + "type": "string", + "default": "", + "f5PostProcess": { + "tag": "expand" + } + }, + "environmentVariables": { + "description": "Specifies user defined command line parameters that the external program requires.", + "type": "object", + "additionalProperties": { + "type": "string" + }, + "default": {} + } + }, + "oneOf": [ + { + "required": [ + "pathname" + ] + }, + { + "required": [ + "script" + ] + } + ] + }, + "Monitor_FTP": { + "description": "Additional Monitor class properties available when monitorType = ftp", + "type": "object", + "properties": { + "mode": { + "title": "Mode", + "description": "Specifies the data transfer process (DTP) mode. The default value is passive.", + "type": "string", + "default": "passive", + "enum": [ + "passive", + "port" + ] + }, + "username": { + "title": "Username", + "description": "Username if any for query authentication", + "type": "string" + }, + "passphrase": { + "title": "Passphrase", + "description": "Passphrase if any for query authentication", + "type": "object", + "properties": { + "allowReuse": { + "description": "If true, other declaration objects may reuse this value", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Secret" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "object" + } + }, + { + "f5PostProcess": { + "tag": "secret" + } + } + ] + }, + "filename": { + "title": "Filename", + "description": "Specifies the full path and file name of the file that the system attempts to download. The health check is successful if the system can download the file.", + "type": "string" + } + } + }, + "Monitor_HTTP": { + "description": "Additional Monitor class properties available when monitorType = http or https or http2", + "type": "object", + "properties": { + "send": { + "title": "Send", + "description": "Send this (backquote-expanded) string to query node", + "type": "string", + "default": "HEAD / HTTP/1.0\\r\\n\\r\\n", + "f5PostProcess": { + "tag": "expand" + } + }, + "receive": { + "title": "Receive = up", + "description": "Mark node up upon receipt of this (backquote-expanded) string", + "type": "string", + "default": "HTTP/1.", + "f5PostProcess": { + "tag": "expand" + } + }, + "receiveDown": { + "title": "Receive = down", + "description": "Mark node down upon receipt of this (backquote-expanded) string (optional; must be empty when 'reverse' is true)", + "type": "string", + "default": "", + "f5PostProcess": { + "tag": "expand" + } + }, + "reverse": { + "title": "Reverse", + "description": "If true, mark node down upon receipt of 'receive' string", + "type": "boolean", + "default": false + }, + "username": { + "title": "Username", + "description": "Username if any for query authentication", + "type": "string" + }, + "passphrase": { + "title": "Passphrase", + "description": "Passphrase if any for query authentication", + "type": "object", + "properties": { + "allowReuse": { + "description": "If true, other declaration objects may reuse this value", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Secret" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "object" + } + }, + { + "f5PostProcess": { + "tag": "secret" + } + } + ] + }, + "transparent": { + "title": "Transparent", + "description": "If true, treat pool member address as gateway to server (node) (default false)", + "type": "boolean", + "default": false + }, + "dscp": { + "title": "IP DSCP", + "description": "Value for IP DSCP (ex-TOS) field (default 0)", + "type": "integer", + "minimum": 0, + "maximum": 63, + "default": 0 + } + }, + "allOf": [ + { + "$ref": "#/definitions/Monitor_May_Adapt" + } + ], + "dependencies": { + "reverse": { + "if": { + "properties": { + "reverse": { + "const": true + } + } + }, + "then": { + "properties": { + "receiveDown": { + "const": "" + } + } + } + } + } + }, + "Monitor_HTTPS": { + "description": "Additional Monitor class properties available when monitorType = https", + "type": "object", + "properties": { + "ciphers": { + "title": "Ciphers", + "description": "Ciphersuite selection string", + "type": "string", + "default": "DEFAULT" + }, + "clientCertificate": { + "title": "Client certificate", + "description": "BIG-IP AS3 pointer to client Certificate declaration, for TLS authentication (optional)", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Certificate" + } + }, + "required": [ + "class" + ] + } + } + }, + "clientTLS": { + "title": "Client TLS", + "description": "BIG-IP AS3 pointer to client TLS Profile", + "allOf": [ + { + "$ref": "#/definitions/Pointer_TLS_Client" + } + ] + } + }, + "allOf": [ + { + "$ref": "#/definitions/Monitor_HTTP" + } + ] + }, + "Monitor_HTTP2": { + "description": "Additional Monitor class properties available when monitorType = http2. Requires TMOS version 15.1 or newer.", + "type": "object", + "properties": { + "clientTLS": { + "title": "Client TLS", + "description": "BIG-IP AS3 pointer to client TLS Profile", + "allOf": [ + { + "$ref": "#/definitions/Pointer_TLS_Client" + } + ] + }, + "receive": { + "title": "Receive = up", + "description": "Mark node up upon receipt of this (backquote-expanded) string", + "type": "string", + "default": "HTTP/2.", + "f5PostProcess": { + "tag": "expand" + } + }, + "send": { + "title": "Send", + "description": "Send this (backquote-expanded) string to query node", + "type": "string", + "default": "GET /\\r\\n\\r\\n", + "f5PostProcess": { + "tag": "expand" + } + } + }, + "allOf": [ + { + "$ref": "#/definitions/Monitor_HTTP" + } + ] + }, + "Monitor_ICMP": { + "description": "Additional Monitor class properties available when monitorType = icmp", + "type": "object", + "properties": { + "transparent": { + "title": "Transparent", + "description": "If true, treat pool member address as gateway to server (node) (default false)", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Monitor_May_Adapt" + } + ] + }, + "Monitor_MySQL": { + "description": "Additional Monitor class properties available when monitorType = mysql", + "type": "object", + "properties": { + "send": { + "title": "Send", + "description": "Send this (backquote-expanded) string to query node", + "type": "string", + "f5PostProcess": { + "tag": "expand" + } + }, + "receive": { + "title": "Receive = up", + "description": "Mark node up upon receipt of this (backquote-expanded) string", + "type": "string", + "f5PostProcess": { + "tag": "expand" + } + }, + "username": { + "title": "Username", + "description": "Username if any for query authentication", + "type": "string" + }, + "passphrase": { + "title": "Passphrase", + "description": "Passphrase if any for query authentication", + "type": "object", + "properties": { + "allowReuse": { + "description": "If true, other declaration objects may reuse this value", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Secret" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "object" + } + }, + { + "f5PostProcess": { + "tag": "secret" + } + } + ] + }, + "count": { + "title": "Count", + "description": "Number of monitor probes after which the connection to the database will be terminated. Count value of zero indicates that the connection will never be terminated.", + "type": "integer", + "minimum": 0, + "maximum": 2147483647, + "default": 0 + }, + "database": { + "title": "Database", + "description": "The name of the database with which the monitor attempts to communicate.", + "type": "string" + }, + "receiveColumn": { + "title": "Receive Column", + "description": "Specifies the column in the database where the system expects the specified Receive String to be located. Specify this property only if you configure the Send and Receive properties.", + "type": "integer", + "minimum": 1, + "maximum": 4096 + }, + "receiveRow": { + "title": "Receive Row", + "description": "Specifies the row in the database where the system expects the specified Receive String to be located. Specify this property only if you configure the Send and Recieve properties.", + "type": "integer", + "minimum": 1, + "maximum": 65535 + } + }, + "dependencies": { + "receiveColumn": { + "required": [ + "send", + "receive" + ] + }, + "receiveRow": { + "required": [ + "send", + "receive" + ] + } + } + }, + "Monitor_PostgreSQL": { + "description": "Additional Monitor class properties available when monitorType = postgresql", + "type": "object", + "properties": { + "send": { + "title": "Send", + "description": "Send this (backquote-expanded) string to query node", + "type": "string", + "f5PostProcess": { + "tag": "expand" + } + }, + "receive": { + "title": "Receive = up", + "description": "Mark node up upon receipt of this (backquote-expanded) string", + "type": "string", + "f5PostProcess": { + "tag": "expand" + } + }, + "username": { + "title": "Username", + "description": "Username if any for query authentication", + "type": "string" + }, + "passphrase": { + "title": "Passphrase", + "description": "Passphrase if any for query authentication", + "type": "object", + "properties": { + "allowReuse": { + "description": "If true, other declaration objects may reuse this value", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Secret" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "object" + } + }, + { + "f5PostProcess": { + "tag": "secret" + } + } + ] + }, + "count": { + "title": "Count", + "description": "Number of monitor probes after which the connection to the database will be terminated. Count value of zero indicates that the connection will never be terminated.", + "type": "integer", + "minimum": 0, + "maximum": 2147483647, + "default": 0 + }, + "database": { + "title": "Database", + "description": "The name of the database with which the monitor attempts to communicate.", + "type": "string" + }, + "receiveColumn": { + "title": "Receive Column", + "description": "Specifies the column in the database where the system expects the specified Receive String to be located. Specify this property only if you configure the Send and Receive properties.", + "type": "integer", + "minimum": 1, + "maximum": 1600 + }, + "receiveRow": { + "title": "Receive Row", + "description": "Specifies the row in the database where the system expects the specified Receive String to be located. Specify this property only if you configure the Send and Recieve properties.", + "type": "integer", + "minimum": 1, + "maximum": 4294967294 + } + }, + "dependencies": { + "receiveColumn": { + "required": [ + "send", + "receive" + ] + }, + "receiveRow": { + "required": [ + "send", + "receive" + ] + } + } + }, + "Monitor_SIP": { + "description": "Additional Monitor class properties available when monitorType = sip", + "type": "object", + "properties": { + "protocol": { + "title": "Protocol", + "description": "SIP transport protocol", + "type": "string", + "enum": [ + "sips", + "tcp", + "tls", + "udp" + ], + "default": "udp" + }, + "request": { + "title": "Request", + "description": "SIP request to send in probes (default empty)", + "type": "string", + "default": "" + }, + "headers": { + "title": "Headers", + "description": "SIP headers to send in probes (if any)--separate by newlines (backquote-expanded)", + "type": "string", + "default": "", + "f5PostProcess": { + "tag": "expand" + } + }, + "codesUp": { + "title": "Codes = up", + "description": "List of additional (to all 1/2/3xx) status codes meaning service is up (0 matches any code)", + "type": "array", + "items": { + "title": "Code = up", + "type": "integer", + "minimum": 0 + }, + "uniqueItems": true + }, + "codesDown": { + "title": "Codes = down", + "description": "List of status codes meaning service is down (0 matches any code)", + "type": "array", + "items": { + "title": "Code = down", + "type": "integer", + "minimum": 0 + }, + "uniqueItems": true + }, + "ciphers": { + "title": "Ciphers", + "description": "Ciphersuite selection string", + "type": "string", + "default": "DEFAULT" + }, + "clientCertificate": { + "title": "Client certificate", + "description": "BIG-IP AS3 pointer to client Certificate declaration, for TLS authentication (optional)", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Certificate" + } + }, + "required": [ + "class" + ] + } + } + } + }, + "dependencies": { + "clientCertificate": { + "properties": { + "protocol": { + "enum": [ + "sips", + "tls" + ] + } + } + } + } + }, + "Monitor_SMTP": { + "description": "Additional Monitor class properties available when monitorType = smtp", + "type": "object", + "properties": { + "domain": { + "title": "Domain", + "description": "Mail domain to check, if any (backquote-expanded)", + "type": "string", + "format": "hostname", + "default": "", + "f5PostProcess": { + "tag": "expand" + } + } + } + }, + "Monitor_TCP": { + "description": "Additional Monitor class properties available when monitorType = tcp", + "type": "object", + "properties": { + "send": { + "title": "Send", + "description": "Send this (backquote-expanded) string to node", + "type": "string", + "f5PostProcess": { + "tag": "expand" + }, + "default": "none" + }, + "receive": { + "title": "Receive = up", + "description": "Mark node up upon receipt of this (backquote-expanded) string", + "type": "string", + "f5PostProcess": { + "tag": "expand" + }, + "default": "none" + }, + "receiveDown": { + "title": "Receive = down", + "description": "Mark node down upon receipt of this (backquote-expanded) string (optional; must be empty when 'reverse' is true)", + "type": "string", + "default": "", + "f5PostProcess": { + "tag": "expand" + } + }, + "reverse": { + "title": "Reverse", + "description": "If true, mark node down upon receipt of 'receive' string", + "type": "boolean", + "default": false + }, + "transparent": { + "title": "Transparent", + "description": "If true, treat pool member address as gateway to server (node) (default false)", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Monitor_May_Adapt" + } + ], + "dependencies": { + "reverse": { + "if": { + "properties": { + "reverse": { + "const": true + } + } + }, + "then": { + "properties": { + "receiveDown": { + "const": "" + } + } + } + } + } + }, + "Monitor_UDP": { + "description": "Additional Monitor class properties available when monitorType = udp", + "type": "object", + "properties": { + "send": { + "title": "Send", + "description": "Send this (backquote-expanded) string to node", + "type": "string", + "f5PostProcess": { + "tag": "expand" + }, + "default": "default send string" + }, + "receive": { + "title": "Receive = up", + "description": "Mark node up upon receipt of this (backquote-expanded) string", + "type": "string", + "f5PostProcess": { + "tag": "expand" + }, + "default": "none" + }, + "receiveDown": { + "title": "Receive = down", + "description": "Mark node down upon receipt of this (backquote-expanded) string (optional; must be empty when 'reverse' is true)", + "type": "string", + "default": "", + "f5PostProcess": { + "tag": "expand" + } + }, + "reverse": { + "title": "Reverse", + "description": "If true, mark node down upon receipt of 'receive' string", + "type": "boolean", + "default": false + }, + "transparent": { + "title": "Transparent", + "description": "If true, treat pool member address as gateway to server (node) (default false)", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Monitor_May_Adapt" + } + ], + "dependencies": { + "reverse": { + "if": { + "properties": { + "reverse": { + "const": true + } + } + }, + "then": { + "properties": { + "receiveDown": { + "const": "" + } + } + } + } + } + }, + "Monitor_TCP_Half_Open": { + "description": "Additional Monitor class properties available when monitorType = tcp-half-open", + "type": "object", + "properties": { + "transparent": { + "title": "Transparent", + "description": "If true, treat pool member address as gateway to server (node) (default false)", + "type": "boolean", + "default": false + } + } + }, + "Monitor_Inband": { + "description": "Additional Monitor class properties available when monitorType = inband", + "type": "object", + "properties": { + "failureInterval": { + "title": "Failure Interval", + "description": "Specifies an interval, in seconds. If the number of failures specified in the failures option occurs within this interval, the system marks the pool member as being unavailable.", + "type": "integer", + "maximum": 1000, + "minimum": 2, + "default": 30 + }, + "failures": { + "title": "Failures", + "description": "Specifies the number of failures that the system allows to occur, within the time period specified in the failureInterval property, before marking a pool member unavailable. The multiple tmm processes use a per-process number to calculate failures, depending on the specified load. For example, for the Round Robin load balancing method, if there are N tmm processes and M pool members, and the Failures property is set to L, then up to N*M*L+1 failures can occur before the system marks the node as down. Specifying a value of 0 disables this option. A failure can be either a failure to connect or a failure of the pool member to respond within the time specified in the responseTime property.", + "type": "integer", + "default": 3, + "maximum": 1000, + "minimum": 0 + }, + "responseTime": { + "title": "Response Time", + "description": "Specifies an amount of time, in seconds. If the pool member does not respond with data after the specified amount of time has passed, the number of failures in this interval increments by 1. Specifying a value of 0 disables this option.", + "type": "integer", + "default": 10, + "maximum": 5000, + "minimum": 0 + }, + "retryTime": { + "title": "Retry Time", + "description": "Specifies the amount of time in seconds after the pool member has been marked unavailable before the system retries to connect to the pool member. Specifying a value of 0 disables this option.", + "type": "integer", + "default": 300, + "maximum": 5000, + "minimum": 0 + } + } + }, + "Monitor_LDAP": { + "description": "Additional Monitor class properties available when monitorType = smtp", + "type": "object", + "properties": { + "username": { + "title": "Username", + "description": "Username if any for query authentication", + "type": "string" + }, + "passphrase": { + "title": "Passphrase", + "description": "Passphrase if any for query authentication", + "type": "object", + "properties": { + "allowReuse": { + "description": "If true, other declaration objects may reuse this value", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Secret" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "object" + } + }, + { + "f5PostProcess": { + "tag": "secret" + } + } + ] + }, + "base": { + "title": "Base", + "description": "Specifies the location in the LDAP tree from which the monitor starts the health check", + "type": "string" + }, + "filter": { + "title": "Filter", + "description": "Specifies an LDAP key which the monitor searches", + "type": "string" + }, + "security": { + "title": "Security", + "description": "Specifies the secure protocol type for communications with the target", + "type": "string", + "enum": [ + "none", + "ssl", + "tls" + ], + "default": "none" + }, + "mandatoryAttributes": { + "title": "Mandatory Attributes", + "description": "Specifies whether the target must include attributes in its response to be considered up", + "type": "boolean", + "default": false + }, + "chaseReferrals": { + "title": "Chase Referrals", + "description": "Specifies, whether, upon receipt of an LDAP referral entry, the referral is followed", + "type": "boolean", + "default": true + } + } + }, + "Monitor_DNS": { + "description": "Additional Monitor class properties available when monitorType = dns", + "type": "object", + "properties": { + "acceptRCODE": { + "title": "Accept RCODE", + "description": "Specifies the RCODE required in the response for an up status", + "type": "string", + "enum": [ + "anything", + "no-error" + ], + "default": "no-error" + }, + "answerContains": { + "title": "Answer Section Contains", + "description": "Specifies the type of DNS query that the monitor sends", + "type": "string", + "enum": [ + "any-type", + "anything", + "query-type" + ], + "default": "query-type" + }, + "queryName": { + "title": "Query Name", + "description": "Specifies a query name for the monitor to use in a DNS query", + "type": "string", + "minLength": 1 + }, + "queryType": { + "title": "Query Type", + "description": "Specifies the type of DNS query that the monitor sends.", + "type": "string", + "enum": [ + "a", + "aaaa" + ], + "default": "a" + }, + "receive": { + "title": "Receive String", + "description": "IP address that the monitor uses from the resource records sections of the DNS response", + "type": "string" + }, + "reverse": { + "title": "Reverse", + "description": "If true, mark node down upon receipt of 'receive' string", + "type": "boolean", + "default": false + }, + "transparent": { + "title": "Transparent", + "description": "If true, treat pool member address as gateway to server (node) (default false)", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Monitor_May_Adapt" + }, + { + "if": { + "properties": { + "transparent": { + "const": true + } + }, + "required": [ + "transparent" + ] + }, + "then": { + "allOf": [ + { + "required": [ + "targetAddress", + "targetPort" + ] + }, + { + "properties": { + "targetAddress": { + "not": { + "const": "" + } + } + } + } + ] + } + }, + { + "if": { + "properties": { + "reverse": { + "const": true + } + }, + "required": [ + "reverse" + ] + }, + "then": { + "allOf": [ + { + "required": [ + "receive" + ] + }, + { + "properties": { + "receive": { + "not": { + "const": "" + } + } + } + } + ] + } + }, + { + "if": { + "properties": { + "answerContains": { + "const": "query-type" + }, + "acceptRCODE": { + "const": "no-error" + } + } + }, + "then": { + "properties": { + "receive": { + "default": "" + } + } + } + } + ], + "required": [ + "queryName" + ] + }, + "Monitor_RADIUS": { + "description": "Additional Monitor class properties available when monitorType = radius", + "type": "object", + "properties": { + "username": { + "title": "Username", + "description": "Specifies the user name, if the monitor target requires authentication", + "type": "string" + }, + "passphrase": { + "title": "Passphrase", + "description": "Specifies the password, if the monitored target requires authentication", + "type": "object", + "properties": { + "allowReuse": { + "description": "If true, other declaration objects may reuse this value", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Secret" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "object" + } + }, + { + "f5PostProcess": { + "tag": "secret" + } + } + ] + }, + "secret": { + "title": "Secret", + "description": "Specifies the secret the monitor needs to access the resource", + "type": "object", + "properties": { + "allowReuse": { + "description": "If true, other declaration objects may reuse this value", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Secret" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "object" + } + }, + { + "f5PostProcess": { + "tag": "secret" + } + } + ] + }, + "nasIpAddress": { + "title": "IP Address", + "description": "Specifies the networks access server's IP address (NAS IP address) for a RADIUS monitor", + "type": "string", + "format": "f5ip" + } + } + }, + "TLS_Server": { + "title": "TLS_Server", + "description": "TLS server parameters (connections arriving to ADC)", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "TLS_Server" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "requireSNI": { + "title": "Require SNI", + "description": "When a client sends no or unknown SNI and Require SNI is false (default), the system uses the primary certificate, otherwise the system rejects the client", + "type": "boolean", + "default": false + }, + "alertTimeout": { + "title": "Alert Timeout", + "description": "Specifies the duration of time, in seconds, for the system to try to close an SSL connection before resetting the connection. The default is 'indefinite'. You can also specify 'immediate', or an integer.", + "oneOf": [ + { + "type": "integer", + "maximum": 4294967294, + "minimum": 1 + }, + { + "type": "string", + "enum": [ + "immediate", + "indefinite" + ] + } + ], + "default": "indefinite" + }, + "cacheTimeout": { + "title": "Cache Timeout", + "description": "Sets the cache timeout (in seconds)", + "type": "integer", + "maximum": 86400, + "minimum": 0, + "default": 3600 + }, + "certificates": { + "title": "Certificates", + "description": "Primary and (optional) additional certificates (order is significant, element 0 is primary cert)", + "type": "array", + "items": { + "type": "object", + "properties": { + "matchToSNI": { + "title": "Match to SNI", + "description": "If value is FQDN (wildcard okay), ignore all names in certificate and select this cert when SNI matches value (or by default)", + "type": "string" + }, + "sniDefault": { + "title": "Default SNI", + "description": "When true, this profile is the default SSL profile when a client connection does not specify a known server name, or does not specify any server name at all. The default value is false", + "type": "boolean", + "default": false + }, + "enabled": { + "title": "Enabled", + "description": "Enables SSL processing", + "type": "boolean", + "default": true + }, + "certificate": { + "title": "Certificate", + "description": "BIG-IP AS3 pointer to Certificate declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Certificate" + } + }, + "required": [ + "class" + ] + } + } + }, + "proxyCertificate": { + "title": "Proxy Certificate", + "description": "BIG-IP AS3 pointer to Certificate declaration for SSL forward proxy", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Certificate" + } + }, + "required": [ + "class" + ] + } + } + } + }, + "additionalProperties": false, + "required": [ + "certificate" + ] + }, + "minItems": 1, + "$comment": "uniqueItems: true" + }, + "ciphers": { + "title": "Ciphers", + "description": "Ciphersuite selection string. ciphers and cipherGroup are mutually exclusive, only use one.", + "type": "string" + }, + "cipherGroup": { + "description": "Pointer to a cipherGroup. cipherGroup and ciphers are mutually exclusive, only use one.", + "$ref": "#/definitions/Pointer_Cipher_Group" + }, + "authenticationMode": { + "title": "Authentication mode", + "description": "Client certificate authentication mode", + "type": "string", + "enum": [ + "ignore", + "request", + "require" + ], + "default": "ignore" + }, + "authenticationFrequency": { + "title": "Authentication frequency", + "description": "Client certificate authentication frequency", + "type": "string", + "enum": [ + "one-time", + "every-time" + ], + "default": "one-time" + }, + "authenticationTrustCA": { + "title": "Authentication trust CA", + "description": "BIG-IP AS3 pointer to declaration of CA Bundle used to validate client certificates", + "if": { + "type": "string" + }, + "then": { + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "CA_Bundle" + } + }, + "required": [ + "class" + ] + } + } + }, + "else": { + "type": "object", + "properties": { + "bigip": { + "title": "BIG-IP CA bundle", + "description": "Pathname of existing BIG-IP CA bundle", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "required": [ + "bigip" + ], + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys file ssl-cert" + ] + } + } + }, + "authenticationInviteCA": { + "title": "Authentication invite CA", + "description": "BIG-IP AS3 pointer to declaration of CA Bundle used to invite client certificates", + "if": { + "type": "string" + }, + "then": { + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "CA_Bundle" + } + }, + "required": [ + "class" + ] + } + } + }, + "else": { + "type": "object", + "properties": { + "bigip": { + "title": "BIG-IP CA bundle", + "description": "Pathname of existing BIG-IP CA bundle", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "required": [ + "bigip" + ], + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys file ssl-cert" + ] + } + } + }, + "crlFile": { + "title": "Certificate Revocation List (CRL) File", + "description": "Specifies the name of a file containing a list of revoked client certificates", + "allOf": [ + { + "$ref": "#/definitions/Pointer_SSL_CRL_File" + } + ] + }, + "allowExpiredCRL": { + "title": "Allow Expired CRL", + "description": "Specifies if the CRL can be used even if it has expired", + "type": "boolean", + "default": false + }, + "cacheCertificateEnabled": { + "title": "Cache Certificate Enabled", + "description": "Enables or disables (default) caching certificates by IP address and port number", + "type": "boolean", + "default": false + }, + "c3dOCSPUnknownStatusAction": { + "title": "C3D OCSP Unknown Status Action", + "description": "Specifies the BIG-IP action when the OCSP returns unknown status. The default is drop", + "type": "string", + "enum": [ + "drop", + "ignore" + ], + "default": "drop" + }, + "c3dOCSP": { + "title": "C3D OCSP", + "description": "Specifies SSL Client Certificate Constrained Delegation (C3D) OCSP object that the BIG-IP SSL should use to connect to the OCSP responder and check the client certificate status", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Certificate_Validator_OCSP" + } + ] + }, + "c3dEnabled": { + "title": "C3D Delegation Enabled", + "description": "Enables or disables SSL Client Certificate Constrained Delegation (C3D). The default is false", + "type": "boolean", + "default": false + }, + "forwardProxyEnabled": { + "title": "Forward Proxy Enabled", + "description": "Enables or disables (default) SSL forward proxy", + "type": "boolean", + "default": false + }, + "forwardProxyBypassEnabled": { + "title": "Forward Proxy Bypass Enabled", + "description": "Enables or disables (default) SSL forward proxy bypass", + "type": "boolean", + "default": false + }, + "forwardProxyBypassAllowlist": { + "title": "Forward Proxy Bypass Allowlist", + "description": "Specifies the data group name of hostname allowlist when both SSL forwardProxyEnabled & forwardProxyBypassEnabled features are set to true.", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Data_Group" + } + ] + }, + "ldapStartTLS": { + "title": "Client-LDAP Profile", + "description": "Creates a client LDAP profile with the specified activation mode STARTTLS.", + "type": "string", + "enum": [ + "none", + "allow", + "require" + ] + }, + "smtpsStartTLS": { + "title": "Simple Mail Transfer Protocol Security (SMTPS) profile", + "description": "Creates a SMTPS profile with the specified activation mode STARTTTLS. Because HTTP profile is not compatible with SMTPS use with Service_TCP instead of Service_HTTPS. Also incompatible with ldapStartTLS. Use only one of the two.", + "type": "string", + "enum": [ + "none", + "allow", + "require" + ] + }, + "staplerOCSPEnabled": { + "description": "Specifies whether to enable OCSP stapling", + "type": "boolean", + "default": false + }, + "insertEmptyFragmentsEnabled": { + "title": "Insert Empty Fragments Enabled", + "description": "Enables a countermeasure against an SSL 3.0/TLS 1.0 protocol vulnerability affecting CBC ciphers. These ciphers cannot be handled by certain broken SSL implementations.", + "type": "boolean", + "default": false + }, + "singleUseDhEnabled": { + "title": "Single Use DH Enabled", + "description": "Creates a new key when using temporary/ephemeral DH parameters. This option must be used to prevent small subgroup attacks, when the DH parameters were not generated using strong primes (for example. when using DSA-parameters). If strong primes were used, it is not strictly necessary to generate a new DH key during each handshake, but F5 Networks recommends it. Enable the Single DH Use option whenever temporary or ephemeral DH parameters are used.", + "type": "boolean", + "default": false + }, + "tls1_3Enabled": { + "title": "TLS 1.3", + "description": "Allow TLS 1.3 Protocol. Note: tls1_3Enabled is only supported in tmos version 14.0+.", + "type": "boolean", + "default": false + }, + "tls1_2Enabled": { + "title": "TLS 1.2", + "description": "Allow TLS 1.2 Protocol.", + "type": "boolean", + "default": true + }, + "tls1_1Enabled": { + "title": "TLS 1.1", + "description": "Allow TLS 1.1 Protocol.", + "type": "boolean", + "default": true + }, + "tls1_0Enabled": { + "title": "TLS 1.0", + "description": "Allow TLS 1.0 Protocol.", + "type": "boolean", + "default": true + }, + "renegotiationEnabled": { + "title": "Renegotiation", + "description": "Controls on a per-connection basis how the system responds to mid-stream SSL reconnection requests.", + "type": "boolean", + "default": true + }, + "retainCertificateEnabled": { + "title": "Retain Certificate", + "description": "When enabled, server certificate is retained in SSL session.", + "type": "boolean", + "default": true + }, + "namingScheme": { + "description": "Scheme to use when naming generated tmsh configuration", + "type": "string", + "enum": [ + "numbered", + "certificate" + ], + "default": "numbered" + }, + "sslEnabled": { + "title": "SSL", + "description": "Allow SSL protocol", + "type": "boolean", + "default": true + }, + "ssl3Enabled": { + "title": "SSL v3", + "description": "Allow SSL v3 protocol", + "type": "boolean", + "default": true + }, + "proxySslEnabled": { + "title": "Proxy SSL Enabled", + "description": "When enabled, further modification of application traffic within an SSL tunnel is allowed while still allowing the server to perform necessary authorization, authentication, and auditing steps. Requires a corresponding TLS_Client with this enabled to perform transparent SSL decryption.", + "type": "boolean", + "default": false + }, + "proxySslPassthroughEnabled": { + "title": "Proxy SSL Passthrough Enabled", + "description": "When enabled, it allows Proxy SSL to passthrough the traffic when ciphersuite negotiated between the client and server is not supported. Requires a corresponding TLS_Client with this enabled to perform transparent SSL decryption.", + "type": "boolean", + "default": false + }, + "secureRenegotiation": { + "title": "Secure Renegotiation", + "description": "Specifies the secure renegotiation mode. When set to require, any client attempting to renegotiate that does not support secure renegotiation will have its connection aborted. When set to require-strict, any client attempting to connect that does not support secure renegotiation will have its initial handshake denied. When set to request, unpatched clients will be permitted to renegotiate. Setting to request is not recommended as it is subject to active man-in-the-middle attacks.", + "type": "string", + "enum": [ + "request", + "require", + "require-strict" + ], + "default": "require" + }, + "uncleanShutdownEnabled": { + "title": "Unclean Shutdown Enabled", + "description": "When enabled, the profile performs unclean shutdowns of all SSL connections, which means the underlying TCP connections are closed without exchanging the required SSL shutdown alerts.", + "type": "boolean", + "default": true + }, + "dtlsEnabled": { + "title": "DTLS Enabled", + "description": "Allows the DTLS protocol.", + "type": "boolean", + "default": true + }, + "dtls1_2Enabled": { + "title": "DTLS1.2 Enabled", + "description": "Allows the DTLS 1.2 protocol.", + "type": "boolean", + "default": true + }, + "certificateExtensions": { + "title": "Certificate Extensions", + "description": "Specifies the extensions of the web server certificates to be included in the generated certificates using SSL Forward Proxy.", + "type": "array", + "items": { + "type": "string", + "enum": [ + "authority-key-identifier", + "basic-constraints", + "certificate-policies", + "crl-distribution-points", + "extended-key-usage", + "fresh-crl", + "issuer-alternative-name", + "key-usage", + "subject-alternative-name", + "subject-directory-attribute", + "subject-key-identifier" + ] + } + }, + "nonSslConnectionsEnabled": { + "title": "Allow Non-SSL Connections", + "description": "Specifies if non-SSL connections are allowed.", + "type": "boolean", + "default": false + }, + "allowDynamicRecordSizing": { + "title": "Allow Dynamic Record Sizing", + "description": "Enables or disables dynamic application record sizing.", + "type": "boolean", + "default": false + }, + "dataZeroRoundTripTime": { + "title": "Data Zero Round Trip Time", + "description": "Specifies if TLSv1.3 should accept 0-RTT with early data, with or without anti-replay. To protect against packet replay, F5 recommends that you enable anti-replay. The default value is disabled, which means TLSv1.3 will discard any early data.", + "type": "string", + "enum": [ + "disabled", + "enabled-with-anti-replay", + "enabled-no-anti-replay" + ], + "default": "disabled" + }, + "renegotiateMaxRecordDelay": { + "title": "Renegotiate Max Record Delay", + "description": "Specifies the maximum number of SSL records that the traffic management system can receive before it renegotiates an SSL session. After the system receives this number of SSL records, it closes the connection. This setting applies to client profiles only.", + "oneOf": [ + { + "type": "integer", + "minimum": 0, + "maximum": 4294967295 + }, + { + "type": "string", + "const": "indefinite" + } + ], + "default": "indefinite" + }, + "renegotiatePeriod": { + "title": "Renegotiate Period", + "description": "Specifies the number of seconds required to renegotiate an SSL session.", + "oneOf": [ + { + "type": "integer", + "minimum": 0, + "maximum": 4294967295 + }, + { + "type": "string", + "const": "indefinite" + } + ], + "default": "indefinite" + }, + "renegotiateSize": { + "title": "Renegotiate Size", + "description": "Specifies the size of the application data, in megabytes, that is transmitted over the secure channel. If the size of the data is higher than this value, the traffic management system must renegotiate the SSL session.", + "oneOf": [ + { + "type": "integer", + "minimum": 0, + "maximum": 4294967295 + }, + { + "type": "string", + "const": "indefinite" + } + ], + "default": "indefinite" + } + }, + "additionalProperties": false, + "dependencies": { + "forwardProxyBypassAllowlist": { + "properties": { + "forwardProxyEnabled": { + "const": true + }, + "forwardProxyBypassEnabled": { + "const": true + } + } + }, + "smtpsStartTLS": { + "not": { + "required": [ + "ldapStartTLS" + ] + } + } + }, + "allOf": [ + { + "if": { + "properties": { + "c3dEnabled": { + "const": true + } + }, + "required": [ + "c3dEnabled" + ] + }, + "then": { + "properties": { + "authenticationMode": { + "enum": [ + "request", + "require" + ] + } + } + } + }, + { + "if": { + "properties": { + "authenticationMode": { + "enum": [ + "request", + "require" + ] + } + }, + "required": [ + "authenticationMode" + ] + }, + "then": { + "required": [ + "authenticationTrustCA" + ] + } + }, + { + "if": { + "required": [ + "ciphers" + ] + }, + "then": { + "not": { + "required": [ + "cipherGroup" + ] + } + } + }, + { + "if": { + "not": { + "required": [ + "ciphers", + "cipherGroup" + ] + } + }, + "then": { + "properties": { + "ciphers": { + "default": "DEFAULT" + } + } + } + } + ], + "required": [ + "class", + "certificates" + ] + }, + "TLS_Client": { + "title": "TLS_Client", + "description": "TLS client parameters (connections leaving ADC)", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "TLS_Client" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "sendSNI": { + "title": "Send SNI", + "description": "FQDN to send in SNI (optional)", + "type": "string", + "format": "hostname", + "default": "none" + }, + "sniDefault": { + "title": "Default SNI", + "description": "When true, this profile is the default SSL profile when a client connection does not specify a known server name, or does not specify any server name at all. The default value is false", + "type": "boolean", + "default": false + }, + "requireSNI": { + "title": "Require SNI", + "description": "When a client sends no or unknown SNI and Require SNI is false (default), the system uses the primary certificate, otherwise the system rejects the client", + "type": "boolean", + "default": false + }, + "alertTimeout": { + "title": "Alert Timeout", + "description": "Specifies the duration of time, in seconds, for the system to try to close an SSL connection before resetting the connection. The default is 'indefinite'. You can also specify 'immediate', or an integer.", + "oneOf": [ + { + "type": "integer", + "maximum": 4294967294, + "minimum": 1 + }, + { + "type": "string", + "enum": [ + "immediate", + "indefinite" + ] + } + ], + "default": "indefinite" + }, + "cacheTimeout": { + "title": "Cache Timeout", + "description": "Sets the cache timeout (in seconds)", + "type": "integer", + "maximum": 86400, + "minimum": 0, + "default": 3600 + }, + "ciphers": { + "title": "Ciphers", + "description": "Ciphersuite selection string. ciphers and cipherGroup are mutually exclusive, only use one.", + "type": "string" + }, + "cipherGroup": { + "description": "Pointer to a cipherGroup. cipherGroup and ciphers are mutually exclusive, only use one.", + "$ref": "#/definitions/Pointer_Cipher_Group" + }, + "authenticationFrequency": { + "title": "Authentication frequency", + "description": "Client certificate authentication frequency", + "type": "string", + "enum": [ + "one-time", + "every-time" + ], + "default": "one-time" + }, + "serverName": { + "title": "Server name", + "description": "FQDN which server certificate must match (optional)", + "type": "string", + "format": "hostname", + "default": "none" + }, + "validateCertificate": { + "title": "Validate certificate", + "description": "If false (default) accept any cert from server, else validate server cert against trusted CA bundle", + "type": "boolean", + "default": false + }, + "trustCA": { + "title": "Trusted CA bundle", + "description": "CA's trusted to validate server certificate; 'generic' (default) or else BIG-IP AS3 pointer to declaration of CA Bundle", + "if": { + "not": { + "type": "object" + } + }, + "then": { + "type": "string", + "enum": [ + "generic", + "none" + ], + "default": "generic" + }, + "else": { + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to declaration of CA bundle", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "CA_Bundle" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP CA bundle", + "description": "Pathname of existing BIG-IP CA bundle", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys file ssl-cert" + ] + } + } + }, + "ignoreExpired": { + "title": "Ignored expired", + "description": "If false (default) drop connections with expired server certificates", + "type": "boolean", + "default": false + }, + "ignoreUntrusted": { + "title": "Ignored untrusted", + "description": "If false (default) drop connections with untrusted server certificates", + "type": "boolean", + "default": false + }, + "sessionTickets": { + "title": "Session tickets", + "description": "If false (default) do not use rfc5077 session tickets", + "type": "boolean", + "default": false + }, + "clientCertificate": { + "title": "Client certificate", + "description": "BIG-IP AS3 pointer to client Certificate declaration (optional)", + "type": "string", + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Certificate" + } + }, + "required": [ + "class" + ] + } + } + }, + "crlFile": { + "title": "Certificate Revocation List (CRL) File", + "description": "Specifies the name of a file containing a list of revoked client certificates", + "allOf": [ + { + "$ref": "#/definitions/Pointer_SSL_CRL_File" + } + ] + }, + "allowExpiredCRL": { + "title": "Allow Expired CRL", + "description": "Specifies if the CRL can be used even if it has expired", + "type": "boolean", + "default": false + }, + "c3dCertificateAuthority": { + "title": "C3D Certificate Authority", + "description": "Pointer to a Certificate class which specifies the Certificate Authority values for C3D", + "type": "string", + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Certificate" + } + }, + "required": [ + "class" + ] + } + } + }, + "c3dCertificateExtensions": { + "title": "C3D Certificate Extensions", + "description": "Specifies the custom extension OID of the client certificates to be included in the generated certificates using SSL C3D", + "type": "array", + "items": { + "type": "string", + "enum": [ + "basic-constraints", + "extended-key-usage", + "key-usage", + "subject-alternative-name" + ] + }, + "default": [ + "basic-constraints", + "extended-key-usage", + "key-usage", + "subject-alternative-name" + ] + }, + "c3dCertificateLifespan": { + "title": "C3D Certificate Lifespan", + "description": "Specifies the lifespan of the certificate generated using the SSL client certificate constrained delegation", + "type": "integer", + "maximum": 8760, + "minimum": 0, + "default": 24 + }, + "c3dEnabled": { + "title": "C3D Enabled", + "description": "Enables or disables SSL Client certificate constrained delegation (C3D). Using C3D eliminates the need for requiring users to provide credentials twice for certain authentication actions", + "type": "boolean", + "default": false + }, + "forwardProxyEnabled": { + "title": "Forward Proxy Enabled", + "description": "Enables or disables (default) SSL forward proxy", + "type": "boolean", + "default": false + }, + "forwardProxyBypassEnabled": { + "title": "Forward Proxy Bypass Enabled", + "description": "Enables or disables (default) SSL forward proxy bypass", + "type": "boolean", + "default": false + }, + "ldapStartTLS": { + "title": "Server-LDAP Profile", + "description": "Creates a client LDAP profile with the specified activation mode STARTTLS.", + "type": "string", + "enum": [ + "none", + "allow", + "require" + ] + }, + "insertEmptyFragmentsEnabled": { + "title": "Insert Empty Fragments Enabled", + "description": "Enables a countermeasure against an SSL 3.0/TLS 1.0 protocol vulnerability affecting CBC ciphers. These ciphers cannot be handled by certain broken SSL implementations.", + "type": "boolean", + "default": false + }, + "singleUseDhEnabled": { + "title": "Single Use DH Enabled", + "description": "Creates a new key when using temporary/ephemeral DH parameters. This option must be used to prevent small subgroup attacks, when the DH parameters were not generated using strong primes (for example. when using DSA-parameters). If strong primes were used, it is not strictly necessary to generate a new DH key during each handshake, but F5 Networks recommends it. Enable the Single DH Use option whenever temporary or ephemeral DH parameters are used.", + "type": "boolean", + "default": false + }, + "tls1_3Enabled": { + "title": "TLS 1.3", + "description": "Allow TLS 1.3 Ciphers. Note: tls1_3Enabled is only supported in tmos version 14.0+.", + "type": "boolean", + "default": false + }, + "tls1_2Enabled": { + "title": "TLS 1.2", + "description": "Allow TLS 1.2 Ciphers.", + "type": "boolean", + "default": true + }, + "tls1_1Enabled": { + "title": "TLS 1.1", + "description": "Allow TLS 1.1 Ciphers.", + "type": "boolean", + "default": true + }, + "tls1_0Enabled": { + "title": "TLS 1.0", + "description": "Allow TLS 1.0 Ciphers.", + "type": "boolean", + "default": true + }, + "renegotiationEnabled": { + "title": "Renegotiation", + "description": "Controls on a per-connection basis how the system responds to mid-stream SSL reconnection requests.", + "type": "boolean", + "default": true + }, + "retainCertificateEnabled": { + "title": "Retain Certificate", + "description": "When enabled, server certificate is retained in SSL session.", + "type": "boolean", + "default": true + }, + "sslEnabled": { + "title": "SSL", + "description": "Allow SSL protocol", + "type": "boolean", + "default": true + }, + "ssl3Enabled": { + "title": "SSL v3", + "description": "Allow SSL v3 protocol", + "type": "boolean", + "default": true + }, + "proxySslEnabled": { + "title": "Proxy SSL Enabled", + "description": "When enabled, further modification of application traffic within an SSL tunnel is allowed while still allowing the server to perform necessary authorization, authentication, and auditing steps. Requires a corresponding TLS_Server with this enabled to perform transparent SSL decryption.", + "type": "boolean", + "default": false + }, + "proxySslPassthroughEnabled": { + "title": "Proxy SSL Passthrough Enabled", + "description": "When enabled, it allows Proxy SSL to passthrough the traffic when ciphersuite negotiated between the client and server is not supported. Requires a corresponding TLS_Server with this enabled to perform transparent SSL decryption.", + "type": "boolean", + "default": false + }, + "secureRenegotiation": { + "title": "Secure Renegotiation", + "description": "Specifies the secure renegotiation mode. When set to require, any connection to an unpatched server will be aborted. For TLS_Client, require and require-strict are the same. When set to request, connections to unpatched servers will be permitted. Setting to request is not recommended as it is subject to active man-in-the-middle attacks.", + "type": "string", + "enum": [ + "request", + "require", + "require-strict" + ], + "default": "require-strict" + }, + "uncleanShutdownEnabled": { + "title": "Unclean Shutdown Enabled", + "description": "When enabled, the profile performs unclean shutdowns of all SSL connections, which means the underlying TCP connections are closed without exchanging the required SSL shutdown alerts.", + "type": "boolean", + "default": true + }, + "dtlsEnabled": { + "title": "DTLS Enabled", + "description": "Allows the DTLS protocol.", + "type": "boolean", + "default": true + }, + "dtls1_2Enabled": { + "title": "DTLS1.2 Enabled", + "description": "Allows the DTLS 1.2 protocol.", + "type": "boolean", + "default": true + }, + "dataZeroRoundTripTime": { + "title": "Data Zero Round Trip Time", + "description": "Specifies if TLSv1.3 should send 0-RTT early data when available.", + "type": "boolean", + "default": false + }, + "renegotiatePeriod": { + "title": "Renegotiate Period", + "description": "Specifies the number of seconds from the initial connect time after which the system renegotiates an SSL session. The default value is indefinite, which means that you do not want the system to renegotiate SSL sessions.", + "oneOf": [ + { + "type": "integer", + "minimum": 0, + "maximum": 4294967295 + }, + { + "type": "string", + "const": "indefinite" + } + ], + "default": "indefinite" + }, + "renegotiateSize": { + "title": "Renegotiate Size", + "description": "Specifies a throughput size, in megabytes, of SSL renegotiation. This option forces the traffic management system to renegotiate an SSL session based on the size, in megabytes, of application data that is transmitted over the secure channel. The default value is indefinite, which specifies that you do not want a throughput size.", + "oneOf": [ + { + "type": "integer", + "minimum": 0, + "maximum": 4294967295 + }, + { + "type": "string", + "const": "indefinite" + } + ], + "default": "indefinite" + } + }, + "allOf": [ + { + "if": { + "required": [ + "ciphers" + ] + }, + "then": { + "not": { + "required": [ + "cipherGroup" + ] + } + } + }, + { + "if": { + "not": { + "required": [ + "ciphers", + "cipherGroup" + ] + } + }, + "then": { + "properties": { + "ciphers": { + "default": "DEFAULT" + } + } + } + } + ], + "additionalProperties": false, + "required": [ + "class" + ] + }, + "Sender_Tag_Mapping": { + "title": "Sender and Tag Data Group Mapping", + "description": "Establishes a mapping between a sender value and data group containing tag substitution values", + "type": "object", + "properties": { + "senderId": { + "title": "Sender ID", + "description": "Specifies sender ID value", + "type": "string" + }, + "tagDataGroup": { + "description": "Specifies tag substitution data group", + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to data group if any (declared separately)", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Data_Group" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP data group", + "description": "Pathname of existing BIG-IP data group", + "type": "string", + "format": "f5bigip" + } + }, + "dependencies": { + "bigip": { + "properties": { + "isExternal": { + "title": "External data group", + "description": "Toggles whether existing data group is internal or external", + "type": "boolean", + "default": false + } + } + } + }, + "if": { + "properties": { + "isExternal": { + "const": true + } + } + }, + "then": { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm data-group external" + ] + } + }, + "else": { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm data-group internal" + ] + } + }, + "minProperties": 1, + "maxProperties": 2 + } + }, + "additionalProperties": false, + "required": [ + "senderId", + "tagDataGroup" + ] + }, + "FIX_Profile": { + "title": "FIX_Profile", + "type": "object", + "description": "Configures a Financial Information eXchange Protocol (FIX) profile", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "FIX_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "parentProfile": { + "description": "Specifies the name of the profile object to inherit the settings from", + "allOf": [ + { + "$ref": "#/definitions/Pointer_FIX_Profile" + } + ], + "default": { + "bigip": "/Common/fix" + } + }, + "errorAction": { + "title": "Error Action", + "description": "Specifies the error handling method", + "type": "string", + "enum": [ + "dont-forward", + "drop-connection" + ], + "default": "dont-forward" + }, + "fullLogonParsingEnabled": { + "title": " Fully Parse Logon Message", + "description": "Enables or disables logon message as always fully parsed. Other messages are parsed according to the configuration of Quick Parsing", + "type": "boolean", + "default": true + }, + "messageLogPublisher": { + "title": "Message Log Publisher", + "description": "Specifies the publisher for message logging", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Log_Publisher" + } + ] + }, + "reportLogPublisher": { + "description": "Specifies the publisher for error messages and status reports", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Log_Publisher" + } + ] + }, + "quickParsingEnabled": { + "title": "Quick Parsing", + "description": "Enables or disables quick parsing which parses the basic standard fields and validates message length and checksum", + "type": "boolean", + "default": false + }, + "responseParsingEnabled": { + "title": "Response Parsing", + "description": "Enables or disables response parsing which parses the messages from the FIX server. Applies the same parser configuration and error handling at server side as at client side. If not enabled, server side messages are directly passed through", + "type": "boolean", + "default": false + }, + "statisticsSampleInterval": { + "title": "Statistics Sample Interval", + "description": "Specifies the sample interval of the message rate in seconds", + "type": "integer", + "default": 20, + "minimum": 10, + "maximum": 4294967295 + }, + "senderTagMappingList": { + "title": "Sender and Tag Substitution Mapping", + "description": "Specifies the mappings between sender ID and tag substitution data group.", + "type": "array", + "items": { + "$ref": "#/definitions/Sender_Tag_Mapping" + } + } + }, + "additionalProperties": false, + "required": [ + "class" + ] + }, + "RTSP_Profile": { + "title": "RTSP_Profile", + "type": "object", + "description": "Real Time Streaming Protocol Profile", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "RTSP_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "idleTimeout": { + "title": "Idle Timeout", + "description": "The number of seconds that a Real-time Transport Protocol (RTP) connection is idle before the connection is eligible for deletion", + "if": { + "type": "integer" + }, + "then": { + "type": "integer", + "minimum": 0, + "maximum": 4294967295 + }, + "else": { + "type": "string", + "enum": [ + "indefinite", + "immediate" + ] + }, + "default": 300 + }, + "maxHeaderSize": { + "title": "Maximum Header Size", + "description": "The largest RTSP request or response header, in bytes, that the RTSP filter accepts before dropping the connection", + "type": "integer", + "default": 4096, + "minimum": 0, + "maximum": 4294967295 + }, + "maxQueuedData": { + "title": "Maximum Queued Data", + "description": "The maximum amount of data, in bytes, that the RTSP filter buffers before dropping the connection", + "type": "integer", + "default": 32768, + "minimum": 0, + "maximum": 4294967295 + }, + "unicastRedirect": { + "title": "Unicast Redirect", + "description": "When enabled specifies that the client can select the destination port for the streamed data. The destination address for the data is the source of the request.", + "type": "boolean", + "default": false + }, + "multicastRedirect": { + "title": "Multicast Redirect", + "description": "When enabled, if you are using multicast streams, specifies that the client has permission to supply a different destination IP address for the streamed data", + "type": "boolean", + "default": false + }, + "sessionReconnect": { + "title": "Session Reconnect", + "description": "When enabled specifies that the system persists a resumed control connection to the correct server. Typical clients do not support this behavior.", + "type": "boolean", + "default": false + }, + "realHTTPPersistence": { + "title": "Real HTTP Persistence", + "description": "When enabled specifies that the system automatically persists Real Networks-tunneled RTSP data over HTTP, which is over the RTSP port. When disabled, a user can override the default behavior with an iRule.", + "type": "boolean", + "default": true + }, + "checkSource": { + "title": "Check Source", + "description": "When true the system uses the source attribute in the transport header to establish the target address of the RTP stream, and before the response is forwarded to the client, updates the value of the source attribute to be the virtual address of the BIG-IP system. When false the system does not change the source attribute.", + "type": "boolean", + "default": true + }, + "proxy": { + "title": "Proxy", + "description": "Specifies whether the RTSP profile is associated with an RTSP proxy configuration", + "type": "string", + "enum": [ + "external", + "internal", + "none" + ], + "default": "none" + }, + "proxyHeader": { + "title": "Proxy Header", + "description": "When set, specifies the name of the header in the RTSP proxy configuration that is passed from the client-side virtual server to the server-side virtual server. Note that the name of the header must begin with X-. To use the proxyHeader option, you must specify a value for the proxy option. Note that the system removes this header from the request prior to sending the request to the server for processing.", + "type": "string" + }, + "RTPPort": { + "title": "RTP Port", + "description": "The number of the port to use for the RTP service", + "type": "integer", + "default": 0, + "minimum": 0, + "maximum": 65535 + }, + "RTCPPort": { + "title": "RTCP Port", + "description": "The number of the port to use for the Real Time Control Protocol (RTCP) service. RTCP allows monitoring of real-time data delivery.", + "type": "integer", + "default": 0, + "minimum": 0, + "maximum": 65535 + }, + "algLogProfile": { + "description": "ALG log profile pointer", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "cgnat" + ] + } + }, + { + "$ref": "#/definitions/Pointer_ALG_Log_Profile" + } + ] + }, + "logPublisher": { + "description": "Log publisher pointer", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "cgnat" + ] + } + }, + { + "$ref": "#/definitions/Pointer_Log_Publisher" + } + ] + } + }, + "additionalProperties": false, + "required": [ + "class" + ], + "dependencies": { + "algLogProfile": { + "required": [ + "logPublisher" + ] + }, + "logPublisher": { + "required": [ + "algLogProfile" + ] + } + } + }, + "SIP_Profile": { + "title": "SIP_Profile", + "type": "object", + "description": "Configures a profile you can use to manage Session Initiation Protocol (SIP) traffic.", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "SIP_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + } + }, + "additionalProperties": false, + "required": [ + "class" + ] + }, + "Statistics_Profile": { + "title": "Statistics Profile", + "type": "object", + "description": "User-defined statistics fields. This object assigns field names for up to 32 fields. You can then use these field names from an iRule to record values.", + "patternProperties": { + "^field(3[0-2]|[1-2][0-9]|[1-9])$": { + "title": "Field Name", + "description": "This regular expression represents 32 field properties named 'field1' through 'field32'.", + "type": "string" + } + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Statistics_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + } + }, + "additionalProperties": false, + "required": [ + "class" + ] + }, + "TFTP_Profile": { + "title": "TFTP_Profile", + "type": "object", + "description": "Trivial File Transer Protocol (TFTP) profile", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "TFTP_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "idleTimeout": { + "description": "Specifies an idle timeout in seconds. This setting specifies the number of seconds that a connection is idle before the connection is eligible for deletion.", + "if": { + "type": "integer" + }, + "then": { + "type": "integer", + "minimum": 0, + "maximum": 4294967295 + }, + "else": { + "type": "string", + "const": "indefinite" + }, + "default": 30 + }, + "algLogProfile": { + "description": "ALG log profile pointer", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "cgnat" + ] + } + }, + { + "$ref": "#/definitions/Pointer_ALG_Log_Profile" + } + ] + }, + "logPublisher": { + "description": "Log publisher pointer", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "cgnat" + ] + } + }, + { + "$ref": "#/definitions/Pointer_Log_Publisher" + } + ] + } + }, + "additionalProperties": false, + "required": [ + "class" + ], + "dependencies": { + "algLogProfile": { + "required": [ + "logPublisher" + ] + }, + "logPublisher": { + "required": [ + "algLogProfile" + ] + } + } + }, + "FTP_Profile": { + "title": "FTP_Profile", + "type": "object", + "description": "File Transfer Protocol (FTP) profile", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "FTP_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "port": { + "description": "Specifies a service for the data channel port used for this profile", + "type": "integer", + "default": 20, + "minimum": 0, + "maximum": 65535 + }, + "ftpsMode": { + "description": "Specifies the policy for explicit FTPS negotiation on FTP command channel", + "type": "string", + "enum": [ + "disallow", + "allow", + "require" + ], + "default": "disallow" + }, + "enforceTlsSessionReuseEnabled": { + "description": "Enforce data connection to reuse TLS session", + "type": "boolean", + "default": false, + "f5PostProcess": { + "tag": "minVersion", + "data": "14.0" + } + }, + "activeModeEnabled": { + "description": "Specifies if the profile should allow FTP active transfer mode", + "type": "boolean", + "default": true, + "f5PostProcess": { + "tag": "minVersion", + "data": "14.0" + } + }, + "securityEnabled": { + "description": "Specifies whether to enable or disable secure FTP traffic for the BIG-IP Application Security Manager", + "type": "boolean", + "default": false + }, + "translateExtendedEnabled": { + "description": "Specifies if the profile should automatically translate RFC2428 extended requests EPSV and EPRT to PASV and PORT when communicating with IPv4servers", + "type": "boolean", + "default": true + }, + "inheritParentProfileEnabled": { + "description": "Specifies if the FTP data channel should inherit the TCP profile used by the control channel", + "type": "boolean", + "default": false + }, + "algLogProfile": { + "description": "ALG log profile pointer", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "cgnat" + ] + } + }, + { + "$ref": "#/definitions/Pointer_ALG_Log_Profile" + } + ] + }, + "logPublisher": { + "description": "Log publisher pointer", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "cgnat" + ] + } + }, + { + "$ref": "#/definitions/Pointer_Log_Publisher" + } + ] + } + }, + "additionalProperties": false, + "required": [ + "class" + ], + "dependencies": { + "algLogProfile": { + "required": [ + "logPublisher" + ] + }, + "logPublisher": { + "required": [ + "algLogProfile" + ] + } + } + }, + "HTML_Rule": { + "title": "HTML_Rule", + "type": "object", + "description": "HTML Rule with configurable options", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "HTML_Rule" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "ruleType": { + "title": "Rule type", + "description": "Type of rule", + "type": "string", + "enum": [ + "comment-raise-event", + "comment-remove", + "tag-append-html", + "tag-prepend-html", + "tag-raise-event", + "tag-remove", + "tag-remove-attribute" + ] + } + }, + "allOf": [ + { + "if": { + "properties": { + "ruleType": { + "const": "tag-append-html" + } + } + }, + "then": { + "$ref": "#/definitions/HTML_Rule_TagAppendHTML" + } + }, + { + "if": { + "properties": { + "ruleType": { + "const": "tag-prepend-html" + } + } + }, + "then": { + "$ref": "#/definitions/HTML_Rule_TagPrependHTML" + } + }, + { + "if": { + "properties": { + "ruleType": { + "const": "tag-raise-event" + } + } + }, + "then": { + "$ref": "#/definitions/HTML_Rule_TagRaiseEvent" + } + }, + { + "if": { + "properties": { + "ruleType": { + "const": "tag-remove" + } + } + }, + "then": { + "$ref": "#/definitions/HTML_Rule_TagRemove" + } + }, + { + "if": { + "properties": { + "ruleType": { + "const": "tag-remove-attribute" + } + } + }, + "then": { + "$ref": "#/definitions/HTML_Rule_TagRemoveAttribute" + } + } + ], + "required": [ + "class", + "ruleType" + ] + }, + "HTML_Rule_Match_Attribute_Optional": { + "title": "HTML_Rule_Match_Attribute_Optional", + "description": "Matches on the specified tag name, attribute name, and attribute value. Attribute name and value are optional.", + "type": "object", + "properties": { + "match": { + "title": "Match", + "description": "Properties the rule is to match", + "type": "object", + "properties": { + "attributeName": { + "title": "Attribute Name", + "description": "Name of attribute", + "type": "string" + }, + "attributeValue": { + "title": "Attribute Value", + "description": "Value of attribute", + "type": "string" + }, + "tagName": { + "title": "Tag Name", + "description": "Name of tag", + "type": "string" + } + }, + "dependencies": { + "attributeValue": { + "required": [ + "attributeName" + ] + } + }, + "required": [ + "tagName" + ] + } + }, + "required": [ + "match" + ] + }, + "HTML_Rule_Match_Attribute_Required": { + "title": "HTML_Rule_Match_Attribute_Required", + "description": "Matches on the specified tag name, attribute name, and attribute value. Attribute name and value are required.", + "type": "object", + "properties": { + "match": { + "title": "Match", + "description": "Properties the rule is to match", + "type": "object", + "properties": { + "attributeName": { + "title": "Attribute Name", + "description": "Name of attribute", + "type": "string" + }, + "attributeValue": { + "title": "Attribute Value", + "description": "Value of attribute", + "type": "string" + }, + "tagName": { + "title": "Tag Name", + "description": "Name of tag", + "type": "string" + } + }, + "required": [ + "tagName", + "attributeName", + "attributeValue" + ] + } + }, + "required": [ + "match" + ] + }, + "HTML_Rule_TagAppendHTML": { + "title": "Append HTML HTML_Rule", + "description": "Matches on the specified tag name and optional attribute name and attribute value, and then appends the specified HTML content to the tag delimiter.", + "type": "object", + "properties": { + "content": { + "title": "Content", + "description": "HTML content to append to tag delimiter", + "type": "string" + } + }, + "allOf": [ + { + "$ref": "#/definitions/HTML_Rule_Match_Attribute_Optional" + } + ], + "required": [ + "content" + ] + }, + "HTML_Rule_TagPrependHTML": { + "title": "HTML_Rule_TagPrependHTML", + "description": "Matches on the specified tag name and optional attribute name and attribute value, and then prepends the specified HTML content to the tag delimiter.", + "type": "object", + "properties": { + "content": { + "title": "Content", + "description": "HTML content to prepend to tag delimiter", + "type": "string" + } + }, + "allOf": [ + { + "$ref": "#/definitions/HTML_Rule_Match_Attribute_Optional" + } + ], + "required": [ + "content" + ] + }, + "HTML_Rule_TagRaiseEvent": { + "title": "HTML_Rule_TagRaiseEvent", + "description": "Matches on the specified tag name and optional attribute name and attribute value, and then raises an event.", + "type": "object", + "allOf": [ + { + "$ref": "#/definitions/HTML_Rule_Match_Attribute_Optional" + } + ] + }, + "HTML_Rule_TagRemove": { + "title": "HTML_Rule_TagRemove", + "description": "Matches on the specified tag name and optional attribute name and attribute value, and then removes the tag.", + "type": "object", + "allOf": [ + { + "$ref": "#/definitions/HTML_Rule_Match_Attribute_Optional" + } + ] + }, + "HTML_Rule_TagRemoveAttribute": { + "title": "Append HTML HTML_Rule", + "description": "Matches on the specified tag name, attribute name, and attribute value, and then removes a specified attribute. Tag name, attribute name, and value are required.", + "type": "object", + "properties": { + "attributeName": { + "title": "Attriute Name", + "description": "Name of the attribute to be removed", + "type": "string" + } + }, + "allOf": [ + { + "$ref": "#/definitions/HTML_Rule_Match_Attribute_Required" + } + ], + "required": [ + "attributeName" + ] + }, + "HTML_Profile": { + "title": "HTML_Profile", + "type": "object", + "description": "HTML profile with configurable options", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "HTML_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "contentDetectionEnabled": { + "title": "Content Detection Enabled", + "description": "Scans initial HTTP payload to look for HTML signatures and enables HTML profile if HTML-like patterns are detected", + "type": "boolean", + "default": false + }, + "contentSelection": { + "title": "Content Selection", + "description": "Matches content-type from response header against a list of the content-types and enables HTML profile if a match is found", + "type": "array", + "items": { + "title": "Content Type", + "type": "string" + }, + "default": [ + "text/html", + "text/xhtml" + ], + "uniqueItems": true + }, + "rules": { + "title": "HTML Rules", + "description": "HTML Rules followed by the profile", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_HTML_Rule" + } + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "WebSocket_Profile": { + "additionalProperties": false, + "allOf": [ + { + "if": { + "properties": { + "masking": { + "const": "preserve" + } + }, + "required": [ + "masking" + ] + }, + "then": { + "properties": { + "compressMode": { + "not": { + "const": "typed" + } + } + }, + "required": [ + "compressMode" + ] + } + } + ], + "description": "WebSocket profile with configurable options", + "properties": { + "class": { + "const": "WebSocket_Profile", + "title": "Class", + "type": "string" + }, + "compressMode": { + "default": "preserved", + "description": "Available when TMOS version is 16.1 or newer. Specifies the mode that controls what compression operations are performed. Setting 'masking' to 'preserve' and 'compressMode' to 'typed' will not be allowed because it results in an invalid configuration.", + "enum": [ + "preserved", + "typed" + ], + "title": "Compress Mode", + "type": "string" + }, + "compression": { + "default": true, + "description": "Available when TMOS version is 16.1 or newer and used when compressMode is 'typed'. Specifies whether compress will be negotiated with the endpoint.", + "title": "Compression", + "type": "boolean" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "masking": { + "default": "selective", + "description": "Specifies the masking operation for WebSocket frames", + "enum": [ + "preserve", + "unmask", + "remask", + "selective" + ], + "title": "Masking", + "type": "string" + }, + "maximumWindowSize": { + "default": 10, + "description": "Available when TMOS version is 16.1 or newer and used when compressMode is 'typed'. Specifies the maximum sliding window for compression negotiated with the endpoint.", + "maximum": 15, + "minimum": 8, + "title": "Maximum Window Size", + "type": "integer" + }, + "noDelay": { + "default": true, + "description": "Available when TMOS version is 16.1 or newer and used when compressMode is 'typed'. Specifies whether data should be buffered for efficient compression, or compressed without delay.", + "title": "No Delay", + "type": "boolean" + }, + "remark": { + "$ref": "#/definitions/Remark" + } + }, + "title": "WebSocket_Profile", + "type": "object" + }, + "Multiplex_Profile": { + "title": "Multiplex_Profile", + "type": "object", + "description": "Multiplex (OneConnect) profile with configurable options", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Multiplex_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "sourceMask": { + "title": "Source Address Mask", + "description": "Idle connection re-use applies to connections whose source address matches this mask", + "type": "string", + "format": "f5ip" + }, + "maxConnections": { + "title": "Maximum Connections", + "description": "Specifies the maximum number of connections that the system holds in the connection reuse pool.", + "type": "integer", + "minimum": 0, + "default": 10000 + }, + "maxConnectionAge": { + "title": "Maximum Connection Age", + "description": "Specifies the maximum age, in number of seconds, of a connection in the connection reuse pool.", + "type": "integer", + "minimum": 0, + "default": 86400 + }, + "maxConnectionReuse": { + "title": "Maximum Connection Reuse", + "description": "Specifies the maximum number of times that a server connection can be reused.", + "type": "integer", + "minimum": 0, + "default": 1000 + }, + "idleTimeoutOverride": { + "title": "Idle Timeout Override", + "description": "Specifies the number of seconds that a connection is idle before the connection flow is eligible for deletion.", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "connectionLimitEnforcement": { + "title": "Connection Limit Enforcement", + "description": "When the limit is 'none', simultaneous in-flight requests and responses over TCP connections to a pool member are counted toward the limit. When the limit is 'idle', idle connections will be dropped as the TCP connection limit is reached. When the limit is 'strict', idle connections will prevent new TCP connections from being made until they expire (not recommended).", + "type": "string", + "enum": [ + "none", + "idle", + "strict" + ], + "default": "none" + }, + "sharePools": { + "title": "Share Pools", + "description": "Indicates that TCP connections for the current pool may be shared among similar virtual servers using the same pool.", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false, + "required": [ + "class" + ] + }, + "SOCKS_Profile": { + "title": "SOCKS_Profile", + "description": "Configures a SOCKS (Socket Secure) profile", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "SOCKS_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "protocolVersions": { + "description": "Specifies the SOCKS protocol versions that are supported", + "type": "array", + "items": { + "type": "string", + "enum": [ + "socks4", + "socks4a", + "socks5" + ] + }, + "default": [ + "socks4", + "socks4a", + "socks5" + ], + "minItems": 1, + "uniqueItems": true + }, + "resolver": { + "title": "DNS resolver", + "description": "BIG-IP AS3 pointer to DNS resolver used to resolve hostnames in connect requests", + "type": "object", + "properties": { + "bigip": { + "title": "BIG-IP resolver", + "description": "Pathname of existing BIG-IP net DNS resolver", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "required": [ + "bigip" + ], + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query net dns-resolver" + ] + } + }, + "ipv6First": { + "title": "IPv6 first priority", + "description": "Specifies the relative order of IPv4 and IPv6 DNS resolutions for URIs. If false (default), then the system performs IPv4 lookup before IPv6.", + "type": "boolean", + "default": false + }, + "routeDomain": { + "description": "The route domain that will be used for outbound connect requests", + "oneOf": [ + { + "type": "integer", + "minimum": 0, + "maximum": 65534 + }, + { + "type": "string" + } + ], + "default": 0 + }, + "tunnelName": { + "title": "Tunnel name", + "description": "Name of tunnel used for outbound connect requests", + "type": "string", + "minLength": 1, + "maxLength": 63, + "default": "socks-tunnel", + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query net tunnels tunnel" + ] + } + }, + "defaultConnectAction": { + "title": "Default Connect Action", + "description": "Specifies the behavior of the proxy service for connect requests. If set to 'deny', connect requests will only be honored if there is another virtual server listening for the requested outbound connection. If set to 'allow' outbound connection will be made ragardless of other virtual servers.", + "type": "string", + "enum": [ + "deny", + "allow" + ], + "default": "deny" + } + }, + "additionalProperties": false, + "required": [ + "class", + "resolver" + ] + }, + "TCP_Profile": { + "title": "TCP_Profile", + "description": "Configures a Transmission Control Protocol (TCP) profile", + "type": "object", + "$comment": "Configures TCP settings. When deployed on BIG-IP, defaults match f5-tcp-progressive.", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "TCP_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "abc": { + "title": "Appropriate Byte Counting", + "description": "If true (default), BIG-IP AS3 adjusts the congestion window per rfc3465", + "type": "boolean", + "default": true + }, + "ackOnPush": { + "title": "ACK on PSH", + "description": "If true (default), the system immediately acknowledges segments with the PSH flag set", + "type": "boolean", + "default": true + }, + "autoProxyBufferSize": { + "title": "Automatic proxy-buffer size", + "description": "If true (default), BIG-IP AS3 adjusts the proxy buffer size automatically to optimize throughput", + "type": "boolean", + "default": true + }, + "autoReceiveWindowSize": { + "title": "Automatic receive-window size", + "description": "If true (default), BIG-IP AS3 adjusts the receive window size automatically to optimize throughput", + "type": "boolean", + "default": true + }, + "autoSendBufferSize": { + "title": "Automatic send-buffer size", + "description": "If true (default), BIG-IP AS3 adjusts the send buffer size automatically to optimize throughput", + "type": "boolean", + "default": true + }, + "closeWaitTimeout": { + "title": "Close-wait timeout", + "description": "Number of seconds (default 5) connection will remain in LAST-ACK state before exiting. Value -1 means indefinite, limited by maximum retransmission timeout", + "type": "integer", + "minimum": -1, + "maximum": 3600, + "default": 5 + }, + "congestionControl": { + "title": "Congestion-control algorithm", + "description": "Selects TCP congestion-control algorithm (default 'woodside'). The bbr option is available on BIGIP 14.1 and above.", + "type": "string", + "enum": [ + "bbr", + "cdg", + "chd", + "cubic", + "high-speed", + "illinois", + "new-reno", + "none", + "reno", + "scalable", + "vegas", + "westwood", + "woodside" + ], + "default": "woodside" + }, + "congestionMetricsCache": { + "title": "Congestion metrics cache", + "description": "If true (default), the system may cache congestion metrics to inform the congestion control algorithm", + "type": "boolean", + "default": true + }, + "congestionMetricsCacheTimeout": { + "title": "Congestion metrics cache timeout", + "description": "Number of seconds for which entries in the congestion metrics cache are valid (default 0 means use system default)", + "type": "integer", + "minimum": 0, + "maximum": 1000, + "default": 0 + }, + "deferredAccept": { + "title": "Deferred accept", + "description": "If true, ADC will defer allocating resources to a connection until some payload data has arrived from the client (default false). This may help minimize the impact of certain DoS attacks but adds undesirable latency under normal conditions. Note: 'deferredAccept' is incompatible with server-speaks-first application protocols", + "type": "boolean", + "default": false + }, + "delayedAcks": { + "title": "Delayed ACKs", + "description": "If true (default), the system may coalesce multiple adjacent ACK responses", + "type": "boolean", + "default": true + }, + "delayWindowControl": { + "title": "Delay-window control", + "description": "If true, BIG-IP AS3 uses queueing delay as well as packet loss to estimate congestion (default false)", + "type": "boolean", + "default": false + }, + "dsack": { + "title": "Use D-SACK", + "description": "If true, BIG-IP AS3 uses rfc2883 duplicate selective-acknowledgements extension (default false). Do not enable this option unless you are certain all peers support D-SACK", + "type": "boolean", + "default": false + }, + "earlyRetransmit": { + "title": "Early retransmit", + "description": "If true (default), BIG-IP AS3 uses rfc5827 Early Retransmit recovery", + "type": "boolean", + "default": true + }, + "ecn": { + "title": "Explicit congestion notification", + "description": "If true (default), BIG-IP AS3 may send explicit congestion notification (ECN) flags (CWR, ECE) to peers", + "type": "boolean", + "default": true + }, + "enhancedLossRecovery": { + "title": "Enhanced loss recovery", + "description": "If true (default), BIG-IP AS3 uses Selective ACK data to increase throughput", + "type": "boolean", + "default": true + }, + "fastOpen": { + "title": "Fast-open", + "description": "If true (default), the system can use the TCP Fast Open protocol extension to reduce latency by sending payload data with initial SYN", + "type": "boolean", + "default": true + }, + "fastOpenCookieExpiration": { + "title": "Fast-open cookie expiration", + "description": "Sets maximum lifetime in seconds (default 21600 = six hours) of TCP Fast Open cookies", + "type": "integer", + "minimum": 1, + "maximum": 1000000, + "default": 21600 + }, + "finWaitTimeout": { + "title": "FIN-WAIT timeout", + "description": "Number of seconds (default 5) connection will remain in FIN-WAIT-1 or closing state before exiting. Value -1 means indefinite, limited by maximum retransmission timeout", + "type": "integer", + "minimum": -1, + "maximum": 3600, + "default": 5 + }, + "finWait2Timeout": { + "title": "FIN-WAIT-2 timeout", + "description": "Number of seconds (default 300) connection will remain in LAST-ACK state before closing. Value -1 means indefinite, limited by maximum retransmission timeout", + "type": "integer", + "minimum": -1, + "maximum": 3600, + "default": 300 + }, + "idleTimeout": { + "title": "Idle timeout", + "description": "Number of seconds (default 300; may not be 0) connection may remain idle before it becomes eligible for deletion. Value -1 (not recommended) means infinite", + "type": "integer", + "anyOf": [ + { + "minimum": 1, + "maximum": 86400 + }, + { + "const": -1 + } + ], + "default": 300 + }, + "initCwnd": { + "title": "Initial congestion-window size", + "description": "Sets the initial congestion-window size (default 16) in multiples of MSS (not in octets)", + "type": "integer", + "minimum": 0, + "maximum": 64, + "default": 16 + }, + "initRwnd": { + "title": "Initial receive-window size", + "description": "Sets the initial receive-window size (default 16) in multiples of MSS (not in octets)", + "type": "integer", + "minimum": 0, + "maximum": 64, + "default": 16 + }, + "ipDfMode": { + "title": "IP DF mode", + "description": "Controls DF (Don't Fragment) flag in outgoing packets. Value 'pmtu' (default) sets DF based on IP PMTU value. Value 'preserve' copies DF from received packets. Value 'set' forces DF true in all outgoing packets. Value 'clear' forces DF false in all outgoing packets", + "type": "string", + "enum": [ + "clear", + "pmtu", + "preserve", + "set" + ], + "default": "pmtu" + }, + "ipTosToClient": { + "title": "IP DSCP (TOS) to client", + "description": "Specifies the IP DSCP/TOS value in packets sent to clients (default 0). Numeric values in this property are decimal representations of eight-bit numbers, of which the leftmost six bits are the DSCP per rfc2474 (and the system uses the rightmost two bits for congestion signaling when 'ecn' is true). You may have to calculate the value of this property by multiplying a DSCP code, such as CS5+EF = 46, by four to obtain the proper 'ipTosToClient' value, such as 184. Value 'pass-through' sets DSCP from the initial server-side value. Value 'mimic' copies DSCP from the most-recently received server-side packet (allowing DSCP to vary during the life of a connection)", + "oneOf": [ + { + "type": "integer", + "minimum": 0, + "maximum": 252, + "multipleOf": 4 + }, + { + "type": "string", + "enum": [ + "pass-through", + "mimic" + ] + } + ], + "default": 0 + }, + "keepAliveInterval": { + "title": "Keep-alive interval", + "description": "Number of seconds (default 1800) between keep-alive probes", + "type": "integer", + "minimum": 1, + "maximum": 86400, + "default": 1800 + }, + "limitedTransmit": { + "title": "Limited transmit recovery", + "description": "When true (default), the system can use rfc3042 limited transmit recovery scheme", + "type": "boolean", + "default": true + }, + "linkQosToClient": { + "title": "Link QOS to client", + "description": "Specifies the Layer-2 QOS code in packets sent to clients (default 0). Ethernet-type networks recognize codes from 0 to 7. Value 'pass-through' sets QOS from the initial server-side value", + "oneOf": [ + { + "type": "integer", + "minimum": 0, + "maximum": 7 + }, + { + "type": "string", + "const": "pass-through" + } + ], + "default": 0 + }, + "maxRetrans": { + "title": "Maximum segment retransmissions", + "description": "Sets maximum number of times the system may retransmit a segment (default 8)", + "type": "integer", + "minimum": 0, + "maximum": 12, + "default": 8 + }, + "maxSegmentSize": { + "title": "MSS", + "description": "Sets MSS advertised to peer. Value 0 (default) will set MSS automatically in proportion to interface MTU. Default 0 is usually the best choice", + "type": "integer", + "anyOf": [ + { + "minimum": 28, + "maximum": 8960 + }, + { + "const": 0 + } + ], + "default": 0 + }, + "md5Signature": { + "title": "MD5 signatures", + "description": "If true, the system signs TCP headers using MD5 per rfc2385 (default false)", + "type": "boolean", + "default": false + }, + "md5SignaturePassphrase": { + "title": "MD5 passphrase", + "description": "Passphrase from which the system derives the key for MD5 signatures (MACs) when 'md5signature' is true", + "type": "object", + "properties": { + "allowReuse": { + "description": "If true, other declaration objects may reuse this value", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Secret" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "object" + } + }, + { + "f5PostProcess": { + "tag": "secret" + } + } + ] + }, + "minimumRto": { + "title": "Minimum retransmission timeout", + "description": "Minimum retransmission timeout in milliseconds (default 1000)", + "type": "integer", + "minimum": 1, + "maximum": 5000, + "default": 1000 + }, + "mptcp": { + "title": "Multipath TCP (MPTCP)", + "description": "Value 'disable' (default) excludes use of Multipath TCP (MPTCP) through virtual server. Value 'enable' means virtual server will accept and participate in MPTCP connections. Value 'passthrough' means MPTCP packets may pass through virtual server", + "type": "string", + "enum": [ + "disable", + "enable", + "passthrough" + ], + "default": "disable" + }, + "mptcpCsum": { + "title": "MPTCP checksums", + "description": "If true, the system calculates MPTCP checksums (default false)", + "type": "boolean", + "default": false + }, + "mptcpCsumVerify": { + "title": "MPTCP checksum verify", + "description": "If true, the system verifies MPTCP checksums (default false)", + "type": "boolean", + "default": false + }, + "mptcpFallback": { + "title": "MPTCP fallback action", + "description": "Selects action on fallback from MPTCP to ordinary TCP", + "type": "string", + "enum": [ + "accept", + "active-accept", + "reset", + "retransmit" + ], + "default": "reset" + }, + "mptcpFastJoin": { + "title": "MPTCP fast join", + "description": "If true, the system may send data with MP_JOIN SYN packet, reducing connection latency (default false)", + "type": "boolean", + "default": false + }, + "mptcpIdleTimeout": { + "title": "Idle timeout", + "description": "Number of seconds (default 300) connection may remain idle before it becomes eligible for deletion", + "type": "integer", + "minimum": 1, + "maximum": 86400, + "default": 300 + }, + "mptcpJoinMax": { + "title": "MPTCP join maximum", + "description": "Limit on number of subflows which the system may add to the MPTCP connection (default 5)", + "type": "integer", + "minimum": 1, + "maximum": 20, + "default": 5 + }, + "mptcpMakeAfterBreak": { + "title": "MPTCP make-after-break", + "description": "If true, the system can add additional subflows during the 'mptcpTimeout' period, even if the ADC is not currently handling an active connection (default false)", + "type": "boolean", + "default": false + }, + "mptcpNoJoinDssAck": { + "title": "MPTCP fast join", + "description": "If true, no DSS option will sent with MP_JOIN ACK packet (default false)", + "type": "boolean", + "default": false + }, + "mptcpRtoMax": { + "title": "MPTCP RTO maximum", + "description": "Maximum number of retransmission timeouts which may occur before the system declares a subflow dead", + "type": "integer", + "minimum": 1, + "maximum": 20, + "default": 5 + }, + "mptcpRetransmitMin": { + "title": "MPTCP retransmit timer", + "description": "Minimum value in milliseconds (default 1000) of MPTCP retransmission timer", + "type": "integer", + "minimum": 1, + "maximum": 5000, + "default": 1000 + }, + "mptcpSubflowMax": { + "title": "MPTCP subflow maximum", + "description": "Maximum number of subflows per connection (default 6)", + "type": "integer", + "minimum": 1, + "maximum": 20, + "default": 6 + }, + "mptcpTimeout": { + "title": "MPTCP timeout", + "description": "Number of seconds (default 3600) after which the system may expunge an MPTCP session with no active flow", + "type": "integer", + "minimum": 60, + "maximum": 3600, + "default": 3600 + }, + "nagle": { + "title": "Nagle's algorithm", + "description": "Value 'enable' means to use Nagle's algorithm to minimize the transmission of short TCP segments (note: Nagle's algorithm yields undesirable results with many application protocols). Value 'auto' (default) means the ADC will choose automatically whether to enable Nagle's algorithm. Value 'disable' averts application of Nagle's algorithm", + "type": "string", + "enum": [ + "disable", + "enable", + "auto" + ], + "default": "auto" + }, + "pktLossIgnoreBurst": { + "title": "Packet loss ignore burst", + "description": "Modulates use of congestion control when losing multiple packets. Value 0 (default) means to perform congestion control if any packet loss occurs. Higher values increase tolerance for lost packets before signaling congestion", + "type": "integer", + "minimum": 0, + "maximum": 32, + "default": 0 + }, + "pktLossIgnoreRate": { + "title": "Packet loss ignore rate", + "description": "Sets threshold of packet loss rate (lost-packets/million-packets) above which the system performs congestion control. Value 0 (default) means to perform congestion control if any packet loss occurs. Higher values increase tolerance for lost packets before signaling congestion", + "type": "integer", + "minimum": 0, + "maximum": 1000000, + "default": 0 + }, + "proxyBufferHigh": { + "title": "Proxy-buffer high", + "description": "The system closes the receive window when the number of octets in proxy buffer rises above this value", + "type": "integer", + "minimum": 64, + "maximum": 33554432, + "default": 262144 + }, + "proxyBufferLow": { + "title": "Proxy-buffer low", + "description": "The system opens the receive window when the number of octets in proxy buffer falls below this value", + "type": "integer", + "minimum": 64, + "maximum": 33554432, + "default": 196608 + }, + "proxyMSS": { + "title": "Proxy MSS", + "description": "If true (default), the MSS value advertised on the server side will match that negotiated with the client, if permitted by MTU and other constraints", + "type": "boolean", + "default": true + }, + "proxyOptions": { + "title": "Proxy options", + "description": "If true, TCP options such as timestamp advertised on the server side will match those negotiated with client (default false)", + "type": "boolean", + "default": false + }, + "pushFlag": { + "title": "PuSH flag control", + "description": "Controls when ADC sets PSH flag in outbound TCP segments. Limiting the sending of segments with PSH improves performance. Value 'auto' (recommended) sets PSH according to a system algorithm optimal in most cases. Value 'default' (not recommended) sets the PUSH flag in every segment which happens to empty the send buffer. Value 'none' prevents use of the PSH flag, and 'one' means the system sets PSH only when FIN is, at the end of a connection", + "type": "string", + "enum": [ + "auto", + "default", + "none", + "one" + ], + "default": "auto" + }, + "ratePace": { + "title": "Rate pace", + "description": "If true (default), system will automatically pace rate of data transmission to optimize throughput", + "type": "boolean", + "default": true + }, + "ratePaceMaxRate": { + "title": "Rate pace maximum rate", + "description": "Limit maximum data-transmission rate in octets/second to this value when 'ratePace' is true. Default 0 means choose maximum rate automatically", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "$comment": "maximum in future: 137438953472", + "default": 0 + }, + "receiveWindowSize": { + "title": "Receive-window size", + "description": "Maximum size of receive window (octets, default 131072)", + "type": "integer", + "minimum": 64, + "maximum": 33554432, + "default": 131072 + }, + "resetOnTimeout": { + "title": "Reset on timeout", + "description": "If true (default), connections which time out will be reset (that is, the system will send an RST packet to the peer) before the system expunges them. Value false is not recommended", + "type": "boolean", + "default": true + }, + "retransmitThreshold": { + "title": "Retransmit threshold", + "description": "Specifies the number of duplicate ACKs to start fast recovery", + "type": "integer", + "minimum": 0, + "maximum": 12, + "default": 3 + }, + "selectiveAcks": { + "title": "Selective ACKs", + "description": "If true (default), the system negotiates rfc2018 Selective Acknowledgements with peers", + "type": "boolean", + "default": true + }, + "selectiveNack": { + "title": "Selective NAK", + "description": "If true, the system negotiates Selective Negative Acknowledgements with peers (default false)", + "type": "boolean", + "default": false + }, + "sendBufferSize": { + "title": "Send-buffer size", + "description": "Maximum size of send buffer (octets, default 262144)", + "type": "integer", + "minimum": 64, + "maximum": 33554432, + "default": 262144 + }, + "slowStart": { + "title": "Slow-start", + "description": "If true (default), BIG-IP AS3 adjusts the initial window size per rfc3390. This generally makes connections start more quickly, NOT more slowly", + "type": "boolean", + "default": true + }, + "synCookieEnable": { + "title": "SYN cookie enable", + "description": "If true (default), the system may use SYN cookies to avert connection-table overflow (for example, from DoS attacks)", + "type": "boolean", + "default": true + }, + "synCookieAllowlist": { + "title": "SYN cookie allowlist", + "description": "If true, after a client responds successfully to a SYN cookie challenge, the system accepts additional connection requests from that client without challenge for 30 seconds.", + "type": "boolean" + }, + "synCookieWhitelist": { + "title": "SYN cookie whitelist", + "description": "Deprecated. Replaced with functionally equivalent synCookieAllowlist. If true, after a client responds successfully to a SYN cookie challenge, the system accepts additional connection requests from that client without challenge for 30 seconds.", + "type": "boolean", + "default": false + }, + "synMaxRetrans": { + "title": "Maximum SYN retransmissions", + "description": "Maximum number of times the system retransmits a SYN when it does not receive a SYN+ACK (default 3)", + "type": "integer", + "minimum": 0, + "maximum": 12, + "default": 3 + }, + "synRtoBase": { + "title": "SYN RTO base", + "description": "Number of milliseconds (default 3000) to which the system initially sets the SYN retransmission timer. The system adjusts the timer after each retransmission to implement binary-exponential-backoff", + "type": "integer", + "minimum": 0, + "maximum": 5000, + "default": 3000 + }, + "tailLossProbe": { + "title": "Tail loss probe", + "description": "If true (default), the system uses the Tail Loss Probe scheme to reduce retransmission timeouts", + "type": "boolean", + "default": true + }, + "tcpOptions": { + "title": "TCP options capture for iRules", + "description": "Selects which TCP Option values the system captures for reference by iRules", + "type": "array", + "items": { + "title": "Option", + "type": "object", + "properties": { + "option": { + "title": "Number", + "description": "Specifies the TCP option to capture", + "type": "integer", + "minimum": 0, + "maximum": 255 + }, + "when": { + "title": "When seen", + "description": "Specifies when to capture the TCP option", + "type": "string", + "enum": [ + "first", + "last" + ] + } + }, + "additionalProperties": false + }, + "maxItems": 255, + "$comment": "uniqueItems: true" + }, + "timestamps": { + "title": "Timestamps", + "description": "If true (default and recommended), BIG-IP AS3 enables rfc1323 timestamps", + "type": "boolean", + "default": true + }, + "timeWaitRecycle": { + "title": "TIME-WAIT recycle", + "description": "If true (default), the system reuses connection resources immediately when it receives a SYN during the TIME-WAIT period", + "type": "boolean", + "default": true + }, + "timeWaitTimeout": { + "title": "Time-wait timeout", + "description": "Number of milliseconds (default 2,000) connection will remain in TIME-WAIT state before closing. Value -1 means indefinite", + "type": "integer", + "minimum": -1, + "maximum": 600000, + "default": 2000 + }, + "ttlMode": { + "title": "TTL mode", + "description": "Controls IP TTL in outgoing packets. Value 'set' forces TTL to value of property 'ttlIPv4' or 'ttlIPv6' as appropriate. Value 'proxy' (default) forces TTL to the default value for IPv4 or IPv6 as appropriate. Value 'preserve' copies TTL from received packet. Value 'decrement' sets TTL to one less than received packet's TTL", + "type": "string", + "enum": [ + "decrement", + "preserve", + "proxy", + "set" + ], + "default": "proxy" + }, + "ttlIPv4": { + "title": "TTL for IPv4", + "description": "TTL the system sets in outgoing IPv4 packets", + "type": "integer", + "minimum": 1, + "maximum": 255, + "default": 255 + }, + "ttlIPv6": { + "title": "TTL for IPv6", + "description": "TTL the system sets in outgoing IPv6 packets", + "type": "integer", + "minimum": 1, + "maximum": 255, + "default": 64 + }, + "verifiedAccept": { + "title": "Verified accept", + "description": "If true, the system must establish a server-side connection before a it accepts a corresponding client-side connection (default false). Value 'true' is incompatible with iRules", + "type": "boolean", + "default": false + }, + "zeroWindowTimeout": { + "title": "Zero-window timeout", + "description": "Number of milliseconds (default 20,000) connection will persist with window-size of zero (effective timeout is value rounded up to the nearest multiple of 5000). Value -1 means indefinite", + "type": "integer", + "minimum": -1, + "maximum": 86400000, + "default": 20000 + } + }, + "additionalProperties": false, + "required": [ + "class" + ], + "f5aliases": { + "synCookieAllowlist": "synCookieWhitelist" + } + }, + "Classification_Profile": { + "title": "Classification_Profile", + "description": "Configures a classification profile", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Classification_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "parentProfile": { + "description": "Specifies the name of the object to inherit the settings from", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Classification_Profile" + } + ], + "default": { + "bigip": "/Common/classification" + } + }, + "appDetectionEnabled": { + "description": "Enables/disables Application Detection feature", + "type": "boolean", + "default": true + }, + "urlCategorizationEnabled": { + "description": "Enables/disables URL Categorization feature", + "type": "boolean", + "default": false + }, + "iRuleEventEnabled": { + "description": "Enables/disables CLASSIFICATION_DETECTED iRule event generation", + "type": "boolean", + "default": false + }, + "logPublisher": { + "$ref": "#/definitions/Pointer_Log_Publisher" + }, + "logUnclassifiedDomain": { + "description": "Enables/disables unclassified domain logging", + "type": "boolean", + "default": false + }, + "preset": { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Classification_Preset" + } + ], + "default": { + "bigip": "/Common/ce" + } + }, + "statisticsCollectionEnabled": { + "description": "Enables/disables statistics collection", + "type": "boolean", + "default": false + }, + "statisticsPublisher": { + "$ref": "#/definitions/Pointer_Log_Publisher" + } + }, + "additionalProperties": false, + "required": [ + "class" + ] + }, + "Radius_Profile": { + "title": "Radius_Profile", + "description": "Configures a RADIUS profile for network traffic load balancing", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Radius_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "parentProfile": { + "description": "Specifies the name of the object to inherit the settings from", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Radius_Profile" + } + ], + "default": { + "bigip": "/Common/radiusLB" + } + }, + "persistAttribute": { + "description": "Specifies the name of the RADIUS attribute on which traffic persists. Acceptable values are ASCII strings from section 5 of RFC 2865 or numeric codes (1-255). A value of none indicates that persistence is disabled.", + "oneOf": [ + { + "type": "integer", + "minimum": 1, + "maximum": 255 + }, + { + "type": "string", + "enum": [ + "none", + "User-Name", + "User-Password", + "NAS-IP-Address", + "NAS-Port", + "Service-Type", + "Framed-Protocol", + "Framed-IP-Address", + "Framed-IP-Netmask", + "Framed-Routing", + "Filter-Id", + "Framed-MTU", + "Framed-Compression", + "Login-IP-Host", + "Login-Service", + "Login-TCP-Port", + "Reply-Message", + "Callback-Number", + "Callback-Id", + "Framed-Route", + "Framed-IPX-Network", + "State", + "Class", + "Vendor-Specific", + "Session-Timeout", + "Idle-Timeout", + "Termination-Action", + "Called-Station-Id", + "Calling-Station-Id", + "NAS-Identifier", + "Proxy-State", + "Login-LAT-Service", + "Login-LAT-Node", + "Login-LAT-Group", + "Framed-AppleTalk-Link", + "Framed-AppleTalk-Network", + "Framed-AppleTalk-Zone", + "CHAP-Challenge", + "NAS-Port-Type", + "Port-Limit", + "Login-LAT-Port" + ] + } + ], + "default": "none" + }, + "protocolProfile": { + "description": "Specifies PEM protocol profile that defines mapping of RADIUS AVPs to subscriber ID and other PEM subscriber session attributes", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "pem", + "afm" + ] + } + }, + { + "$ref": "#/definitions/Pointer_Enforcement_Protocol_Profile_Radius" + } + ], + "default": { + "bigip": "/Common/_sys_radius_proto_imsi" + } + }, + "subscriberDiscoveryEnabled": { + "description": "Specifies whether to enable PEM subscriber discovery based on the content of RADIUS packets", + "type": "boolean", + "f5PostProcess": { + "tag": "modules", + "data": [ + "pem", + "afm" + ] + }, + "default": true + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "IP_Other_Profile": { + "title": "IP_Other_Profile", + "description": "Configures a generic IP profile for non-TCP and non-UDP traffic", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "IP_Other_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "parentProfile": { + "description": "Specifies the name of the object to inherit the settings from", + "allOf": [ + { + "$ref": "#/definitions/Pointer_IP_Other_Profile" + } + ], + "default": { + "bigip": "/Common/ipother" + } + }, + "idleTimeout": { + "description": "Specifies the number of seconds a connection can be idle before the connection is eligible for deletion", + "$comment": "It might be possible to specify a value of 0 and remove the immediate option", + "if": { + "type": "integer" + }, + "then": { + "type": "integer", + "minimum": 0, + "maximum": 4294967295 + }, + "else": { + "type": "string", + "enum": [ + "indefinite", + "immediate" + ] + }, + "default": 60 + } + }, + "additionalProperties": false, + "required": [ + "class" + ] + }, + "Label": { + "title": "Label", + "description": "Optional friendly name for this object. Allows 0-64 chars, excluding a few likely to cause trouble with string searching, JS, TCL, or HTML", + "type": "string", + "pattern": "^[^\\x00-\\x1f\\x22#&*<>?\\x5b-\\x5d`\\x7f]*$", + "minLength": 0, + "maxLength": 64 + }, + "Remark": { + "title": "Remark", + "description": "Arbitrary (brief) text pertaining to this object. Allows 0-64 chars, excluding only control characters, double-quote, and backslash. This is permissive enough that you should worry about XSS attacks", + "type": "string", + "pattern": "^[^\\x00-\\x1f\\x22\\x5c\\x7f]*$", + "minLength": 0, + "maxLength": 64 + }, + "F5base64": { + "type": "string", + "description": "Slightly over-matches both base64-orig and base64-url data", + "pattern": "^([0-9A-Za-z/+_-]*|[0-9A-Za-z/+_-]+={1,2})$" + }, + "F5string": { + "title": "String value", + "description": "String value optionally in base64 or from URL or BIG-IP AS3 pointer", + "if": { + "not": { + "type": "object" + } + }, + "then": { + "type": "string" + }, + "else": { + "$comment": "May add 'cryptogram' in future.", + "properties": { + "base64": { + "title": "Base64", + "description": "Base64-encoded value (in JSON string)", + "type": "string", + "allOf": [ + { + "$ref": "#/definitions/F5base64" + } + ] + }, + "text": { + "title": "Text", + "description": "UTF-8 text (in JSON string)", + "type": "string" + }, + "url": { + "$ref": "#/definitions/Resource_URL" + }, + "copyFrom": { + "title": "Copy from", + "description": "BIG-IP AS3 pointer to declaration object/property from which to copy value", + "type": "string", + "format": "f5pointer" + }, + "bigip": { + "title": "BIG-IP component pathname", + "description": "Pathname of existing BIG-IP component", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1 + } + }, + "Metadata": { + "title": "Metadata", + "type": "object", + "description": "Useful datapoints for tracking, tagging, and organizing declarations.", + "$comment": "Properties are arbitrarily set by the user.", + "additionalProperties": { + "type": "object", + "properties": { + "value": { + "type": "string" + }, + "persist": { + "type": "boolean", + "default": true + } + }, + "required": [ + "value" + ], + "additionalProperties": false + } + }, + "Rewrite_Profile": { + "title": "Rewrite_Profile", + "type": "object", + "description": "Configures a rewrite profile", + "properties": { + "class": { + "type": "string", + "const": "Rewrite_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "bypassList": { + "description": "List of URIs that are bypassed in a web page when a rewrite mode of portal is used", + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "clientCachingType": { + "description": "The type of client caching used", + "type": "string", + "enum": [ + "cache-all", + "cache-css-js", + "cache-img-css-js", + "no-cache" + ], + "default": "cache-css-js" + }, + "javaCaFile": { + "description": "The CA Bundle used to verify Java applets signature certificates", + "allOf": [ + { + "$ref": "#/definitions/Pointer_CA_Bundle" + } + ], + "default": { + "bigip": "/Common/ca-bundle.crt" + } + }, + "javaSignKeyPassphrase": { + "description": "Passphrase if any for query authentication", + "type": "object", + "properties": { + "allowReuse": { + "description": "If true, other declaration objects may reuse this value", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Secret" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "object" + } + }, + { + "f5PostProcess": { + "tag": "secret" + } + } + ] + }, + "certificate": { + "description": "BIG-IP AS3 pointer to client Certificate declaration (optional)", + "type": "string", + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Certificate" + } + }, + "required": [ + "class" + ] + } + } + }, + "locationSpecificEnabled": { + "description": "Specifies if this contains an attribute with values specific to the location that the BIG-IP device resides", + "type": "boolean", + "default": false + }, + "requestSettings": { + "description": "The request settings used for uri-translation", + "allOf": [ + { + "$ref": "#/definitions/Rewrite_Profile_Request_Settings" + } + ], + "default": {} + }, + "responseSettings": { + "description": "The response settings used for uri-translation", + "allOf": [ + { + "$ref": "#/definitions/Rewrite_Profile_Response_Settings" + } + ], + "default": {} + }, + "rewriteList": { + "description": "List of URIs that are rewritten inside a web page when a rewrite mode of portal is used", + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "rewriteMode": { + "description": "The mode of rewriting that is used.uri-translation is a rules-based rewrite mode. portal is for use with Portal Access", + "type": "string", + "enum": [ + "portal", + "uri-translation" + ], + "default": "portal" + }, + "setCookieRules": { + "description": "The rules for rewriting HTTP Set-Cookie headers. Used with a rewrite mode of uri-translation", + "type": "array", + "items": { + "$ref": "#/definitions/Rewrite_Profile_Set_Cookie_Rule" + } + }, + "splitTunnelingEnabled": { + "description": "Determines if the profile provides for split tunneling", + "type": "boolean", + "default": false + }, + "uriRules": { + "description": "The rules for rewriting request and response headers and response bodies. Used with a rewrite mode of uri-translation", + "type": "array", + "items": { + "$ref": "#/definitions/Rewrite_Profile_Uri_Rule" + } + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "Rewrite_Profile_Set_Cookie_Rule": { + "description": "A Set-Cookie rule", + "type": "object", + "properties": { + "client": { + "description": "The client domain and path", + "type": "object", + "properties": { + "domain": { + "description": "The domain of the client", + "type": "string", + "minLength": 1 + }, + "path": { + "description": "The path of the client. Must be an absolute directory path", + "type": "string", + "minLength": 1 + } + }, + "required": [ + "domain", + "path" + ], + "additionalProperties": false + }, + "server": { + "description": "The server domain and path", + "type": "object", + "properties": { + "domain": { + "description": "The domain of the server", + "type": "string", + "minLength": 1 + }, + "path": { + "description": "The path of the server. Must be an absolute directory path", + "type": "string", + "minLength": 1 + } + }, + "required": [ + "domain", + "path" + ], + "additionalProperties": false + } + }, + "required": [ + "client", + "server" + ], + "additionalProperties": false + }, + "Rewrite_Profile_Uri_Rule": { + "description": "A URI rule", + "type": "object", + "properties": { + "type": { + "description": "The type of rule. request will affect request headers only, response will affect response headers and bodies, and both will do request and response", + "type": "string", + "enum": [ + "both", + "request", + "response" + ], + "default": "both" + }, + "client": { + "description": "The client URI", + "type": "object", + "properties": { + "scheme": { + "description": "The scheme of the client URI", + "type": "string" + }, + "host": { + "description": "The host of the client URI", + "type": "string", + "minLength": 1 + }, + "port": { + "description": "The port of the client URI", + "type": "string" + }, + "path": { + "description": "The path of the client URI. Must be an absolute directory path", + "type": "string", + "minLength": 1 + } + }, + "required": [ + "path" + ], + "dependencies": { + "host": { + "required": [ + "path", + "scheme" + ] + }, + "scheme": { + "required": [ + "path", + "host" + ] + }, + "port": { + "required": [ + "path", + "host", + "scheme" + ] + } + }, + "additionalProperties": false + }, + "server": { + "description": "The server URI", + "type": "object", + "properties": { + "scheme": { + "description": "The scheme of the server URI", + "type": "string" + }, + "host": { + "description": "The host of the server URI", + "type": "string", + "minLength": 1 + }, + "port": { + "description": "The port of the server URI", + "type": "string" + }, + "path": { + "description": "the path of the server URI. Must be an absolute directory path", + "type": "string", + "minLength": 1 + } + }, + "required": [ + "path" + ], + "dependencies": { + "host": { + "required": [ + "path", + "scheme" + ] + }, + "scheme": { + "required": [ + "path", + "host" + ] + }, + "port": { + "required": [ + "path", + "host", + "scheme" + ] + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "Rewrite_Profile_Request_Settings": { + "description": "Request settings for Rewrite_Profile", + "type": "object", + "properties": { + "insertXforwardedForEnabled": { + "description": "Determines if X-Forwarded-For header", + "type": "boolean", + "default": true + }, + "insertXforwardedHostEnabled": { + "description": "Determines if X-Forwarded-Proto header", + "type": "boolean", + "default": false + }, + "insertXforwardedProtoEnabled": { + "description": "Determines if X-Forwarded-Host header", + "type": "boolean", + "default": false + }, + "rewriteHeadersEnabled": { + "description": "Determines if request headers are rewritten", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false + }, + "Rewrite_Profile_Response_Settings": { + "description": "Response settings for Rewrite_Profile", + "type": "object", + "properties": { + "rewriteContentEnabled": { + "description": "Determines if response content should be rewritten", + "type": "boolean", + "default": true + }, + "rewriteHeadersEnabled": { + "description": "Determines if response headers should be rewritten", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false + }, + "Stream_Profile": { + "title": "Stream_Profile", + "description": "Configures a Stream profile", + "type": "object", + "properties": { + "class": { + "type": "string", + "const": "Stream_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "parentProfile": { + "description": "Specifies the profile that this profile will inherit values from", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Stream_Profile" + } + ], + "default": { + "bigip": "/Common/stream" + } + }, + "chunkingEnabled": { + "description": "Specifies that incoming data should be parsed in chunks", + "type": "boolean", + "default": false + }, + "chunkSize": { + "description": "The maximum size that a parsed chunk can be", + "type": "integer", + "minimum": 1024, + "maximum": 65535, + "default": 4096 + }, + "source": { + "description": "Specifies the string to rewrite", + "type": "string" + }, + "target": { + "description": "Specifies the new string that will replace the source string", + "type": "string" + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "Access_Profile": { + "title": "Access_Profile", + "description": "Configures an Access Profile", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "apm" + ] + }, + "properties": { + "class": { + "type": "string", + "const": "Access_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "url": { + "title": "URL", + "description": "The URL to pull the Access Profile from", + "allOf": [ + { + "$ref": "#/definitions/Resource_URL" + } + ] + }, + "ssloCreated": { + "title": "SSL Orchestrator Created", + "description": "Set to true if the profile was created by SSL Orchestrator. If true the non-configurable Kerberos Request-Based Authentication (/Common/rba) and WebSSO (/Common/websso) profiles will not be attached to Services when this profile is attached", + "type": "boolean", + "default": false + }, + "ignoreChanges": { + "title": "Ignore changes", + "description": "If false (default), the system updates the profile in every BIG-IP AS3 declaration deployment. If true, BIG-IP AS3 creates the profile on first deployment, and leaves it untouched afterwards. However, if enable is set to true, the policy will be applied even if ignoreChanges is true", + "type": "boolean", + "default": false + }, + "enable": { + "title": "Enable", + "description": "Apply the profile after updating it. If false (default), the system only updates the profile. Also note 'ignoreChanges'.", + "type": "boolean", + "default": false + } + }, + "required": [ + "class", + "url" + ], + "additionalProperties": false + }, + "Per_Request_Access_Policy": { + "title": "Per_Request_Access_Policy", + "description": "Configures a Per Flow Request Access Policy", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "apm" + ] + }, + "properties": { + "class": { + "type": "string", + "const": "Per_Request_Access_Policy" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "url": { + "title": "URL", + "description": "The URL to pull the policy from", + "allOf": [ + { + "$ref": "#/definitions/Resource_URL" + } + ] + }, + "ignoreChanges": { + "title": "Ignore changes", + "description": "If false (default), the system updates the profile in every BIG-IP AS3 declaration deployment. If true, BIG-IP AS3 creates the profile on first deployment, and leaves it untouched afterwards", + "type": "boolean", + "default": false + } + }, + "required": [ + "class", + "url" + ], + "additionalProperties": false + }, + "ICAP_Profile": { + "title": "ICAP_Profile", + "description": "Configures an ICAP profile", + "type": "object", + "properties": { + "class": { + "type": "string", + "const": "ICAP_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "uri": { + "description": "Specifies the absolute URI that contains both the complete hostname and the path of the resource to use in the ICAP header. Macro expansion is supported for all attribute values in the ICAP header (e.g. icap://${SERVER_IP}:${SERVER_PORT}/videoOptimization)", + "type": "string" + }, + "fromHeader": { + "description": "Specifies the 'From' attribute to use in the ICAP header", + "type": "string" + }, + "hostHeader": { + "description": "Specifies the 'Host' attribute to use in the ICAP header", + "type": "string" + }, + "refererHeader": { + "description": "Specifies the 'Referer' attribute to use in the ICAP header", + "type": "string" + }, + "userAgentHeader": { + "description": "Specifies the 'User-Agent' attribute to use in the ICAP header", + "type": "string" + }, + "previewLength": { + "description": "Specifies the length of the preview in the transaction", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 0 + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "Adapt_Profile": { + "title": "Adapt_Profile", + "description": "Configures a request or response Adapt profile or both", + "type": "object", + "properties": { + "class": { + "type": "string", + "const": "Adapt_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "messageType": { + "description": "The type of Adapt profile. Use both to create a request and response profile with the same property values", + "type": "string", + "enum": [ + "response", + "request", + "request-and-response" + ] + }, + "enableHttpAdaptation": { + "description": "Enable or disable the adaptation of HTTP requests/responses. They will be forwarded to the internal service", + "type": "boolean", + "default": true + }, + "internalService": { + "description": "Specifies the name of the internal service to use for adapting the request/response", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Service" + } + ] + }, + "previewSize": { + "description": "Specifies the maximum size of the preview buffer", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 1024 + }, + "serviceDownAction": { + "description": "Specifies the action to take if the internal service doesn't exist or is down", + "type": "string", + "enum": [ + "ignore", + "reset", + "drop" + ], + "default": "ignore" + }, + "timeout": { + "description": "Specifies how long in miliseconds to wait for the internal service before a timeout error will occur", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 0 + }, + "allowHTTP10": { + "description": "Specifies whether to forward HTTP 1.0 requests/responses", + "type": "boolean", + "default": false + } + }, + "required": [ + "class", + "messageType" + ] + }, + "Cipher_Rule": { + "title": "Cipher_Rule", + "description": "Configures a cipher rule", + "type": "object", + "properties": { + "class": { + "type": "string", + "const": "Cipher_Rule" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "cipherSuites": { + "description": "Specifies the cipher suites", + "type": "array", + "items": { + "type": "string" + } + }, + "namedGroups": { + "description": "Specifies the Elliptic Curve Diffie Hellman key agreement algorithms used to negotiate SSL/TLS connections. namedGroups are only supported on BIG-IP 14.0 and later.", + "type": "array", + "items": { + "type": "string", + "enum": [ + "DEFAULT", + "P256", + "P384", + "X25519" + ] + } + }, + "signatureAlgorithms": { + "description": "Specifies the digital signature algorithms used for authentication. signatureAlgorithms are only supported on BIG-IP 14.0 and later.", + "type": "array", + "items": { + "type": "string", + "enum": [ + "DEFAULT", + "DSA-SHA1", + "DSA-SHA256", + "DSA-SHA384", + "DSA-SHA512", + "ECDSA-SHA1", + "ECDSA-SHA256", + "ECDSA-SHA384", + "ECDSA-SHA512", + "RSA-PKCS1-SHA1", + "RSA-PKCS1-SHA256", + "RSA-PKCS1-SHA384", + "RSA-PKCS1-SHA512", + "RSA-PSS-SHA256", + "RSA-PSS-SHA384", + "RSA-PSS-SHA512" + ] + } + } + }, + "required": [ + "class" + ], + "anyOf": [ + { + "required": [ + "cipherSuites" + ] + }, + { + "required": [ + "namedGroups" + ] + }, + { + "required": [ + "signatureAlgorithms" + ] + } + ], + "additionalProperties": false + }, + "Cipher_Group": { + "title": "Cipher_Group", + "description": "Configures a Cipher Group", + "type": "object", + "properties": { + "class": { + "type": "string", + "const": "Cipher_Group" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "order": { + "description": "Configure the order of the specified Cipher Rules.", + "type": "string", + "enum": [ + "default", + "speed", + "strength", + "fips", + "hardware" + ], + "default": "default" + }, + "allowCipherRules": { + "description": "Allow the following Cipher Rules.", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Cipher_Rule" + }, + "default": [ + { + "bigip": "/Common/f5-default" + } + ] + }, + "excludeCipherRules": { + "description": "Exclude the following Cipher_Rules from the Allowed list.", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Cipher_Rule" + } + }, + "requireCipherRules": { + "description": "Restrict the Allowed list to the following Cipher_Rules.", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Cipher_Rule" + } + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "iFile": { + "title": "iFile", + "description": "An iFile", + "type": "object", + "properties": { + "class": { + "type": "string", + "const": "iFile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "iFile": { + "description": "Reference to an iFile", + "allOf": [ + { + "$ref": "#/definitions/F5string" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "string" + } + } + ] + } + }, + "additionalProperties": false, + "required": [ + "class", + "iFile" + ] + }, + "Firewall_Address_List": { + "title": "Firewall_Address_List", + "description": "Declares an address-list for use by firewall rules. An address list is a list of IP-address prefixes to compare against the source-IP address and/or destination-IP address in an IP packet", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm", + "asm" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Firewall_Address_List" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "addresses": { + "type": "array", + "description": "A list of IPv4 and IPv6 addresses and address ranges. You can specify a network with CIDR slash notation.", + "items": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "object", + "properties": { + "addressDiscovery": { + "title": "Address discovery", + "description": "Selects how server (node) addresses are discovered", + "type": "string", + "enum": [ + "event", + "aws", + "gce", + "azure", + "consul" + ], + "f5serviceDiscovery": true + }, + "updateInterval": { + "title": "Update interval", + "description": "Server-discovery update interval (seconds)", + "type": "integer", + "minimum": 1, + "maximum": 3600, + "default": 60 + } + }, + "required": [ + "addressDiscovery" + ], + "allOf": [ + { + "if": { + "properties": { + "addressDiscovery": { + "const": "aws" + } + } + }, + "then": { + "$ref": "#/definitions/Service_Discovery_AWS" + } + }, + { + "if": { + "properties": { + "addressDiscovery": { + "const": "azure" + } + } + }, + "then": { + "$ref": "#/definitions/Service_Discovery_Azure" + } + }, + { + "if": { + "properties": { + "addressDiscovery": { + "const": "gce" + } + } + }, + "then": { + "$ref": "#/definitions/Service_Discovery_GCE" + } + }, + { + "if": { + "properties": { + "addressDiscovery": { + "const": "consul" + } + } + }, + "then": { + "$ref": "#/definitions/Service_Discovery_Consul" + } + } + ] + } + ] + }, + "minItems": 1 + }, + "fqdns": { + "type": "array", + "description": "A list of fully qualified domain names.", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "geo": { + "type": "array", + "description": "A list of geographic locations (for example, US:Washington).", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "addressLists": { + "type": "array", + "description": "A list of other address lists (each by BIG-IP AS3 pointer or BIG-IP pathname).", + "items": { + "$ref": "#/definitions/Pointer_Firewall_Address_List" + }, + "minItems": 1 + } + }, + "additionalProperties": false, + "required": [ + "class" + ], + "anyOf": [ + { + "required": [ + "addresses" + ] + }, + { + "required": [ + "fqdns" + ] + }, + { + "required": [ + "geo" + ] + }, + { + "required": [ + "addressLists" + ] + } + ] + }, + "Firewall_Port_List": { + "title": "Firewall_Port_List", + "description": "Declares a port-list for use by firewall rules. A firewall rule can match a packet's source port or destination port against one of the ports in a port list, and can take some action (such as ACCEPT or DROP) for a matching packet.", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Firewall_Port_List" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "ports": { + "type": "array", + "description": "A list of ports and port ranges (for example, 80, \"8080-8090\").", + "items": { + "type": [ + "integer", + "string" + ] + }, + "minItems": 1 + }, + "portLists": { + "type": "array", + "description": "A list of other port lists (each by BIG-IP AS3 pointer or BIG-IP pathname).", + "items": { + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to firewall port list declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Firewall_Port_List" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP Firewall Port List", + "description": "Pathname of existing BIG-IP firewall port list", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security firewall port-list" + ] + } + }, + "minItems": 1 + } + }, + "additionalProperties": false, + "required": [ + "class" + ], + "anyOf": [ + { + "required": [ + "ports" + ] + }, + { + "required": [ + "portLists" + ] + } + ] + }, + "Firewall_Rule_List": { + "title": "Firewall_Rule_List", + "description": "Declares a list of network firewall rules. You can reuse a rule list in multiple firewalls, such as the firewalls for self IPs, routing domains, and the global firewall.", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Firewall_Rule_List" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "rules": { + "type": "array", + "description": "A list of network firewall rules.", + "items": { + "$ref": "#/definitions/Firewall_Rule" + } + } + }, + "additionalProperties": false, + "required": [ + "class" + ] + }, + "Firewall_Rule": { + "title": "Firewall Rule", + "description": "Declares a network firewall rule.", + "type": "object", + "properties": { + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "name": { + "type": "string", + "description": "The name of the firewall rule." + }, + "action": { + "type": "string", + "description": "Specifies the action that the firewall rule will take on matching packets.", + "enum": [ + "accept", + "drop", + "accept-decisively", + "reject" + ] + }, + "protocol": { + "type": "string", + "description": "Specifies the protocol to which the firewall rule applies", + "enum": [ + "3pc", + "a/n", + "ah", + "any", + "argus", + "aris", + "ax.25", + "bbn-rcc", + "bna", + "br-sat-mon", + "cbt", + "cftp", + "chaos", + "compaq-peer", + "cphb", + "cpnx", + "crdup", + "crtp", + "dccp", + "dcn", + "ddp", + "ddx", + "dgp", + "dsr", + "egp", + "eigrp", + "emcon", + "encap", + "esp", + "etherip", + "fc", + "fire", + "ggp", + "gmtp", + "gre", + "hip", + "hmp", + "hopopt", + "i-nlsp", + "iatp", + "icmp", + "idpr", + "idpr-cmtp", + "idrp", + "ifmp", + "igmp", + "igp", + "il", + "ip", + "ipcomp", + "ipcv", + "ipip", + "iplt", + "ippc", + "ipv4", + "ipv6", + "ipv6-auth", + "ipv6-crypt", + "ipv6-frag", + "ipv6-icmp", + "ipv6-nonxt", + "ipv6-opts", + "ipv6-route", + "ipx-in-ip", + "irtp", + "isis", + "iso-ip", + "iso-tp4", + "kryptolan", + "l2tp", + "larp", + "leaf-1", + "leaf-2", + "manet", + "merit-inp", + "mfe-nsp", + "micp", + "mobile", + "mobility-header", + "mpls-in-ip", + "mtp", + "mux", + "narp", + "netblt", + "nsfnet-igp", + "nvp", + "ospf", + "pgm", + "pim", + "pipe", + "pnni", + "prm", + "ptp", + "pup", + "pvp", + "qnx", + "rdp", + "rohc", + "rsvp", + "rsvp-e2e-ignore", + "rvd", + "sat-expak", + "sat-mon", + "scc-sp", + "scps", + "sctp", + "sdrp", + "secure-vmtp", + "shim6", + "skip", + "sm", + "smp", + "snp", + "sprite-rpc", + "sps", + "srp", + "sscopmce", + "st", + "stp", + "sun-nd", + "swipe", + "tcf", + "tcp", + "tlsp", + "tp++", + "trunk-1", + "trunk-2", + "ttp", + "udp", + "udplite", + "uti", + "vines", + "visa", + "vmtp", + "vrrp", + "wb-expak", + "wb-mon", + "wesp", + "wsn", + "xnet", + "xns-idp", + "xtp" + ], + "default": "any" + }, + "source": { + "$ref": "#/definitions/Firewall_Rule_Source" + }, + "destination": { + "$ref": "#/definitions/Firewall_Rule_Destination" + }, + "loggingEnabled": { + "type": "boolean", + "description": "Specifies whether the system enables or disables logging for the firewall rule.", + "default": false + }, + "iRule": { + "type": "object", + "description": "Specifies the name of the iRule (by BIG-IP AS3 pointer or BIG-IP pathname) that the system will trigger when a packet matches the firewall rule.", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to iRule declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "iRule" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP iRule", + "description": "Pathname of existing BIG-IP iRule", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm rule" + ] + } + }, + "iRuleSampleRate": { + "type": "integer", + "description": "Specifies the rate at which the system will trigger the specified iRule when a packet matches this firewall rule. The default value is 1 and causes the system to trigger the iRule for every packet that matches. A value of 0 disables iRule triggering." + } + }, + "additionalProperties": false, + "dependencies": { + "iRuleSampleRate": [ + "iRule" + ] + }, + "required": [ + "name", + "action" + ] + }, + "Firewall_Rule_Source": { + "title": "Firewall Rule Source", + "description": "Declares the packet sources to which the network firewall rule applies.", + "type": "object", + "properties": { + "addressLists": { + "type": "array", + "description": "A list of address lists (each by BIG-IP AS3 pointer or BIG-IP pathname).", + "items": { + "$ref": "#/definitions/Pointer_Firewall_Address_List" + } + }, + "portLists": { + "type": "array", + "description": "A list of port lists (each by BIG-IP AS3 pointer or BIG-IP pathname).", + "items": { + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to firewall port list declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Firewall_Port_List" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP Firewall Port List", + "description": "Pathname of existing BIG-IP firewall port list", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security firewall port-list" + ] + } + } + }, + "vlans": { + "type": "array", + "description": "A list of VLANs by BIG-IP pathname", + "items": { + "bigip": { + "title": "BIG-IP VLAN", + "description": "Pathname of existing BIG-IP VLAN", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query net vlan" + ] + } + } + }, + "additionalProperties": false + }, + "Firewall_Rule_Destination": { + "title": "Firewall Rule Destination", + "description": "Declares the packet destinations to which the network firewall rule applies.", + "type": "object", + "properties": { + "addressLists": { + "type": "array", + "description": "A list of address lists (each by BIG-IP AS3 pointer or BIG-IP pathname).", + "items": { + "$ref": "#/definitions/Pointer_Firewall_Address_List" + } + }, + "portLists": { + "type": "array", + "description": "A list of port lists (each by BIG-IP AS3 pointer or BIG-IP pathname).", + "items": { + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to firewall port list declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Firewall_Port_List" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP Firewall Port List", + "description": "Pathname of existing BIG-IP firewall port list", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security firewall port-list" + ] + } + } + } + }, + "additionalProperties": false + }, + "Firewall_Policy": { + "title": "Firewall_Policy", + "description": "Configures firewall policy", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Firewall_Policy" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "rules": { + "description": "A list of firewall policy rules", + "type": "array", + "items": { + "if": { + "oneOf": [ + { + "required": [ + "use" + ] + }, + { + "required": [ + "bigip" + ] + } + ] + }, + "then": { + "$ref": "#/definitions/Pointer_Firewall_Rule_List" + }, + "else": { + "$ref": "#/definitions/Firewall_Rule" + } + } + } + }, + "additionalProperties": false, + "required": [ + "class", + "rules" + ] + }, + "NAT_Policy": { + "title": "NAT_Policy", + "description": "Configures network address translation policy", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "NAT_Policy" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "rules": { + "description": "A list of NAT rules", + "type": "array", + "items": { + "$ref": "#/definitions/NAT_Rule" + } + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "NAT_Rule": { + "description": "Network address translation rule", + "type": "object", + "properties": { + "name": { + "description": "NAT rule name", + "type": "string" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "source": { + "$ref": "#/definitions/NAT_Rule_Source" + }, + "destination": { + "$ref": "#/definitions/NAT_Rule_Destination" + }, + "protocol": { + "description": "Specifies the IP protocol against which the packet will be compared", + "type": "string", + "enum": [ + "any", + "tcp", + "udp" + ], + "default": "any" + }, + "sourceTranslation": { + "allOf": [ + { + "$ref": "#/definitions/Pointer_NAT_Source_Translation" + } + ] + }, + "securityLogProfile": { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Security_Log_Profile" + } + ] + } + }, + "required": [ + "name" + ], + "additionalProperties": false + }, + "NAT_Rule_Destination": { + "description": "Network address translation destination configuration", + "type": "object", + "properties": { + "addressLists": { + "description": "A list of address lists (each by BIG-IP AS3 pointer or BIG-IP pathname)", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Firewall_Address_List" + } + }, + "portLists": { + "description": "A list of port lists (each by BIG-IP AS3 pointer or BIG-IP pathname)", + "type": "array", + "items": { + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to firewall port list declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Firewall_Port_List" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP Firewall Port List", + "description": "Pathname of existing BIG-IP firewall port list", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security firewall port-list" + ] + } + } + } + }, + "required": [], + "additionalProperties": false + }, + "NAT_Rule_Source": { + "description": "Network address translation source configuration", + "type": "object", + "properties": { + "addressLists": { + "description": "A list of address lists (each by BIG-IP AS3 pointer or BIG-IP pathname)", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Firewall_Address_List" + } + }, + "portLists": { + "description": "A list of port lists (each by BIG-IP AS3 pointer or BIG-IP pathname)", + "type": "array", + "items": { + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to firewall port list declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Firewall_Port_List" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP Firewall Port List", + "description": "Pathname of existing BIG-IP firewall port list", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security firewall port-list" + ] + } + } + } + }, + "required": [], + "additionalProperties": false + }, + "NAT_Source_Translation": { + "title": "NAT_Source_Translation", + "description": "Configures a Security network address translation source translation object", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "NAT_Source_Translation" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "addresses": { + "description": "Specifies addresses on which source translation is performed", + "type": "array", + "items": { + "type": "string" + } + }, + "allowEgressInterfaces": { + "description": "Specifies the egress interfaces (tunnels and VLANs) on which source translation is allowed", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Tunnel" + } + }, + "clientConnectionLimit": { + "description": "Maximum number of simultaneous translated connections a client or subscriber is allowed to have", + "type": "integer", + "minimum": 0, + "maximum": 2147483647 + }, + "disallowEgressInterfaces": { + "description": "Specifies the egress interfaces (tunnels and VLANs) on which source translation is not allowed", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Tunnel" + } + }, + "hairpinModeEnabled": { + "type": "boolean", + "description": "Enables or disables hairpinning for incoming connections to active translation end-points" + }, + "inboundMode": { + "description": "Specifies the persistence settings for NAT translation entries", + "type": "string", + "enum": [ + "endpoint-independent-filtering", + "explicit", + "none" + ] + }, + "mapping": { + "$ref": "#/definitions/NAT_Source_Translation_Mapping" + }, + "patMode": { + "description": "Specifies whether the translation address mapping is performed in Network Address Port Translation mode, Deterministic mode, or in Port Block Allocation mode", + "type": "string", + "enum": [ + "napt", + "deterministic", + "pba" + ] + }, + "portBlockAllocation": { + "$ref": "#/definitions/NAT_Source_Translation_PortBlockAllocation" + }, + "ports": { + "description": "Specifies source ports and port ranges on which source translation is performed", + "type": "array", + "items": { + "type": [ + "integer", + "string" + ], + "minimum": 0, + "maximum": 65535 + } + }, + "routeAdvertisement": { + "type": "boolean", + "description": "Specifies that the traffic is advertised to dynamic routing protocols configured in the route domain", + "default": false + }, + "type": { + "description": "Specifies the type of source translation item", + "type": "string", + "enum": [ + "dynamic-pat", + "static-nat", + "static-pat" + ] + }, + "excludeAddresses": { + "description": "Specifies the set of addresses excluded from translation IP addresses available in the pool. This property is available on BIGIP 14.1 and above.", + "type": "array", + "items": { + "oneOf": [ + { + "type": "string" + }, + { + "$ref": "#/definitions/Pointer_Firewall_Address_List" + } + ] + } + } + }, + "dependencies": { + "clientConnectionLimit": { + "properties": { + "type": { + "const": "dynamic-pat" + } + } + }, + "hairpinModeEnabled": { + "properties": { + "type": { + "const": "dynamic-pat" + } + } + }, + "inboundMode": { + "properties": { + "type": { + "const": "dynamic-pat" + } + } + }, + "mapping": { + "properties": { + "type": { + "const": "dynamic-pat" + } + } + }, + "patMode": { + "properties": { + "type": { + "const": "dynamic-pat" + } + } + }, + "portBlockAllocation": { + "properties": { + "type": { + "const": "dynamic-pat" + }, + "patMode": { + "const": "pba" + } + } + }, + "ports": { + "properties": { + "type": { + "enum": [ + "static-pat", + "dynamic-pat" + ] + } + } + } + }, + "if": { + "properties": { + "allowEgressInterfaces": {} + }, + "required": [ + "allowEgressInterfaces" + ] + }, + "then": { + "not": { + "properties": { + "disallowEgressInterfaces": {} + }, + "required": [ + "disallowEgressInterfaces" + ] + } + }, + "required": [ + "type" + ], + "additionalProperties": false + }, + "NAT_Source_Translation_Mapping": { + "description": "Configure the mapping settings for translation entries. It is the preservation of a public-side IP address for a client from session to session. Only available if type is dynamic-pat.", + "type": "object", + "properties": { + "mode": { + "description": "Specifies the mapping mode for translation entries", + "type": "string", + "enum": [ + "address-pooling-paired", + "endpoint-independent-mapping", + "none" + ], + "default": "address-pooling-paired" + }, + "timeout": { + "description": "Specifies the timeout (in seconds) for address and port mapping", + "type": "integer", + "minimum": 0, + "maximum": 2147483647, + "default": 300 + } + }, + "required": [], + "additionalProperties": false + }, + "NAT_Source_Translation_PortBlockAllocation": { + "description": "Configure the port block allocation", + "type": "object", + "properties": { + "blockIdleTimeout": { + "description": "Specifies the amount of time in seconds that an assigned block of ports remains available when idle before it times out", + "type": "integer", + "minimum": 0, + "maximum": 2147483647, + "default": 3600 + }, + "blockLifetime": { + "description": "Specifies the lifetime in seconds of a block of ports", + "type": "integer", + "minimum": 0, + "maximum": 2147483647, + "default": 0 + }, + "blockSize": { + "description": "Specifies the number of ports per block. Each block is assigned to one client. A client can use all ports in a block multiplied by the number of blocks, up to the connection limit, if one is set", + "type": "integer", + "minimum": 0, + "maximum": 2147483647, + "default": 64 + }, + "clientBlockLimit": { + "description": "Specifies the number of blocks that can be assigned to a client", + "type": "integer", + "minimum": 0, + "maximum": 2147483647, + "default": 1 + }, + "zombieTimeout": { + "description": "Specifies the timeout duration for a zombie port block, which is a timed out port block with one or more active connections", + "type": "integer", + "minimum": 0, + "maximum": 2147483647, + "default": 0 + } + }, + "required": [], + "additionalProperties": false + }, + "Protocol_Inspection_Profile": { + "title": "Protocol_Inspection_Profile", + "description": "Protocol Inspection Profile used for configurable BIG-IP AFM intrusion prevention", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Protocol_Inspection_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "collectAVRStats": { + "description": "If true, AVR will collect data from the intrusion prevention profile", + "type": "boolean", + "default": true + }, + "enableComplianceChecks": { + "description": "Specifies whether the compliance checks will be enabled for this profile", + "type": "boolean", + "default": true + }, + "enableSignatureChecks": { + "description": "Specifies whether the signature checks will be enabled for this profile", + "type": "boolean", + "default": true + }, + "autoAddNewInspections": { + "description": "Specifies whether new inspections delivered via IPS IM package will be automatically added to this profile", + "type": "boolean", + "default": false + }, + "autoPublish": { + "description": "Specifies whether the inspections will be automatically updated to the suggested action after the staging period", + "type": "boolean", + "default": false + }, + "defaultFromProfile": { + "description": "Specifies the parent profile. If specified, the new profile will be cloned from the parent", + "type": "string" + }, + "services": { + "description": "Specifies the services and service checks for this profile", + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "description": "The name of the service type", + "type": "string", + "enum": [ + "boxp", + "coap", + "dhcp", + "diameter", + "dns", + "ftp", + "gtp", + "http", + "imap", + "ipsec", + "irc", + "mqtt", + "mysql", + "netbios_ns", + "netbios_ssn", + "nntp", + "oracle", + "other", + "pfcp", + "pop3", + "radius", + "rdp", + "rmi", + "rsh", + "sip", + "smtp", + "snmp", + "ssh", + "ssl", + "sunrpc", + "telnet", + "tftp", + "thrift", + "wins" + ] + }, + "compliance": { + "description": "A list of compliance checks to attach to the Protocol Inspection Profile", + "type": "array", + "items": { + "$ref": "#/definitions/Protocol_Inspection_Profile_Service_Compliance_Check" + } + }, + "signature": { + "description": "A list of signature checks to attach to the Protocol Inspection Profile", + "type": "array", + "items": { + "$ref": "#/definitions/Protocol_Inspection_Profile_Service_Signature_Check" + } + }, + "ports": { + "description": "List of ports to attach to the service.", + "type": "array", + "items": { + "type": "integer", + "minimum": 0, + "maximum": 65535 + } + } + }, + "allOf": [ + { + "if": { + "properties": { + "type": { + "const": "dhcp" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 67, + 68 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "dns" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 53 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "gtp" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 2123, + 2152, + 3386 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "imap" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 143, + 993 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "mqtt" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 1883 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "netbios_ns" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 137 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "nntp" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 119 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "pop3" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 110 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "sip" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 5060, + 5061 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "snmp" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 161, + 162 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "ssl" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 443 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "telnet" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 23 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "wins" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 42 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "diameter" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 3868 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "ftp" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 20, + 21 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "http" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 80, + 8080 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "irc" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 6663, + 6667, + 6668, + 7000 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "mysql" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 3306 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "netbios_ssn" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 139, + 445 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "radius" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 1645, + 1646, + 1812, + 1813 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "smtp" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 25 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "ssh" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 22 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "sunrpc" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 111 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "tftp" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 69 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "coap" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 5683 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "oracle" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 1521 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "pfcp" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 8805 + ] + } + } + } + } + ], + "required": [ + "type" + ], + "additionalProperties": false + } + } + }, + "additionalProperties": false + }, + "Protocol_Inspection_Profile_Service_Compliance_Check": { + "title": "Protocol Inspection Profile Service Compliance Check", + "description": "Defines a compliance check to attach to the Protocol Inspection Profile", + "type": "object", + "properties": { + "check": { + "type": "string", + "description": "The name of the check" + }, + "action": { + "type": "string", + "enum": [ + "accept", + "drop", + "reject" + ], + "description": "Which action to perform on traffic matching the check", + "default": "accept" + }, + "log": { + "type": "boolean", + "description": "Specifies whether to log the check", + "default": true + }, + "value": { + "type": "string", + "description": "Value to use for the check. If a check accepts enumerable values, these should be delimited by spaces." + } + }, + "required": [ + "check" + ], + "additionalProperties": false + }, + "Protocol_Inspection_Profile_Service_Signature_Check": { + "type": "object", + "title": "Protocol Inspection Profile Service Signature Check", + "description": "Defines a signature check to attach to the Protocol Inspection Profile", + "properties": { + "check": { + "type": "string", + "description": "The name of the check" + }, + "action": { + "type": "string", + "enum": [ + "accept", + "drop", + "reject" + ], + "description": "Which action to perform on traffic matching the check", + "default": "accept" + }, + "log": { + "type": "boolean", + "description": "Specifies whether to log the check", + "default": true + } + }, + "required": [ + "check" + ], + "additionalProperties": false + }, + "SSH_Proxy_Profile": { + "title": "SSH_Proxy_Profile", + "description": "SSH Profile used for SSH security", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "SSH_Proxy_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "sshProfileAuthInfo": { + "description": "Specifies the authentication info of public and private keys for this profile", + "type": "array", + "items": { + "$ref": "#/definitions/SSH_Proxy_Profile_Auth_Info_Collection" + } + }, + "sshProfileDefaultActions": { + "description": "Specifies the default action values", + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Default_Action_Collection" + } + ], + "default": {} + }, + "sshProfileRuleSet": { + "description": "The profile's collection of rules, each rule holds a set of actions", + "type": "array", + "items": { + "$ref": "#/definitions/SSH_Proxy_Profile_Rule_Collection" + } + }, + "timeout": { + "description": "User defined timeout value", + "type": "integer", + "default": 0 + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "SSH_Proxy_Profile_Auth_Info_Collection": { + "description": "A collection of authentication info of public and private keys", + "type": "object", + "properties": { + "name": { + "description": "The name of this set of Authorized Info", + "type": "string" + }, + "proxyServerAuth": { + "$ref": "#/definitions/SSH_Proxy_Profile_Proxy_Auth_Info" + }, + "proxyClientAuth": { + "$ref": "#/definitions/SSH_Proxy_Profile_Proxy_Auth_Info" + }, + "realServerAuth": { + "$ref": "#/definitions/SSH_Proxy_Profile_Real_Server_Auth_Info" + } + }, + "additionalProperties": false + }, + "SSH_Proxy_Profile_Proxy_Auth_Info": { + "description": "The keys used to authenticate ssh connections between the big-ip and external sources", + "type": "object", + "properties": { + "privateKey": { + "description": "The private key of the authentication algorithm (rsa, dss, etc...)", + "type": "object", + "properties": { + "allowReuse": { + "description": "If true, other declaration objects may reuse this value", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Secret" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "object" + } + }, + { + "f5PostProcess": { + "tag": "secret" + } + } + ] + }, + "publicKey": { + "description": "The public key of the authentication algorithm (rsa, dss, etc...)", + "type": "string" + } + }, + "additionalProperties": false + }, + "SSH_Proxy_Profile_Real_Server_Auth_Info": { + "description": "Public key that can be used to authenticate real host server to the proxy", + "type": "object", + "properties": { + "publicKey": { + "description": "The public key of the authentication algorithm (rsa, dss, etc...)", + "type": "string" + } + }, + "additionalProperties": false + }, + "SSH_Proxy_Profile_Default_Action_Collection": { + "description": "A collection of actions for the SSH Profile", + "type": "object", + "properties": { + "name": { + "description": "The name of this set of actions", + "type": "string" + }, + "agentAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Default_Action" + } + ], + "default": {} + }, + "localForwardAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Default_Action" + } + ], + "default": {} + }, + "otherAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Default_Action" + } + ], + "default": {} + }, + "remoteForwardAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Default_Action" + } + ], + "default": {} + }, + "rexecAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Default_Action" + } + ], + "default": {} + }, + "scpUpAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Default_Action" + } + ], + "default": {} + }, + "scpDownAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Default_Action" + } + ], + "default": {} + }, + "sftpUpAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Default_Action" + } + ], + "default": {} + }, + "sftpDownAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Default_Action" + } + ], + "default": {} + }, + "shellAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Default_Action" + } + ], + "default": {} + }, + "subSystemAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Default_Action" + } + ], + "default": {} + }, + "x11ForwardAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Default_Action" + } + ], + "default": {} + } + }, + "additionalProperties": false + }, + "SSH_Proxy_Profile_Default_Action": { + "description": "The action an SSH Profile will take. The default value is 'allow'.", + "type": "object", + "properties": { + "control": { + "description": "Indicates the specific action to take", + "type": "string", + "enum": [ + "allow", + "disallow", + "terminate", + "unspecified" + ], + "default": "allow" + }, + "log": { + "description": "Indicates if a log will be created when the action is taken. The default value is false.", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + }, + "SSH_Proxy_Profile_Rule_Collection": { + "description": "User defined rule", + "type": "object", + "properties": { + "name": { + "description": "The name of this set of rules", + "type": "string" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "sshProfileIdUsers": { + "description": "Specifies the rule users identity", + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "sshProfileIdGroups": { + "description": "Specifies the rule groups identity", + "type": "array", + "items": { + "type": "string" + } + }, + "sshProfileRuleActions": { + "description": "The sets of actions in the rule", + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Rule_Action_Collection" + } + ], + "default": {} + } + }, + "anyOf": [ + { + "required": [ + "sshProfileIdUsers" + ] + }, + { + "required": [ + "sshProfileIdGroups" + ] + } + ], + "required": [ + "name" + ], + "additionalProperties": false + }, + "SSH_Proxy_Profile_Rule_Action_Collection": { + "description": "A collection of actions for the SSH Profile", + "type": "object", + "properties": { + "name": { + "description": "The name of this set of actions", + "type": "string" + }, + "agentAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Rule_Action" + } + ], + "default": {} + }, + "localForwardAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Rule_Action" + } + ], + "default": {} + }, + "otherAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Rule_Action" + } + ], + "default": {} + }, + "remoteForwardAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Rule_Action" + } + ], + "default": {} + }, + "rexecAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Rule_Action" + } + ], + "default": {} + }, + "scpUpAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Rule_Action" + } + ], + "default": {} + }, + "scpDownAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Rule_Action" + } + ], + "default": {} + }, + "sftpUpAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Rule_Action" + } + ], + "default": {} + }, + "sftpDownAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Rule_Action" + } + ], + "default": {} + }, + "shellAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Rule_Action" + } + ], + "default": {} + }, + "subSystemAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Rule_Action" + } + ], + "default": {} + }, + "x11ForwardAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Rule_Action" + } + ], + "default": {} + } + }, + "additionalProperties": false + }, + "SSH_Proxy_Profile_Rule_Action": { + "description": "The action an SSH Profile Rule will take. The default value is 'unspecified'.", + "type": "object", + "properties": { + "control": { + "description": "Indicates the specific action to take", + "type": "string", + "enum": [ + "allow", + "disallow", + "terminate", + "unspecified" + ], + "default": "unspecified" + }, + "log": { + "description": "Indicates if a log will be created when the action is taken. The default value is false.", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + }, + "Data_Group": { + "title": "Data_Group", + "description": "Configures a data group object which contains list of data", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Data_Group" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "storageType": { + "title": "Storage Type", + "description": "Toggles whether the data group is internal or external", + "type": "string", + "enum": [ + "internal", + "external" + ], + "default": "internal" + }, + "keyDataType": { + "title": "Data Type", + "description": "Specifies the type of record keys the data group contains. If string, the value will be escaped by default", + "type": "string", + "enum": [ + "integer", + "ip", + "string" + ] + } + }, + "if": { + "properties": { + "storageType": { + "const": "internal" + } + } + }, + "then": { + "allOf": [ + { + "if": { + "properties": { + "keyDataType": { + "const": "string" + } + } + }, + "then": { + "$ref": "#/definitions/Data_Group_Records_String" + } + }, + { + "if": { + "properties": { + "keyDataType": { + "const": "integer" + } + } + }, + "then": { + "$ref": "#/definitions/Data_Group_Records_Integer" + } + }, + { + "if": { + "properties": { + "keyDataType": { + "const": "ip" + } + } + }, + "then": { + "$ref": "#/definitions/Data_Group_Records_IP" + } + } + ], + "required": [ + "class", + "keyDataType", + "records" + ] + }, + "else": { + "properties": { + "externalFilePath": { + "title": "External File Path", + "description": "Specifies the location (URI) from where the records will be copied", + "allOf": [ + { + "$ref": "#/definitions/Resource_URL" + }, + { + "f5PostProcess": { + "tag": "checkResource" + } + } + ] + }, + "separator": { + "title": "Record Key Value Separator", + "description": "Specifies the character(s) that separate the record key and value", + "type": "string", + "default": ":=" + }, + "ignoreChanges": { + "title": "Ignore changes", + "description": "If false (default), the system updates data group in every BIG-IP AS3 declaration deployment. If true, BIG-IP AS3 creates the data group on first deployment, and leaves it untouched afterwards", + "type": "boolean", + "default": false + }, + "dataGroupFile": { + "$ref": "#/definitions/Pointer_Data_Group_File" + } + }, + "oneOf": [ + { + "required": [ + "class", + "keyDataType", + "externalFilePath" + ] + }, + { + "required": [ + "class", + "keyDataType", + "dataGroupFile" + ] + } + ], + "not": { + "required": [ + "externalFilePath", + "dataGroupFile" + ] + } + } + }, + "Data_Group_Records_Base": { + "title": "Data Group - Records", + "description": "Configures data group records to store", + "type": "object", + "properties": { + "records": { + "title": "Records", + "description": "List of records", + "type": "array", + "items": { + "type": "object", + "description": "A record object to store", + "properties": { + "value": { + "title": "Record value", + "description": "Value to store", + "type": "string" + } + } + } + } + } + }, + "Data_Group_Records_String": { + "description": "A specialization of Data_Group_Records_Base where all items in the records property must be strings.", + "allOf": [ + { + "$ref": "#/definitions/Data_Group_Records_Base" + }, + { + "properties": { + "records": { + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "title": "Record Key", + "description": "Record Identifier", + "type": "string" + } + }, + "required": [ + "key" + ] + } + } + } + } + ] + }, + "Data_Group_Records_Integer": { + "description": "A specialization of Data_Group_Records_Base where all items in the records property must be integers.", + "allOf": [ + { + "$ref": "#/definitions/Data_Group_Records_Base" + }, + { + "properties": { + "records": { + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "title": "Record Key", + "description": "Record Identifier", + "type": "integer" + } + }, + "required": [ + "key" + ] + } + } + } + } + ] + }, + "Data_Group_Records_IP": { + "description": "A specialization of Data_Group_Records_Base where all items in the records property must be IP addresses.", + "allOf": [ + { + "$ref": "#/definitions/Data_Group_Records_Base" + }, + { + "properties": { + "records": { + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "title": "Record Key", + "description": "Record Identifier - string can be ip address or ip address with netmask (if not provided, default is /32)", + "type": "string", + "format": "f5ip" + } + }, + "required": [ + "key" + ] + } + } + } + } + ] + }, + "DNS_Cache": { + "title": "DNS_Cache", + "description": "Configures a DNS cache", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "DNS_Cache" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "type": { + "description": "Type of DNS cache", + "type": "string", + "enum": [ + "transparent", + "resolver", + "validating-resolver" + ] + } + }, + "allOf": [ + { + "if": { + "properties": { + "type": { + "const": "transparent" + } + } + }, + "then": { + "$ref": "#/definitions/DNS_Cache_Transparent" + } + }, + { + "if": { + "properties": { + "type": { + "const": "resolver" + } + } + }, + "then": { + "$ref": "#/definitions/DNS_Cache_Resolver" + } + }, + { + "if": { + "properties": { + "type": { + "const": "validating-resolver" + } + } + }, + "then": { + "$ref": "#/definitions/DNS_Cache_Validating_Resolver" + } + } + ], + "required": [ + "class", + "type" + ] + }, + "DNS_Cache_Transparent": { + "description": "Properties for a DNS transparent cache", + "type": "object", + "properties": { + "answerDefaultZones": { + "description": "Specifies whether the system answers DNS queries for the default zones localhost, reverse 127.0.0.1 and ::1, and AS112", + "type": "boolean", + "default": false + }, + "localZones": { + "description": "Configures resource records that a DNS cache uses to resolve matching DNS queries with authoritative DNS responses", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/DNS_Zone_Local" + } + }, + "messageCacheSize": { + "description": "Specifies the maximum size of the message cache in bytes", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 1048576 + }, + "recordCacheSize": { + "description": "Specifies the maximum size of the resource record (RR) cache in bytes", + "type": "integer", + "minimum": 1, + "maximum": 4294967295, + "default": 10485760 + }, + "recordRotationMethod": { + "description": "Specifies the resource record rotation method used within cached responses", + "type": "string", + "enum": [ + "none", + "query-id" + ], + "default": "none" + } + } + }, + "DNS_Profile": { + "title": "DNS_Profile", + "description": "Configures a Domain Name System (DNS) profile", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "DNS_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "parentProfile": { + "description": "Specifies the name of the object to inherit the settings from", + "allOf": [ + { + "$ref": "#/definitions/Pointer_DNS_Profile" + } + ], + "default": { + "bigip": "/Common/dns" + } + }, + "rapidResponseEnabled": { + "description": "When enabled, if the query name matches a GTM wide IP name and GTM is enabled on this profile, the DNS query will bypass Rapid Response. Note: This setting is supported only on physical BIG-IP hardware because it needs a High-Speed Bridge (HSB) to work. When using BIG-IP Virtual Edition, however, the system does not prevent you from selecting an action, even though the setting is ignored.", + "type": "boolean", + "default": false + }, + "rapidResponseLastAction": { + "description": "Specifies what action the system takes when Rapid Response Mode is enabled and the incoming DNS query does not match a DNS Express Zone", + "type": "string", + "enum": [ + "allow", + "drop", + "noerror", + "nxdomain", + "refuse", + "truncate" + ], + "default": "drop" + }, + "hardwareQueryValidationEnabled": { + "description": "On supported platforms, indicates whether the hardware will accelerate query validation", + "type": "boolean", + "default": false + }, + "hardwareResponseCacheEnabled": { + "description": "On supported platforms, indicates whether the hardware will cache responses", + "type": "boolean", + "default": false + }, + "dnssecEnabled": { + "description": "Specifies whether the system signs responses with DNSSEC keys and replies to DNSSEC specific queries (e.g., DNSKEY query type)", + "type": "boolean", + "default": true + }, + "globalServerLoadBalancingEnabled": { + "description": "Specifies whether the system uses Global Traffic Manager to manage the response", + "type": "boolean", + "default": true + }, + "dnsExpressEnabled": { + "description": "Specifies whether the DNS Express engine is enabled. The DNS Express engine receives zone transfers from the authoritative DNS server for the zone. If the Zone Transfer setting is also enabled on this profile, the DNS Express engine also responds to zone transfer requests made by the nameservers configured as zone transfer clients for the DNS Express zone. ", + "type": "boolean", + "default": true + }, + "cacheEnabled": { + "description": "Specifies whether the system caches DNS responses", + "type": "boolean", + "default": false + }, + "cache": { + "$ref": "#/definitions/Pointer_DNS_Cache" + }, + "dns64Mode": { + "description": "Specifies handling of AAAA and A DNS queries and responses", + "type": "string", + "enum": [ + "disabled", + "secondary", + "immediate", + "v4-only" + ], + "default": "disabled" + }, + "dns64Prefix": { + "description": "Specifies the prefix to use for the IPv6-formatted IP addresses that the system converts to IPv4-formatted IP addresses", + "type": "string", + "default": "0:0:0:0:0:0:0:0" + }, + "dns64AdditionalSectionRewrite": { + "description": "Select an option to allow improved network efficiency for both Unicast and Multicast DNS-SD responses", + "type": "string", + "enum": [ + "disabled", + "v6-only", + "v4-only", + "any" + ], + "default": "disabled" + }, + "unhandledQueryAction": { + "description": "Specifies whether the system uses the local BIND server on the BIG-IP system", + "type": "string", + "enum": [ + "allow", + "drop", + "hint", + "noerror", + "reject" + ], + "default": "allow" + }, + "localBindServerEnabled": { + "description": "Specifies whether the system forwards non-wide IP queries to the local BIND server on the BIG-IP system. For best performance, disable this setting when using a DNS cache.", + "type": "boolean", + "default": true + }, + "zoneTransferEnabled": { + "description": "Specifies whether the system answers zone transfer requests for a DNS zone created on the system. The DNS Express and Zone Transfer settings on a DNS profile affect how the system responds to zone transfer requests. ", + "type": "boolean", + "default": false + }, + "recursionDesiredEnabled": { + "description": "Specifies whether to process client-side DNS packets with Recursion Desired set in the header. If set to Disabled, processing of the packet is subject to the unhandled-query-action option.", + "type": "boolean", + "default": true + }, + "securityEnabled": { + "description": "Specifies whether DNS firewall capability is enabled.", + "type": "boolean", + "default": true + }, + "securityProfile": { + "$ref": "#/definitions/Pointer_DNS_Security_Profile" + }, + "loggingEnabled": { + "description": "Specifies whether to process client-side DNS packets with Recursion Desired set in the header. If set to Disabled, processing of the packet is subject to the unhandled-query-action option.", + "type": "boolean", + "default": true + }, + "loggingProfile": { + "$ref": "#/definitions/Pointer_DNS_Logging_Profile" + }, + "statisticsSampleRate": { + "description": "Sets AVR DNS statistics sampling rate. A value of 0 (zero) means that no query will be sent to the analytics database. A value of 1 means that every query will be sent. A value of n means that every nth query will be sent, and that the analytics database will count that query n times. When sampling rate is greater than one, the statistics will be inaccurate if the traffic volume is low. However, when the traffic volume is high, the system performance will benefit from sampling and the inaccuracy will be negligible. DNS statistics contain query name, query type, virtual server IP and client IP. ", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 0 + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "DNS_TSIG_Key": { + "title": "DNS_TSIG_Key", + "description": "Configures a TSIG key", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "DNS_TSIG_Key" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "algorithm": { + "description": "Specifies the algorithm the system uses to authenticate AXFR zone transfer requests as coming from an approved DNS nameserver, or to authenticate AXFR zone transfers as coming from an approved back-end DNS authoritative server. The algorithm involves a cryptographic hash function in combination with a secret, which is specified in the Secret field. The default is HMAC MD5 (the Hash-based Message Authentication Code MD5).", + "type": "string", + "enum": [ + "hmacmd5", + "hmacsha1", + "hmacsha256" + ], + "default": "hmacmd5" + }, + "secret": { + "description": "Specifies the secret used with the algorithm in the verification process. The secret must be generated by a third-party tool such as BIND's keygen utility; the BIG-IP system does not generate the TSIG key secret.", + "type": "object", + "properties": { + "allowReuse": { + "description": "If true, other declaration objects may reuse this value", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Secret" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "object" + } + }, + { + "f5PostProcess": { + "tag": "secret" + } + } + ] + } + }, + "required": [ + "class", + "secret" + ], + "additionalProperties": false + }, + "DNS_Zone": { + "title": "DNS_Zone", + "description": "Configures a DNS zone", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "DNS_Zone" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "dnsExpress": { + "$ref": "#/definitions/DNS_Zone_DNS_Express" + }, + "responsePolicyEnabled": { + "description": "Specifies if this is a response policy zone. If this is set to yes, this zone may be assigned as an RPZ to a DNS Cache", + "type": "boolean", + "default": false + }, + "serverTsigKey": { + "$ref": "#/definitions/Pointer_DNS_TSIG_Key" + }, + "transferClients": { + "description": "Specifies the DNS nameservers to which the system sends NOTIFY messages. The system allows only the DNS nameservers in the Active column to initiate AXFR zone transfers for this DNS zone.", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_DNS_Nameserver" + } + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "DNS_Zone_DNS_Express": { + "description": "Configure zone DNS Express settings", + "type": "object", + "properties": { + "enabled": { + "description": "Specifies whether DNS Express is enabled to process queries for this zone", + "type": "boolean", + "default": true + }, + "nameserver": { + "description": "Specifies the back-end authoritative DNS server from which the BIG-IP system receives AXFR zone transfers for the DNS Express zone. The options are None and user-defined nameservers.", + "allOf": [ + { + "$ref": "#/definitions/Pointer_DNS_Nameserver" + } + ] + }, + "notifyAction": { + "description": "Specifies the action the system takes when a NOTIFY message is received for this DNS Express zone. NOTIFY responses are assumed to be sent by the authoritative nameserver for the zone, except when the action is Consume, and then DNS Express generates the response. Note: If a TSIG key is configured for the zone, the signature is only validated for Consume and Repeat actions.", + "type": "string", + "enum": [ + "consume", + "bypass", + "repeat" + ], + "default": "consume" + }, + "allowNotifyFrom": { + "description": "Specifies the IP addresses from which the system accepts NOTIFY messages for this DNS Express zone", + "type": "array", + "items": { + "type": "string", + "format": "f5ip" + } + }, + "verifyNotifyTsig": { + "description": "Specifies whether the system verifies the identity of the authoritative nameserver that sends updated information for this DNS Express zone", + "type": "boolean", + "default": true + } + }, + "required": [ + "nameserver" + ], + "additionalProperties": false + }, + "DNS_Zone_Local": { + "description": "Configures resource records that a DNS cache uses to resolve matching DNS queries with authoritative DNS responses", + "type": "object", + "properties": { + "type": { + "description": "Describes how the cache handles a non-matching query for the local zone", + "type": "string", + "enum": [ + "deny", + "redirect", + "refuse", + "static", + "transparent", + "type-transparent" + ], + "default": "transparent" + }, + "records": { + "description": "A or AAAA record entry", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "DNS_Zone_Forward": { + "description": "Manage the set of Forward Zones used by DNS Cache", + "type": "object", + "properties": { + "nameservers": { + "description": "An array of nameservers and ports", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "DNS_Nameserver": { + "title": "DNS_Nameserver", + "description": "Configures a DNS nameserver", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "DNS_Nameserver" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "address": { + "description": "Specifies the IP address on which the DNS nameserver (client) or back-end DNS authoritative server (DNS Express server) listens for DNS messages", + "type": "string", + "default": "127.0.0.1", + "format": "f5ip" + }, + "port": { + "description": "Specifies the service port on which the DNS nameserver (client) or back-end DNS authoritative server (DNS Express server) listens for DNS messages", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 53 + }, + "routeDomain": { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Route_Domain" + } + ], + "default": { + "bigip": "/Common/0" + } + }, + "tsigKey": { + "$ref": "#/definitions/Pointer_DNS_TSIG_Key" + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "DNS_Cache_Resolver": { + "description": "DNS Cache with recursive resolver", + "type": "object", + "properties": { + "allowedQueryTime": { + "description": "The time allowed for a query to stay in the queue before replaced by a new query when the number of concurrent distinct queries exceeds the limit. The default value is 200 milliseconds.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 200 + }, + "answerDefaultZones": { + "description": "Specifies whether the system answers DNS queries for the default zones localhost, reverse 127.0.0.1 and ::1, and AS112", + "type": "boolean", + "default": false + }, + "localZones": { + "description": "Configures resource records that a DNS cache uses to resolve matching DNS queries with authoritative DNS responses", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/DNS_Zone_Local" + } + }, + "maxConcurrentQueries": { + "description": "Maximum number of concurrent queries used by the resolver. The default value is 1024", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 1024 + }, + "maxConcurrentTcp": { + "description": "Maximum number of concurrent TCP flows used by the resolver. The default value is 20", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 20 + }, + "maxConcurrentUdp": { + "description": "Maximum number of concurrent UDP flows used by the resolver. The default value is 8192", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 8192 + }, + "msgCacheSize": { + "description": "Number of bytes allocated for the message cache. The default value is 1m", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 1048576 + }, + "nameserverCacheCount": { + "description": "Number of DNS nameservers to cache. The default value is 16k", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 16536 + }, + "randomizeQueryNameCase": { + "description": "Enables resolver to randomize the case of query names. The default value is yes", + "type": "boolean", + "default": true + }, + "forwardZones": { + "description": "Manage the set of Forward Zones used by this DNS Cache", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/DNS_Zone_Forward" + } + }, + "rootHints": { + "description": "List of IP addresses to use for root name servers. Defaults are known Internet root servers.", + "type": "array", + "items": { + "type": "string" + } + }, + "routeDomain": { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Route_Domain" + } + ], + "default": { + "bigip": "/Common/0" + } + }, + "recordCacheSize": { + "description": "Number of bytes allocated for the resource record set cache. The default value is 10m", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 10485760 + }, + "recordRotationMethod": { + "description": "Select which resource record set rotation method should be used on cache responses", + "type": "string", + "enum": [ + "none", + "query-id" + ], + "default": "none" + }, + "unwantedQueryReplyThreshold": { + "description": "The threshold count of unsolicited query replies which triggers an alert (potential DOS attack underway). The default value is 0 (or off)", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 0 + }, + "useIpv4": { + "description": "Enables resolver to issue IPv4 queries. The default value is yes", + "type": "boolean", + "default": true + }, + "useIpv6": { + "description": "Enables resolver to issue IPv6 queries. The default value is yes", + "type": "boolean", + "default": true + }, + "useTcp": { + "description": "Enables resolver to issue tcp queries. The default value is yes", + "type": "boolean", + "default": true + }, + "useUdp": { + "description": "Enables resolver to issue udp queries. The default value is yes", + "type": "boolean", + "default": true + } + } + }, + "DNS_Cache_Validating_Resolver": { + "description": "DNS Cache with recursive resolver and DNSSEC validation", + "type": "object", + "properties": { + "allowedQueryTime": { + "description": "The time allowed for a query to stay in the queue before replaced by a new query when the number of concurrent distinct queries exceeds the limit. The default value is 200 milliseconds.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 200 + }, + "answerDefaultZones": { + "description": "Specifies whether the system answers DNS queries for the default zones localhost, reverse 127.0.0.1 and ::1, and AS112", + "type": "boolean", + "default": false + }, + "ignoreCd": { + "description": "Ignore client queries setting of checking-disabled. Perform validation anyway and only return secure answers. The default value is no", + "type": "boolean", + "default": false + }, + "keyCacheSize": { + "description": "Number of bytes allocated for the DNSKEY cache. The default value is 1m", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 1048576 + }, + "localZones": { + "description": "Configures resource records that a DNS cache uses to resolve matching DNS queries with authoritative DNS responses", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/DNS_Zone_Local" + } + }, + "maxConcurrentQueries": { + "description": "Maximum number of concurrent queries used by the resolver. The default value is 1024", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 1024 + }, + "maxConcurrentTcp": { + "description": "Maximum number of concurrent TCP flows used by the resolver. The default value is 20", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 20 + }, + "maxConcurrentUdp": { + "description": "Maximum number of concurrent UDP flows used by the resolver. The default value is 8192", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 8192 + }, + "msgCacheSize": { + "description": "Number of bytes allocated for the message cache. The default value is 1m", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 1048576 + }, + "nameserverCacheCount": { + "description": "Number of DNS nameservers to cache. The default value is 16k", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 16536 + }, + "prefetchKey": { + "description": "Fetch DNSKEY early in validation process. The default value is yes", + "type": "boolean", + "default": true + }, + "randomizeQueryNameCase": { + "description": "Enables resolver to randomize the case of query names. The default value is yes", + "type": "boolean", + "default": true + }, + "forwardZones": { + "description": "Manage the set of Forward Zones used by this DNS Cache", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/DNS_Zone_Forward" + } + }, + "rootHints": { + "description": "List of IP addresses to use for root name servers. Defaults are known Internet root servers.", + "type": "array", + "items": { + "type": "string" + } + }, + "routeDomain": { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Route_Domain" + } + ], + "default": { + "bigip": "/Common/0" + } + }, + "recordCacheSize": { + "description": "Number of bytes allocated for the resource record set cache. The default value is 10m", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 10485760 + }, + "recordRotationMethod": { + "description": "Select which resource record set rotation method should be used on cache responses", + "type": "string", + "enum": [ + "none", + "query-id" + ], + "default": "none" + }, + "trustAnchors": { + "description": "List of DNSKEY or DS resource records used to establish DNSSEC validator trust. Specified in string form (e.g. dig or drill format). The default is none", + "type": "array", + "items": { + "type": "string" + } + }, + "unwantedQueryReplyThreshold": { + "description": "The threshold count of unsolicited query replies which triggers an alert (potential DOS attack underway). The default value is 0 (or off)", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 0 + }, + "useIpv4": { + "description": "Enables resolver to issue IPv4 queries. The default value is yes", + "type": "boolean", + "default": true + }, + "useIpv6": { + "description": "Enables resolver to issue IPv6 queries. The default value is yes", + "type": "boolean", + "default": true + }, + "useTcp": { + "description": "Enables resolver to issue tcp queries. The default value is yes", + "type": "boolean", + "default": true + }, + "useUdp": { + "description": "Enables resolver to issue udp queries. The default value is yes", + "type": "boolean", + "default": true + } + } + }, + "DOS_Profile": { + "title": "DOS_Profile", + "description": "Configures a Denial of Service (DOS) profile", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm", + "asm" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "DOS_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "application": { + "description": "Application security sub-profile", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "asm" + ] + } + }, + { + "$ref": "#/definitions/DOS_Profile_Application" + } + ] + }, + "network": { + "description": "Network security sub-profile", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + } + }, + { + "$ref": "#/definitions/DOS_Profile_Network" + } + ] + }, + "protocolDNS": { + "description": "DNS protocol security sub-profile", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + } + }, + { + "$ref": "#/definitions/DOS_Profile_Protocol_DNS" + } + ] + }, + "protocolSIP": { + "description": "SIP protocol security sub-profile", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + } + }, + { + "$ref": "#/definitions/DOS_Profile_Protocol_SIP" + } + ] + }, + "allowlist": { + "description": "Specifies the default allowlist address list for the system to use to determine which IP addresses are legitimate. The system does not examine traffic from the IP addresses in the list when performing DoS prevention. This property is available on BIGIP 14.1 and above.", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Address_List" + } + ] + }, + "whitelist": { + "description": "Deprecated. Replaced with functionally equivalent allowlist. Specifies the default allowlist address list for the system to use to determine which IP addresses are legitimate. The system does not examine traffic from the IP addresses in the list when performing DoS prevention. This property is available on BIGIP 14.1 and above.", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Address_List" + } + ] + }, + "applicationAllowlist": { + "description": "Specifies the IP addresses and subnets allowlist configuration for Application Security (Overrides the global allowlist)", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "asm" + ] + } + }, + { + "$ref": "#/definitions/Pointer_Address_List" + } + ] + }, + "applicationWhitelist": { + "description": "Deprecated. Replaced with functionally equivalent applicationAllowlist. Specifies the IP addresses and subnets allowlist configuration for Application Security (Overrides the global allowlist)", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "asm" + ] + } + }, + { + "$ref": "#/definitions/Pointer_Address_List" + } + ] + } + }, + "additionalProperties": false, + "f5aliases": { + "allowlist": "whitelist", + "applicationAllowlist": "applicationWhitelist" + } + }, + "DOS_Auto_Denylist_Settings": { + "description": "Adds the source IP address to the denylist category assigned to the Denial-of-Service (DoS) vector", + "type": "object", + "properties": { + "enabled": { + "description": "Specifies if automatic denylist management should be used", + "type": "boolean", + "default": false + }, + "category": { + "description": "Specifies the denylist category assigned to the DoS vector. The settings for this category determine IP Intelligence actions, logging settings, and denylist publisher settings.", + "default": { + "bigip": "/Common/denial_of_service" + }, + "allOf": [ + { + "$ref": "#/definitions/Pointer_Denylist_Category" + } + ] + }, + "attackDetectionTime": { + "description": "Specifies the time in seconds before a vector is denylisted", + "type": "integer", + "minimum": 1, + "maximum": 4294967295, + "default": 60 + }, + "categoryDuration": { + "description": "Specifies the time in seconds before the denylist entry is removed", + "type": "integer", + "minimum": 60, + "maximum": 4294967295, + "default": 14400 + }, + "externalAdvertisementEnabled": { + "description": "Specifies that addresses that are identified for denylisting are advertised to BGP routers, as configured per denylist category in Blacklist Publisher", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + }, + "DOS_Bad_Actor_Detection_Settings": { + "description": "Bad actor detection allows automatic detection, logging, and rate limiting of specific IP addresses that appear to be the source of an attack, based on criteria you configure.", + "type": "object", + "properties": { + "enabled": { + "description": "Specifies that Bad Actor detection is enabled", + "type": "boolean", + "default": false + }, + "sourceDetectionThreshold": { + "description": "Specifies the number of packets per second to identify an IP address as a bad actor", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 4294967295 + }, + "sourceMitigationThreshold": { + "description": "Specifies the rate limit applied to a source IP that is identified as a bad actor", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 4294967295 + } + }, + "additionalProperties": false + }, + "DOS_Profile_Application_Heavy_URL": { + "description": "Heavy URLs are a small number of site URLs that might consume considerable server resources per request. Heavy URLs respond with low latency most of the time, but may easily reach high latency under specific conditions. Heavy URLs are not necessarily heavy all the time, but are potentially heavy, especially during DoS attacks. It only takes a low rate of requests to heavy URLs in order to cause DoS attacks. When an attack is suspected, the system protects the heavy URLs using the by URL methods that you enabled in TPS-based Detection and Behavioral & Stress-based Detection. If no URL-based methods are enabled there, the system only reports attacks.", + "type": "object", + "properties": { + "automaticDetectionEnabled": { + "description": "Mark a URL as heavy if its portion of transactions with latency above the specified threshold is higher than usual for this site", + "type": "boolean", + "default": true + }, + "detectionThreshold": { + "description": "Specifies the latency threshold for automatic heavy URL detection (in milliseconds)", + "type": "integer", + "minimum": 16, + "maximum": 4294967295, + "default": 1000 + }, + "excludeList": { + "description": "URLs the system should not consider heavy even if the system automatically detects them as being heavy. This list may contain prefix wildcards.", + "type": "array", + "items": { + "type": "string" + } + }, + "protectList": { + "description": "URLs you expect to be heavy even if the system does not automatically detect them as being heavy", + "type": "array", + "items": { + "type": "object", + "properties": { + "url": { + "description": "URL to protect", + "type": "string" + }, + "threshold": { + "description": "Threshold for detection in requests per second", + "type": "integer", + "minimum": 0, + "maximum": 4294967295 + } + }, + "additionalProperties": false, + "required": [ + "url", + "threshold" + ] + } + } + }, + "additionalProperties": false + }, + "DOS_Profile_Application_Captcha": { + "description": "Specifies the text the system sends, during a suspected DoS event, to users after it challenges users with the first CAPTCHA response, and the text the system sends to users after they fail a CAPTCHA response.", + "type": "object", + "properties": { + "first": { + "description": "Specifies the content that the system displays to a user the first time the user is asked to respond to a CAPTCHA", + "type": "string", + "maxLength": 65520 + }, + "failure": { + "description": "Specifies the content the system displays to a user after the user fails to correctly answer a CAPTCHA", + "type": "string", + "maxLength": 65520 + } + }, + "additionalProperties": false + }, + "DOS_Profile_Application_Bot_Defense": { + "description": "BIG-IP AS3 provides defense against bot attacks by detecting and stopping them before the attacks start to grow, by performing the following:\n\n* The system sends a client-side JavaScript challenge to the browser.\n* If the challenge is met, the system adds a cookie to the second request. This cookie is active until the session ends, and the system does not add any more cookies to further requests during that session.\n* The system drops requests sent by browsers that do not answer the system’s initial JavaScript challenge, assuming they are bots that do not support JavaScript.\n\nNote: This feature requires browsers to allow JavaScript.\n\nImportant: The proactive bot defense feature works also in Transparent mode. This means that the system will replace responses with client side JavaScript also in Transparent mode, and if the client cannot run JavaScript, it will not be able to receive the server responses.\n\nImportant: If you enable Proactive Bot Defense and your web site uses CORS (Cross-Origin Resource Sharing), we recommend that you add the CORS URLs to the proactive bot URL allowlist.\n\nThis method is intended to complement, not replace, the other mitigation methods.", + "type": "object", + "properties": { + "mode": { + "description": "Specifies the conditions under which bots are detected and blocked", + "type": "string", + "enum": [ + "off", + "during-attacks", + "always" + ], + "default": "off" + }, + "blockSuspiscousBrowsers": { + "$comment": "maps to application.bot-defense.browser-legit-enabled", + "description": "Detect and block requests from highly suspicious browsers", + "type": "boolean", + "default": true + }, + "issueCaptchaChallenge": { + "$comment": "maps to application.bot-defense.browser-legit-captcha", + "description": "Issue CAPTCHA challenges to moderately suspicious browsers", + "type": "boolean", + "default": true + }, + "gracePeriod": { + "description": "The length of time (in seconds) before the system blocks suspected bots. The grace period allows web application pages with both HTML and non-HTML (like images, JS, and CSS) to load completely without being blocked. The grace period starts after client validation, a configuration change, or when proactive bot defense is activated as a result of a detected attack or high latency. This property is available on BIGIP 14.1 and above.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 300 + }, + "crossDomainRequests": { + "description": "Specifies how the system responds when receiving a request for non-HTML resources (images, CSS, XML, JavaScript, and Flash) without a valid cookie, and has a Referer header with a different domain than the host domain. This property is available on BIGIP 14.1 and above.", + "type": "string", + "enum": [ + "allow-all", + "validate-bulk", + "validate-upon-request" + ], + "default": "allow-all" + }, + "siteDomains": { + "description": "Specifies how the system responds when receiving a request for non-HTML resources (images, CSS, XML, JavaScript, and Flash) without a valid cookie, and has a Referer header with a different domain than the host domain. This property is available on BIGIP 14.1 and above.", + "type": "array", + "items": { + "type": "string" + } + }, + "externalDomains": { + "description": "Specifies the external referring domains (that are not part of your website) that are allowed to link to resources in your website. These domains are not protected with proactive bot defense, but the system allows them if they pass the system's redirect-cookie challenge. This property is available on BIGIP 14.1 and above.", + "type": "array", + "items": { + "type": "string" + } + }, + "urlAllowlist": { + "description": "Specifies excluded URLs. Requests to these URLs will not be blocked by Proactive Bot Defense, although they may still be blocked by the TPS-based / Stress-based attack mitigation", + "type": "array", + "items": { + "type": "string" + } + }, + "urlWhitelist": { + "description": "Deprecated. Replaced with functionally equivalent urlAllowlist. Specifies excluded URLs. Requests to these URLs will not be blocked by Proactive Bot Defense, although they may still be blocked by the TPS-based / Stress-based attack mitigation", + "type": "array", + "items": { + "type": "string" + } + } + }, + "f5aliases": { + "urlAllowlist": "urlWhitelist" + }, + "dependencies": { + "issueCaptchaChallenge": { + "if": { + "properties": { + "issueCaptchaChallenge": { + "const": true + } + } + }, + "then": { + "properties": { + "blockSuspiscousBrowsers": { + "const": true + } + } + } + }, + "siteDomains": { + "properties": { + "crossDomainRequests": { + "enum": [ + "validate-bulk", + "validate-upon-request" + ] + } + } + }, + "externalDomains": { + "properties": { + "crossDomainRequests": { + "enum": [ + "validate-bulk", + "validate-upon-request" + ] + } + } + } + }, + "additionalProperties": false + }, + "DOS_Profile_Application_Bot_Signatures": { + "description": "This feature automatically detects well known bots according to their HTTP characteristics. Malicious bots can be configured to be blocked, while benign bots can be configured to pass through the anti-bot defense mechanisms.", + "type": "object", + "properties": { + "checkingEnabled": { + "description": "Specifies the system uses signatures to check whether a bot is benign or malicious", + "type": "boolean", + "default": false + }, + "blockedCategories": { + "description": "The system blocks and reports requests that match signatures in this list of categories", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Bot_Signature_Category" + } + }, + "reportedCategories": { + "description": "The system logs requests that match signatures in this list of categories and counts them in the DoS reports", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Bot_Signature_Category" + } + }, + "disabledSignatures": { + "description": "A list of signatures the system ignores when it matches requests with configured bot signatures", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Bot_Signature" + } + } + }, + "additionalProperties": false + }, + "DOS_Profile_Application_Mobile_Defense": { + "description": "When enabled, requests from mobile applications built with the Anti-Bot Mobile SDK will be detected and handled according to the setting configured here. When disabled, these requests will be handled like any other request, meaning that they may let attacks in or cause false positives. Mobile application traffic will be treated differently than other clients, e.g. browsers, in security policies. For this reason, even when DoS protection is not required in a security policy, you still must set a DoS profile with mobile application protection enabled.", + "type": "object", + "properties": { + "enabled": { + "description": "When enabled, requests from mobile applications built with Anti-Bot Mobile SDK will be detected and handled according to the settings below. When disabled, these requests will be handled like any other request which may let attacks in, or cause false positives.", + "type": "boolean", + "default": false + }, + "allowAndroidPublishers": { + "description": "Publisher certificates to allow. All others are blocked. An empty list allows all publishers.", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_SSL_Certificate" + } + }, + "allowAndroidRootedDevice": { + "description": "Select to allow traffic from rooted Android devices", + "type": "boolean", + "default": false + }, + "allowIosPackageNames": { + "description": "Package names to allow. All others are blocked. An empty list allows all package names.", + "type": "array", + "items": { + "type": "string" + } + }, + "allowJailbrokenDevices": { + "description": "Select to allow traffic from jailbroken iOS devices", + "type": "boolean", + "default": false + }, + "allowEmulators": { + "description": "Select to allow traffic from applications run on emulators", + "type": "boolean", + "default": false + }, + "clientSideChallengeMode": { + "description": "Specifies the action to take when a CAPTCHA or Client Side Integrity challenge needs to be presented", + "type": "string", + "enum": [ + "pass", + "challenge" + ], + "default": "pass" + } + }, + "additionalProperties": false + }, + "DOS_Profile_Application_Detection_IP": { + "description": "Specifies the criteria that determines when the system treats a source IP address as an attacker", + "type": "object", + "properties": { + "minimumTps": { + "description": "The minimum number of transactions per second before a source can be considered an attacking entity. This condition and the increase rate condition must be met for a source to be considered an attacking entity.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 40 + }, + "tpsIncreaseRate": { + "description": "The transactions per second increase (as a percentage) that must occur before a source can be considered an attacking entity. This condition and the minimum TPS condition must be met for a source to be considered an attacking entity.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 500 + }, + "maximumTps": { + "description": "The maximum number of transactions per second before a source is always considered an attacking entity", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 200 + }, + "minimumAutoTps": { + "description": "Minimum number of transactions per second of an auto-calculated threshold before a source is considered an attacking entity", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 5 + }, + "maximumAutoTps": { + "description": "Maximum number of transactions per second of an auto-calculated threshold before a source is considered an attacking entity", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 5000 + }, + "clientSideDefenseEnabled": { + "description": "Specifies, when enabled, that if traffic meets the detection conditions, the system issues a client-side integrity challenge that will consume computation resources from the client and slow its attack rate. The system issues a client-side integrity challenge to determine whether the client is a legal browser or an illegal script by sending a JavaScript challenge and waiting for a response. (Legal browsers are able to respond, while illegal scripts cannot.)", + "type": "boolean", + "default": false + }, + "captchaChallengeEnabled": { + "description": "Specifies, when enabled, that if traffic meets the detection conditions, the system issues a CAPTCHA challenge to determine whether the client is a legal browser with a human user behind it, or an illegal script. (Legal browsers with human users behind them are able to respond, while illegal scripts cannot.)", + "type": "boolean", + "default": false + }, + "rateLimitingEnabled": { + "description": "Specifies, when enabled, that if traffic meets the detection conditions, the system applies rate limiting to the traffic", + "type": "boolean", + "default": true + }, + "rateLimitingMode": { + "description": "Specifies if rate limiting should block all traffic ('block-all') or apply normal rate limiting ('rate-limit').", + "type": "string", + "enum": [ + "rate-limit", + "block-all" + ], + "default": "rate-limit" + } + }, + "additionalProperties": false + }, + "DOS_Profile_Application_Detection_Device": { + "description": "Specifies the criteria that determines when the system treats a device as an attacker", + "type": "object", + "properties": { + "minimumTps": { + "description": "The minimum number of transactions per second before a source can be considered an attacking entity. This condition and the increase rate condition must be met for a source to be considered an attacking entity.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 40 + }, + "tpsIncreaseRate": { + "description": "The transactions per second increase (as a percentage) that must occur before a source can be considered an attacking entity. This condition and the minimum TPS condition must be met for a source to be considered an attacking entity.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 500 + }, + "maximumTps": { + "description": "The maximum number of transactions per second before a source is always considered an attacking entity", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 200 + }, + "minimumAutoTps": { + "description": "Minimum number of transactions per second of an auto-calculated threshold before a source is considered an attacking entity", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 5 + }, + "maximumAutoTps": { + "description": "Maximum number of transactions per second of an auto-calculated threshold before a source is considered an attacking entity", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 5000 + }, + "clientSideDefenseEnabled": { + "description": "Specifies, when enabled, that if traffic meets the detection conditions, the system issues a client-side integrity challenge that will consume computation resources from the client and slow its attack rate. The system issues a client-side integrity challenge to determine whether the client is a legal browser or an illegal script by sending a JavaScript challenge and waiting for a response. (Legal browsers are able to respond, while illegal scripts cannot.)", + "type": "boolean", + "default": false + }, + "captchaChallengeEnabled": { + "description": "Specifies, when enabled, that if traffic meets the detection conditions, the system issues a CAPTCHA challenge to determine whether the client is a legal browser with a human user behind it, or an illegal script. (Legal browsers with human users behind them are able to respond, while illegal scripts cannot.)", + "type": "boolean", + "default": false + }, + "rateLimitingEnabled": { + "description": "Specifies, when enabled, that if traffic meets the detection conditions, the system applies rate limiting to the traffic", + "type": "boolean", + "default": false + }, + "rateLimitingMode": { + "description": "Specifies if rate limiting should block all traffic ('block-all') or apply normal rate limiting ('rate-limit').", + "type": "string", + "enum": [ + "rate-limit", + "block-all" + ], + "default": "rate-limit" + } + }, + "additionalProperties": false + }, + "DOS_Profile_Application_Detection_Geolocation": { + "description": "Specifies the criteria that determines when the system treats a geolocation as an attacker", + "type": "object", + "properties": { + "minimumShare": { + "description": "The minimum share of traffic (as a percentage) before a source can be considered an attacking entity. This condition and the share increase rate condition must be met for a source to be considered an attacking entity.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 10 + }, + "shareIncreaseRate": { + "description": "The share increase (as a percentage) that must occur before a source can be considered an attacking entity. This condition and the minimum share condition must be met for a source to be considered an attacking entity.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 500 + }, + "minimumAutoTps": { + "description": "Minimum number of transactions per second of an auto-calculated threshold before a source is considered an attacking entity", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 50 + }, + "maximumAutoTps": { + "description": "Maximum number of transactions per second of an auto-calculated threshold before a source is considered an attacking entity", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 20000 + }, + "clientSideDefenseEnabled": { + "description": "Specifies, when enabled, that if traffic meets the detection conditions, the system issues a client-side integrity challenge that will consume computation resources from the client and slow its attack rate. The system issues a client-side integrity challenge to determine whether the client is a legal browser or an illegal script by sending a JavaScript challenge and waiting for a response. (Legal browsers are able to respond, while illegal scripts cannot.)", + "type": "boolean", + "default": false + }, + "captchaChallengeEnabled": { + "description": "Specifies, when enabled, that if traffic meets the detection conditions, the system issues a CAPTCHA challenge to determine whether the client is a legal browser with a human user behind it, or an illegal script. (Legal browsers with human users behind them are able to respond, while illegal scripts cannot.)", + "type": "boolean", + "default": false + }, + "rateLimitingEnabled": { + "description": "Specifies, when enabled, that if traffic meets the detection conditions, the system applies rate limiting to the traffic", + "type": "boolean", + "default": false + }, + "rateLimitingMode": { + "description": "Specifies if rate limiting should block all traffic ('block-all') or apply normal rate limiting ('rate-limit').", + "type": "string", + "enum": [ + "rate-limit", + "block-all" + ], + "default": "rate-limit" + } + }, + "additionalProperties": false + }, + "DOS_Profile_Application_Detection_URL": { + "description": "Specifies the criteria that determines when the system treats a URL as an attacker", + "type": "object", + "properties": { + "minimumTps": { + "description": "The minimum number of transactions per second before a source can be considered an attacking entity. This condition and the increase rate condition must be met for a source to be considered an attacking entity.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 200 + }, + "tpsIncreaseRate": { + "description": "The transactions per second increase (as a percentage) that must occur before a source can be considered an attacking entity. This condition and the minimum TPS condition must be met for a source to be considered an attacking entity.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 500 + }, + "maximumTps": { + "description": "The maximum number of transactions per second before a source is always considered an attacking entity", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 1000 + }, + "minimumAutoTps": { + "description": "Minimum number of transactions per second of an auto-calculated threshold before a source is considered an attacking entity", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 5 + }, + "maximumAutoTps": { + "description": "Maximum number of transactions per second of an auto-calculated threshold before a source is considered an attacking entity", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 5000 + }, + "heavyURLProtectionEnabled": { + "description": "Specifies, when enabled, that heavy URL protection should be enabled", + "type": "boolean", + "default": true + }, + "clientSideDefenseEnabled": { + "description": "Specifies, when enabled, that if traffic meets the detection conditions, the system issues a client-side integrity challenge that will consume computation resources from the client and slow its attack rate. The system issues a client-side integrity challenge to determine whether the client is a legal browser or an illegal script by sending a JavaScript challenge and waiting for a response. (Legal browsers are able to respond, while illegal scripts cannot.)", + "type": "boolean", + "default": false + }, + "captchaChallengeEnabled": { + "description": "Specifies, when enabled, that if traffic meets the detection conditions, the system issues a CAPTCHA challenge to determine whether the client is a legal browser with a human user behind it, or an illegal script. (Legal browsers with human users behind them are able to respond, while illegal scripts cannot.)", + "type": "boolean", + "default": false + }, + "rateLimitingEnabled": { + "description": "Specifies, when enabled, that if traffic meets the detection conditions, the system applies rate limiting to the traffic", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false + }, + "DOS_Profile_Application_Detection_Site": { + "description": "Specifies the criteria that determines when the system treats a site as an attacker", + "type": "object", + "properties": { + "minimumTps": { + "description": "The minimum number of transactions per second before a source can be considered an attacking entity. This condition and the increase rate condition must be met for a source to be considered an attacking entity.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 2000 + }, + "tpsIncreaseRate": { + "description": "The transactions per second increase (as a percentage) that must occur before a source can be considered an attacking entity. This condition and the minimum TPS condition must be met for a source to be considered an attacking entity.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 500 + }, + "maximumTps": { + "description": "The maximum number of transactions per second before a source is always considered an attacking entity", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 10000 + }, + "minimumAutoTps": { + "description": "Minimum number of transactions per second of an auto-calculated threshold before a source is considered an attacking entity", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 5 + }, + "maximumAutoTps": { + "description": "Maximum number of transactions per second of an auto-calculated threshold before a source is considered an attacking entity", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 20000 + }, + "clientSideDefenseEnabled": { + "description": "Specifies, when enabled, that if traffic meets the detection conditions, the system issues a client-side integrity challenge that will consume computation resources from the client and slow its attack rate. The system issues a client-side integrity challenge to determine whether the client is a legal browser or an illegal script by sending a JavaScript challenge and waiting for a response. (Legal browsers are able to respond, while illegal scripts cannot.)", + "type": "boolean", + "default": false + }, + "captchaChallengeEnabled": { + "description": "Specifies, when enabled, that if traffic meets the detection conditions, the system issues a CAPTCHA challenge to determine whether the client is a legal browser with a human user behind it, or an illegal script. (Legal browsers with human users behind them are able to respond, while illegal scripts cannot.)", + "type": "boolean", + "default": false + }, + "rateLimitingEnabled": { + "description": "Specifies, when enabled, that if traffic meets the detection conditions, the system applies rate limiting to the traffic", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + }, + "DOS_Profile_Application_Rate_Based_Detection": { + "description": "Configure the system to prevent DoS attacks based on the client side transactions per second (TPS-based detection mode). The system considers traffic to be a DoS attack based on the following calculations:\n\n* Transaction rate detection interval: The average number of requests per second sent. This is the TPS value that triggered the attack. This number is calculated by the system, by default, every ten seconds.\n* Transaction rate history interval: The average number of requests per second sent. This number is the average number of transactions for the past hour, and it is updated every 10 seconds.\n\nIn TPS-based detection mode, if the ratio of the transaction rate detection interval to the transaction rate history interval is greater than the specific percentage configured, the system detects the URL/site to be under attack, or the IP address/geolocation to be attacking. In order to stop the attack, the system blocks some, or all, requests from the detected IP address/geolocation and/to the attacked URL/site, depending on the configuration of the DoS profile.", + "type": "object", + "properties": { + "operationMode": { + "description": "Specifies how the system reacts when it detects an attack", + "type": "string", + "enum": [ + "off", + "transparent", + "blocking" + ], + "default": "off" + }, + "thresholdsMode": { + "description": "Specifies what type of thresholds to use", + "type": "string", + "enum": [ + "manual", + "automatic" + ], + "default": "manual" + }, + "escalationPeriod": { + "description": "Specifies the minimum time spent in each mitigation step before the system moves to the next mitigation step when preventing a DoS attack. After the system detects a DoS attack, it performs attack prevention for the amount of time specified here for every method that is enabled. If after this period the attack has not been fully stopped, the system escalates to the next enabled prevention step.", + "type": "integer", + "minimum": 1, + "maximum": 3600, + "default": 120 + }, + "deEscalationPeriod": { + "description": "When preventing a DoS attack, specifies the time spent since the mitigation started until retrying the steps from the beginning of the enabled methods. If the value is 0, no de-escalation occurs.", + "type": "integer", + "minimum": 0, + "maximum": 86400, + "default": 7200 + }, + "sourceIP": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Detection_IP" + } + ], + "default": {} + }, + "deviceID": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Detection_Device" + } + ], + "default": {} + }, + "geolocation": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Detection_Geolocation" + } + ], + "default": {} + }, + "url": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Detection_URL" + } + ], + "default": {} + }, + "site": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Detection_Site" + } + ], + "default": {} + } + }, + "additionalProperties": false + }, + "DOS_Profile_Application_Stress_Based_Detection_Bad_Actor": { + "description": "Specifies properties of Behavioral Detection in Stress-based anomaly.\n\nThe following mitigation options are available:\n\n* Conservative protection: If detectionEnabled is true, slows down and rate limits requests from anomalous IP addresses based on its anomaly detection confidence and the server's health. If signatureDetectionEnabled is true, blocks requests that match the attack signatures.\n* Standard protection: If detectionEnabled is true, slows down requests from anomalous IP addresses based on its anomaly detection confidence and the server's health. Rate limits requests from anomalous IP addresses and, if necessary, rate limits all requests based on the server's health. Limits the number of concurrent connections from anomalous IP addresses and, if necessary, limits the number of all concurrent connections based on the server's health. If signatureDetectionEnabled is true, blocks requests that match the attack signatures.\n* Aggressive protection: If detectionEnabled is true, slows down requests from anomalous IP addresses based on its anomaly detection confidence and the server's health. Rate limits requests from anomalous IP addresses and, if necessary, rate limits all requests based on the server's health. Limits the number of concurrent connections from anomalous IP addresses and, if necessary, limits the number of all concurrent connections based on the server's health. Proactively performs all protection actions (even before an attack). Increases the impact of the protection techniques. If signatureDetectionEnabled is true, blocks requests that match the attack signatures. Increases the impact of blocked requests.", + "type": "object", + "properties": { + "detectionEnabled": { + "description": "Enables traffic behavior, server's capacity learning, and anomaly detection", + "type": "boolean", + "default": false + }, + "signatureDetectionEnabled": { + "description": "Enables request signature detection", + "type": "boolean", + "default": false + }, + "useApprovedSignaturesOnly": { + "description": "Limits request signature detection to approved signatures only", + "type": "boolean", + "default": false + }, + "mitigationMode": { + "description": "Specifies mitigation impact on suspicious bad actors/requests", + "type": "string", + "enum": [ + "none", + "conservative", + "standard", + "aggressive" + ], + "default": "none" + }, + "acceleratedSignaturesEnabled": { + "description": "Enables signature detection before the connection establishment", + "type": "boolean", + "default": false + }, + "tlsSignaturesEnabled": { + "description": "Enables tls signature detection before the connection establishment. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + }, + "DOS_Profile_Application_Stress_Based_Detection": { + "description": "Configure the system to prevent DoS attacks based on the server’s health condition. An attack is detected if the system finds the server to be under stress and either of the TPS thresholds are crossed.", + "type": "object", + "properties": { + "operationMode": { + "description": "Specifies how the system reacts when it detects an attack", + "type": "string", + "enum": [ + "off", + "transparent", + "blocking" + ], + "default": "off" + }, + "thresholdsMode": { + "description": "Specifies what type of thresholds to use", + "type": "string", + "enum": [ + "manual", + "automatic" + ], + "default": "manual" + }, + "escalationPeriod": { + "description": "Specifies the minimum time spent in each mitigation step before the system moves to the next mitigation step when preventing a DoS attack. After the system detects a DoS attack, it performs attack prevention for the amount of time specified here for every method that is enabled. If after this period the attack has not been fully stopped, the system escalates to the next enabled prevention step.", + "type": "integer", + "minimum": 1, + "maximum": 3600, + "default": 120 + }, + "deEscalationPeriod": { + "description": "When preventing a DoS attack, specifies the time spent since the mitigation started until retrying the steps from the beginning of the enabled methods. If the value is 0, no de-escalation occurs.", + "type": "integer", + "minimum": 0, + "maximum": 86400, + "default": 7200 + }, + "sourceIP": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Detection_IP" + } + ], + "default": {} + }, + "deviceID": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Detection_Device" + } + ], + "default": {} + }, + "geolocation": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Detection_Geolocation" + } + ], + "default": {} + }, + "url": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Detection_URL" + } + ], + "default": {} + }, + "site": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Detection_Site" + } + ], + "default": {} + }, + "badActor": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Stress_Based_Detection_Bad_Actor" + } + ], + "default": {} + } + }, + "additionalProperties": false + }, + "DOS_Profile_Application_TCP_Dump": { + "description": "Configure settings to record traffic (perform a TCP dump) when a DoS attack is underway, in order to diagnose the attack vectors and attackers, observe whether and how it was mitigated, and draw conclusions for changing the DoS profile configuration.", + "type": "object", + "properties": { + "recordTrafficEnabled": { + "description": "Enables the recording of traffic during attacks", + "type": "boolean", + "default": false + }, + "maximumDuration": { + "description": "Configures the maximum time for each TCP dump recording cycle", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 30 + }, + "maximumSize": { + "description": "Configures the maximum size (in MB) for each TCP dump recording cycle", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 10 + }, + "repetitionInterval": { + "description": "Allow multiple TCP dumps to be recorded during a single DoS attack", + "oneOf": [ + { + "type": "string", + "const": "once-per-attack" + }, + { + "type": "integer", + "minimum": 0, + "maximum": 4294967295 + } + ], + "default": 120 + } + }, + "additionalProperties": false + }, + "DOS_Profile_Application": { + "description": "Specifies the conditions for determining that your application is under a DoS attack, and how the system reacts to a suspected attack.", + "type": "object", + "properties": { + "heavyURLProtection": { + "description": "Configure Heavy URL include list, automatic detection, and exclude list", + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Heavy_URL" + } + ], + "default": {} + }, + "denylistedGeolocations": { + "description": "Override the DoS profile’s geolocation rate based threshold settings by selecting countries from which to block traffic during a DoS attack", + "type": "array", + "items": { + "type": "string" + } + }, + "blacklistedGeolocations": { + "description": "Deprecated. Replaced with functionally equivalent denylistedGeolocations. Override the DoS profile’s geolocation rate based threshold settings by selecting countries from which to block traffic during a DoS attack", + "type": "array", + "items": { + "type": "string" + } + }, + "allowlistedGeolocations": { + "description": "Override the DoS profile’s geolocation rate based threshold settings by selecting countries from which to allow traffic during a DoS attack", + "type": "array", + "items": { + "type": "string" + } + }, + "whitelistedGeolocations": { + "description": "Deprecated. Replaced with functionally equivalent allowlistedGeolocations. Override the DoS profile’s geolocation rate based threshold settings by selecting countries from which to allow traffic during a DoS attack", + "type": "array", + "items": { + "type": "string" + } + }, + "captchaResponse": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Captcha" + } + ], + "default": {} + }, + "triggerIRule": { + "description": "Specifies that the system activates an Application DoS iRule event", + "type": "boolean", + "default": false + }, + "singlePageApplicationEnabled": { + "description": "Specifies that your website is a Single Page Application, meaning a web application that loads new content without triggering a full page-reload. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + }, + "scrubbingDuration": { + "description": "Specifies the BGP route advertisement duration in seconds for Traffic Scrubbing during attacks. This requires configuration of the Scrubber Profile, and will function even when the Operation Mode is set to Transparent. A value of 0 disables Traffic Scrubbing. Requires the AFM module and if this property is unspecified it will be disabled.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + } + }, + "remoteTriggeredBlackHoleDuration": { + "description": "Specifies the BGP route advertisement duration in seconds for Remote Triggered Black Hole of attacking IPs. This requires configuration of the Blacklist Publisher, and will function even when the Operation Mode is set to Transparent. A value of 0 disables Remote Triggered Black Hole. Requires the AFM module and if this property is unspecified it will be disabled.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + } + }, + "profileAcceleration": { + "description": "Select a TCP fastL4 profile to be used as a fast-path for acceleration", + "allOf": [ + { + "$ref": "#/definitions/Pointer_L4_Profile" + } + ] + }, + "botDefense": { + "description": "This feature proactively detects bots and scripts, and prevents them from accessing the site. It may be used to prevent DDoS, Web Scraping, and Brute Force attacks. Enabling this feature requires JavaScript support from the browsers.", + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Bot_Defense" + } + ], + "default": {} + }, + "botSignatures": { + "description": "This feature automatically detects well known bots according to their HTTP characteristics. Malicious bots can be configured to be blocked, while benign bots can be configured to pass through the anti-bot defense mechanisms", + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Bot_Signatures" + } + ], + "default": {} + }, + "mobileDefense": { + "description": "This feature detects mobile applications built with the Anti-Bot Mobile SDK and defines how requests from these mobile application clients are handled", + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Mobile_Defense" + } + ], + "default": {} + }, + "rateBasedDetection": { + "description": "Configures the detection of DoS attacks based on high volume of incoming traffic", + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Rate_Based_Detection" + } + ], + "default": {} + }, + "stressBasedDetection": { + "description": "Configures the detection of DoS attacks based on server stress. The system automatically detects an increase in server stress and mitigates DoS attacks causing it. ", + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Stress_Based_Detection" + } + ], + "default": {} + }, + "recordTraffic": { + "description": "This feature allows automatic recording of traffic during DoS attacks, and storing the recordings as TCP Dump files. The files are placed in the system file path /shared/dosl7/tcpdumps.", + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_TCP_Dump" + } + ], + "default": {} + } + }, + "additionalProperties": false, + "f5aliases": { + "allowlistedGeolocations": "whitelistedGeolocations", + "denylistedGeolocations": "blacklistedGeolocations" + } + }, + "DOS_Profile_Network_Dynamic_Signatures": { + "description": "", + "type": "object", + "properties": { + "detectionMode": { + "description": "Select the enforcement state for dynamic signatures. To enable enforcement of dynamic DoS vectors, select enabled. When enforcement is enabled, all thresholds and threshold actions are applied. Select disabled to apply no action or thresholds to dynamic Vectors. Select learn-only to track dynamic vector statistics, without enforcing any thresholds or limits.", + "type": "string", + "enum": [ + "disabled", + "learn-only", + "enabled" + ], + "default": "disabled" + }, + "mitigationMode": { + "description": "Specify the mitigation sensitivity for dynamic signatures", + "type": "string", + "enum": [ + "none", + "low", + "medium", + "high" + ], + "default": "none" + }, + "scrubbingEnabled": { + "description": "Specify whether to enable redirection and scrubbing of IP addresses identified by dynamic vectors. This enables handling of the dynamic vector hits by an IP intelligence category.", + "type": "boolean", + "default": false + }, + "scrubbingCategory": { + "description": "Specifies the IP intelligence denylist category to which scrubbed IPs are sent", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Denylist_Category" + } + ] + }, + "scrubbingDuration": { + "description": "Specify the duration in seconds for which an IP address is added to the denylist category", + "type": "integer", + "minimum": 60, + "maximum": 4294967295, + "default": 500 + } + }, + "additionalProperties": false + }, + "DOS_Profile_Network": { + "description": "", + "type": "object", + "properties": { + "dynamicSignatures": { + "default": {}, + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Network_Dynamic_Signatures" + } + ] + }, + "vectors": { + "description": "A list of configured network DoS vectors", + "type": "array", + "items": { + "$ref": "#/definitions/DOS_Network_Vector" + } + } + }, + "additionalProperties": false + }, + "DOS_Network_Vector": { + "description": "Network Denial-of-Service (DoS) vector", + "type": "object", + "properties": { + "type": { + "description": "Specifies the name of the DoS attack vector whose thresholds you are configuring", + "type": "string", + "enum": [ + "ext-hdr-too-large", + "hop-cnt-low", + "host-unreachable", + "icmpv4-flood", + "icmpv6-flood", + "icmp-frag", + "ip-frag-flood", + "ip-low-ttl", + "ip-opt-frames", + "ipv6-ext-hdr-frames", + "ipv6-frag-flood", + "non-tcp-connection", + "opt-present-with-illegal-len", + "sweep", + "tcp-half-open", + "tcp-opt-overruns-tcp-hdr", + "tcp-psh-flood", + "tcp-rst-flood", + "tcp-syn-flood", + "tcp-synack-flood", + "tcp-syn-oversize", + "tcp-bad-urg", + "tcp-window-size", + "tidcmp", + "too-many-ext-hdrs", + "udp-flood", + "unk-tcp-opt-type" + ] + }, + "state": { + "description": "Specifies how to enforce protection for that attack type: mitigate (watch, learn, alert, and mitigate), detect-only (watch, learn, and alert), learn-only (collect stats, no mitigation), or Disabled (no stat collection, no mitigation).", + "type": "string", + "enum": [ + "disabled", + "learn-only", + "detect-only", + "mitigate" + ], + "default": "mitigate" + }, + "thresholdMode": { + "description": "Specifies how thresholds are set for this vector", + "type": "string", + "enum": [ + "manual", + "stress-based-mitigation", + "fully-automatic" + ], + "default": "manual" + }, + "badActorSettings": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Bad_Actor_Detection_Settings" + } + ], + "default": {} + }, + "autoDenylistSettings": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Auto_Denylist_Settings" + } + ] + }, + "autoBlacklistSettings": { + "description": "Deprecated. Replaced with functionally equivalent autoDenylistSettings.", + "allOf": [ + { + "$ref": "#/definitions/DOS_Auto_Denylist_Settings" + } + ], + "default": {} + }, + "autoAttackFloor": { + "description": "Specifies packets per second to identify an attack. These settings provide an absolute minimum of packets to allow before the attack is identified. As the automatic detection thresholds adjust to traffic and CPU usage on the system over time, this attack floor becomes less relevant.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 100 + }, + "autoAttackCeiling": { + "description": "Specifies the absolute maximum allowable for packets of this type. This setting rate limits packets to the packets per second setting, when specified. To set no hard limit and allow automatic thresholds to manage all rate limiting, set this to 4294967295.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 4294967295 + }, + "rateThreshold": { + "description": "Specify how many packets per second the system must discover in traffic in order to detect this attack", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 4294967295 + }, + "rateIncreaseThreshold": { + "description": "Specify percent of rate increase the system must discover in traffic in order to detect this attack", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 500 + }, + "rateLimit": { + "description": "Specify the maximum number of this type of packet per second the system allows for a vector. The system drops packets once the traffic level exceeds the rate limit.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 4294967295 + }, + "simulateAutoThresholdEnabled": { + "description": "Specifies that results of the current automatic thresholds are logged, though manual thresholds are enforced, and no action is taken on automatic thresholds", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false, + "f5aliases": { + "autoDenylistSettings": "autoBlacklistSettings" + } + }, + "DOS_Profile_Protocol_DNS": { + "description": "", + "type": "object", + "properties": { + "vectors": { + "description": "A list of configured DNS DoS vectors", + "type": "array", + "items": { + "$ref": "#/definitions/DOS_DNS_Vector" + } + } + }, + "additionalProperties": false + }, + "DOS_DNS_Vector": { + "description": "Protocol DNS Denial-of-Service (DoS) vector", + "type": "object", + "properties": { + "type": { + "description": "Specifies the name of the DoS attack vector whose thresholds you are configuring", + "type": "string", + "enum": [ + "a", + "aaaa", + "any", + "axfr", + "cname", + "ixfr", + "mx", + "ns", + "nxdomain", + "other", + "ptr", + "qdcount", + "soa", + "srv", + "txt", + "malformed" + ] + }, + "state": { + "description": "Specifies how to enforce protection for that attack type: mitigate (watch, learn, alert, and mitigate), detect-only (watch, learn, and alert), learn-only (collect stats, no mitigation), or Disabled (no stat collection, no mitigation).", + "type": "string", + "enum": [ + "disabled", + "learn-only", + "detect-only", + "mitigate" + ], + "default": "mitigate" + }, + "thresholdMode": { + "description": "Specifies how thresholds are set for this vector", + "type": "string", + "enum": [ + "manual", + "stress-based-mitigation", + "fully-automatic" + ], + "default": "manual" + }, + "badActorSettings": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Bad_Actor_Detection_Settings" + } + ], + "default": {} + }, + "autoDenylistSettings": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Auto_Denylist_Settings" + } + ] + }, + "autoBlacklistSettings": { + "description": "Deprecated. Replaced with functionally equivalent autoDenylistSettings.", + "allOf": [ + { + "$ref": "#/definitions/DOS_Auto_Denylist_Settings" + } + ], + "default": {} + }, + "autoAttackFloor": { + "description": "Specifies packets per second to identify an attack. These settings provide an absolute minimum of packets to allow before the attack is identified. As the automatic detection thresholds adjust to traffic and CPU usage on the system over time, this attack floor becomes less relevant.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 100 + }, + "autoAttackCeiling": { + "description": "Specifies the absolute maximum allowable for packets of this type. This setting rate limits packets to the packets per second setting, when specified. To set no hard limit and allow automatic thresholds to manage all rate limiting, set this to 4294967295.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 4294967295 + }, + "rateThreshold": { + "description": "Specify how many packets per second the system must discover in traffic in order to detect this attack", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 4294967295 + }, + "rateIncreaseThreshold": { + "description": "Specify percent of rate increase the system must discover in traffic in order to detect this attack", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 500 + }, + "rateLimit": { + "description": "Specify the maximum number of this type of packet per second the system allows for a vector. The system drops packets once the traffic level exceeds the rate limit.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 4294967295 + }, + "simulateAutoThresholdEnabled": { + "description": "Specifies that results of the current automatic thresholds are logged, though manual thresholds are enforced, and no action is taken on automatic thresholds", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false, + "required": [ + "type" + ], + "f5aliases": { + "autoDenylistSettings": "autoBlacklistSettings" + } + }, + "DOS_Profile_Protocol_SIP": { + "description": "", + "type": "object", + "properties": { + "vectors": { + "description": "A list of configured SIP DoS vectors", + "type": "array", + "items": { + "$ref": "#/definitions/DOS_SIP_Vector" + } + } + }, + "additionalProperties": false + }, + "DOS_SIP_Vector": { + "description": "Protocol SIP Denial-of-Service (DoS) vector", + "type": "object", + "properties": { + "type": { + "description": "Specifies the name of the DoS attack vector whose thresholds you are configuring", + "type": "string", + "enum": [ + "ack", + "cancel", + "message", + "options", + "prack", + "register", + "bye", + "invite", + "notify", + "other", + "publish", + "subscribe", + "uri-limit", + "malformed" + ] + }, + "state": { + "description": "Specifies how to enforce protection for that attack type: mitigate (watch, learn, alert, and mitigate), detect-only (watch, learn, and alert), learn-only (collect stats, no mitigation), or Disabled (no stat collection, no mitigation).", + "type": "string", + "enum": [ + "disabled", + "learn-only", + "detect-only", + "mitigate" + ], + "default": "mitigate" + }, + "thresholdMode": { + "description": "Specifies how thresholds are set for this vector", + "type": "string", + "enum": [ + "manual", + "stress-based-mitigation", + "fully-automatic" + ], + "default": "manual" + }, + "badActorSettings": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Bad_Actor_Detection_Settings" + } + ], + "default": {} + }, + "autoDenylistSettings": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Auto_Denylist_Settings" + } + ] + }, + "autoBlacklistSettings": { + "description": "Deprecated. Replaced with functionally equivalent autoDenylistSettings.", + "allOf": [ + { + "$ref": "#/definitions/DOS_Auto_Denylist_Settings" + } + ], + "default": {} + }, + "autoAttackFloor": { + "description": "Specifies packets per second to identify an attack. These settings provide an absolute minimum of packets to allow before the attack is identified. As the automatic detection thresholds adjust to traffic and CPU usage on the system over time, this attack floor becomes less relevant.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 100 + }, + "autoAttackCeiling": { + "description": "Specifies the absolute maximum allowable for packets of this type. This setting rate limits packets to the packets per second setting, when specified. To set no hard limit and allow automatic thresholds to manage all rate limiting, set this to 4294967295.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 4294967295 + }, + "rateThreshold": { + "description": "Specify how many packets per second the system must discover in traffic in order to detect this attack", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 4294967295 + }, + "rateIncreaseThreshold": { + "description": "Specify percent of rate increase the system must discover in traffic in order to detect this attack", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 500 + }, + "rateLimit": { + "description": "Specify the maximum number of this type of packet per second the system allows for a vector. The system drops packets once the traffic level exceeds the rate limit.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 4294967295 + }, + "simulateAutoThresholdEnabled": { + "description": "Specifies that results of the current automatic thresholds are logged, though manual thresholds are enforced, and no action is taken on automatic thresholds", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false, + "required": [ + "type" + ], + "f5aliases": { + "autoDenylistSettings": "autoBlacklistSettings" + } + }, + "Enum_ISP": { + "description": "Enum values for Internet Service Providers (ISP)", + "type": "string", + "enum": [ + "AOL", + "BeijingCNC", + "ChinaEducationNetwork", + "ChinaMobilNetwork", + "ChinaRailwayTelcom", + "ChinaTelecom", + "ChinaUnicom", + "CNC", + "Comcast", + "Earthlink", + "ShanghaiCNC", + "ShanghaiTelecom" + ] + }, + "Enum_Continent_Code_Alpha_2": { + "description": "Enum values for Alpha-2 continent codes based on ISO 3166. Use two dashes (--) if Unknown", + "type": "string", + "enum": [ + "--", + "AF", + "AN", + "AS", + "EU", + "NA", + "OC", + "SA" + ] + }, + "Enum_Country_Code_Alpha_2": { + "description": "Enum values for Alpha-2 country codes based on ISO 3166. Use two dashes (--) if Unknown", + "type": "string", + "enum": [ + "--", + "A1", + "A2", + "AD", + "AE", + "AF", + "AG", + "AI", + "AL", + "AM", + "AN", + "AO", + "AP", + "AQ", + "AR", + "AS", + "AT", + "AU", + "AW", + "AX", + "AZ", + "BA", + "BB", + "BD", + "BE", + "BF", + "BG", + "BH", + "BI", + "BJ", + "BL", + "BM", + "BN", + "BO", + "BQ", + "BR", + "BS", + "BT", + "BV", + "BW", + "BY", + "BZ", + "CA", + "CC", + "CD", + "CF", + "CG", + "CH", + "CI", + "CK", + "CL", + "CM", + "CN", + "CO", + "CR", + "CU", + "CV", + "CX", + "CY", + "CZ", + "DE", + "DJ", + "DK", + "DM", + "DO", + "DZ", + "EC", + "EE", + "EG", + "EH", + "ER", + "ES", + "ET", + "EU", + "FI", + "FJ", + "FK", + "FM", + "FO", + "FR", + "FX", + "GA", + "GB", + "GD", + "GE", + "GF", + "GG", + "GH", + "GI", + "GL", + "GM", + "GN", + "GP", + "GQ", + "GR", + "GS", + "GT", + "GU", + "GW", + "GY", + "HK", + "HM", + "HN", + "HR", + "HT", + "HU", + "ID", + "IE", + "IL", + "IM", + "IN", + "IO", + "IQ", + "IR", + "IS", + "IT", + "JE", + "JM", + "JO", + "JP", + "KE", + "KG", + "KH", + "KI", + "KM", + "KN", + "KP", + "KR", + "KW", + "KY", + "KZ", + "LA", + "LB", + "LC", + "LI", + "LK", + "LR", + "LS", + "LT", + "LU", + "LV", + "LY", + "MA", + "MC", + "MD", + "ME", + "MF", + "MG", + "MH", + "MK", + "ML", + "MM", + "MN", + "MO", + "MP", + "MQ", + "MR", + "MS", + "MT", + "MU", + "MV", + "MW", + "MX", + "MY", + "MZ", + "NA", + "NC", + "NE", + "NF", + "NG", + "NI", + "NL", + "NO", + "NP", + "NR", + "NU", + "NZ", + "O1", + "OM", + "PA", + "PE", + "PF", + "PG", + "PH", + "PK", + "PL", + "PM", + "PN", + "PR", + "PS", + "PT", + "PW", + "PY", + "QA", + "RE", + "RO", + "RS", + "RU", + "RW", + "SA", + "SB", + "SC", + "SD", + "SE", + "SG", + "SH", + "SI", + "SJ", + "SK", + "SL", + "SM", + "SN", + "SO", + "SR", + "ST", + "SV", + "SY", + "SZ", + "TC", + "TD", + "TF", + "TG", + "TH", + "TJ", + "TK", + "TL", + "TM", + "TN", + "TO", + "TR", + "TT", + "TV", + "TW", + "TZ", + "UA", + "UG", + "UM", + "US", + "UY", + "UZ", + "VA", + "VC", + "VE", + "VG", + "VI", + "VN", + "VU", + "WF", + "WS", + "YE", + "YT", + "ZA", + "ZM", + "ZW" + ] + }, + "Enum_Protocols_Idle_Timeout_Policy": { + "description": "Enum values for Idle_Timeout_Policy protocols", + "type": "string", + "enum": [ + "3pc", + "a/n", + "ah", + "all-other", + "argus", + "aris", + "ax.25", + "bbn-rcc", + "bna", + "br-sat-mon", + "cbt", + "cftp", + "chaos", + "compaq-peer", + "cphb", + "cpnx", + "crdup", + "crtp", + "dccp", + "dcn", + "ddp", + "ddx", + "dgp", + "dsr", + "egp", + "eigrp", + "emcon", + "encap", + "esp", + "etherip", + "fc", + "fire", + "ggp", + "gmtp", + "gre", + "hip", + "hmp", + "hopopt", + "i-nlsp", + "iatp", + "icmp", + "idpr", + "idpr-cmtp", + "idrp", + "ifmp", + "igmp", + "igp", + "il", + "ip", + "ipcomp", + "ipcv", + "ipencap", + "ipip", + "iplt", + "ippc", + "ipv4", + "ipv6", + "ipv6-auth", + "ipv6-crypt", + "ipv6-frag", + "ipv6-icmp", + "ipv6-nonxt", + "ipv6-opts", + "ipv6-route", + "ipx-in-ip", + "irtp", + "isis", + "iso-ip", + "iso-tp4", + "kryptolan", + "l2tp", + "larp", + "leaf-1", + "leaf-2", + "manet", + "merit-inp", + "mfe-nsp", + "micp", + "mobile", + "mobility-header", + "mpls-in-ip", + "mtp", + "mux", + "narp", + "netblt", + "nsfnet-igp", + "nvp", + "ospf", + "pgm", + "pim", + "pipe", + "pnni", + "prm", + "ptp", + "pup", + "pvp", + "qnx", + "rdp", + "rohc", + "rsvp", + "rspv-e2e-ignore", + "rvd", + "sat-expak", + "sat-mon", + "scc-sp", + "scps", + "sctp", + "sdrp", + "secure-vmtp", + "shim6", + "skip", + "sm", + "smp", + "snp", + "sprite-rpc", + "sps", + "srp", + "sscopmce", + "st", + "stp", + "sun-nd", + "swipe", + "tcf", + "tcp", + "tlsp", + "tp++", + "trunk-1", + "trunk-2", + "ttp", + "udp", + "udplite", + "uti", + "vines", + "visa", + "vmtp", + "vrrp", + "wb-expak", + "wb-mon", + "wesp", + "wsn", + "xnet", + "xns-idp", + "xtp" + ] + }, + "GSLB_Domain": { + "title": "GSLB_Domain", + "description": "Configures GSLB (Global Server Load Balancing) settings for a domain.", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "GSLB_Domain" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "domainName": { + "title": "Domain Name", + "description": "The name of the domain for the site content you are load balancing. If you have many domains, you can use two different wildcard characters, * and ?, to represent one or more characters in the domain alias, which reduces the number of aliases you have to add to the configuration", + "type": "string", + "minLength": 3 + }, + "aliases": { + "title": "Aliases", + "description": "List of alternate domain names. Each may include wildcard characters.", + "type": "array", + "items": { + "title": "GSLB domain name", + "type": "string", + "minLength": 3 + } + }, + "enabled": { + "title": "Enabled", + "description": "When true (default), the system can use the domain and its resources for load balancing requests", + "type": "boolean", + "default": true + }, + "resourceRecordType": { + "title": "Resource Record (RR) Type", + "description": "Specifies the type of resource records for this domain", + "type": "string", + "enum": [ + "A", + "AAAA", + "CNAME", + "MX" + ] + }, + "pools": { + "title": "Pools", + "description": "Specifies the pools that this domain uses for load balancing. The system evaluates the pools in the order in which they are listed, until it finds a matching pool", + "type": "array", + "items": { + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to GSLB Pool declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "GSLB_Pool" + } + }, + "required": [ + "class" + ] + } + } + }, + "ratio": { + "title": "Ratio weight", + "description": "Ratio weight assigned to GSLB pool", + "type": "integer", + "default": 1 + } + }, + "additionalProperties": false, + "dependencies": { + "ratio": { + "minProperties": 2, + "maxProperties": 2 + }, + "use": { + "minProperties": 1, + "maxProperties": 2 + } + } + } + }, + "poolsCname": { + "title": "Pools Cname", + "description": "Specifies the cname pools this domain uses for load balancing. The system evaluates the pools in the order in which they are listed, until it finds a matching pool", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_GSLB_Pool" + } + }, + "poolLbMode": { + "title": "Pool Load Balancing Mode", + "description": "Specifies the load balancing method used to select a pool in this domain", + "type": "string", + "enum": [ + "global-availability", + "ratio", + "round-robin", + "topology" + ], + "default": "round-robin" + }, + "lastResortPool": { + "title": "Last Resort Pool", + "description": "Specifies the pools this domain uses for load balancing. The system evaluates the pools in the order in which they are listed, until it finds a matching pool", + "$ref": "#/definitions/Pointer_GSLB_Pool" + }, + "lastResortPoolType": { + "title": "Last Resort Pool type", + "description": "This is used to specify the type of pool being used for the lastResortPool", + "type": "string", + "enum": [ + "A", + "AAAA", + "CNAME", + "MX" + ] + }, + "iRules": { + "title": "iRules", + "description": "List of GSLB iRules for this GSLB Domain (order is significant)", + "type": "array", + "items": { + "title": "iRule", + "description": "BIG-IP AS3 pointer to GSLB_iRule (declared separately)", + "if": { + "type": "string" + }, + "then": { + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "GSLB_iRule" + } + }, + "required": [ + "class" + ] + } + } + }, + "else": { + "type": "object", + "properties": { + "bigip": { + "title": "BIG-IP GTM iRule", + "description": "Pathname of existing BIG-IP GTM iRule", + "type": "string", + "format": "f5bigip" + }, + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to GSLB_iRule (declared separately)", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "GSLB_iRule" + } + }, + "required": [ + "class" + ] + } + } + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query gtm rule" + ] + } + } + }, + "$comment": "uniqueItems: true" + }, + "persistenceEnabled": { + "title": "Persistence", + "description": "Specifies that when a local DNS server makes repetitive requests on behalf of a client, the system reconnects the client to the same resource as previous requests. Set to true to enable.", + "type": "boolean", + "default": false + }, + "persistCidrIpv4": { + "title": "PersistCidrIpv4", + "description": "Specifies a mask used to group IPv4 LDNS addresses.", + "type": "integer", + "minimum": 0, + "maximum": 32, + "default": 32 + }, + "persistCidrIpv6": { + "title": "PersistCidrIpv6", + "description": "Specifies a mask used to group IPv6 LDNS addresses.", + "type": "integer", + "minimum": 0, + "maximum": 128, + "default": 128 + }, + "ttlPersistence": { + "title": "TTL Persistence", + "description": "Specifies, in seconds, the length of time for which a persistence entry is valid.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 3600 + }, + "clientSubnetPreferred": { + "title": "Client Subnet Preferred", + "description": "Specifies that this domain should use the edns0 client subnet option when using topology load balancing. If the query does not contain a client subnet option, the system will fall back to the default option of using the source address.", + "type": "boolean", + "default": false, + "f5PostProcess": { + "tag": "minVersion", + "data": "14.1" + } + } + }, + "if": { + "properties": { + "pools": {} + }, + "required": [ + "pools" + ] + }, + "then": { + "not": { + "properties": { + "poolsCname": {} + }, + "required": [ + "poolsCname" + ] + } + }, + "required": [ + "resourceRecordType", + "domainName" + ] + }, + "GSLB_Domain_A": { + "description": "Configures GSLB (Global Server Load Balancing) settings for A domain.", + "allOf": [ + { + "$ref": "#/definitions/GSLB_Domain" + } + ] + }, + "GSLB_Domain_AAAA": { + "description": "Configures GSLB (Global Server Load Balancing) settings for AAAA domain.", + "allOf": [ + { + "$ref": "#/definitions/GSLB_Domain" + } + ] + }, + "GSLB_Domain_CNAME": { + "description": "Configures GSLB (Global Server Load Balancing) settings for CNAME domain.", + "allOf": [ + { + "$ref": "#/definitions/GSLB_Domain" + } + ] + }, + "GSLB_Domain_MX": { + "description": "Configures GSLB (Global Server Load Balancing) settings for MX domain.", + "allOf": [ + { + "$ref": "#/definitions/GSLB_Domain" + } + ] + }, + "GSLB_iRule": { + "title": "GSLB_iRule", + "description": "Specifies or configures an iRule for use in GSLB Domains", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "GSLB_iRule" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "expand": { + "title": "Expand", + "description": "If true (default), expand backquoted variables in iRule", + "type": "boolean", + "default": true + }, + "iRule": { + "$ref": "#/definitions/IRule_Core" + } + }, + "additionalProperties": false, + "required": [ + "class", + "iRule" + ] + }, + "GSLB_Monitor": { + "title": "GSLB_Monitor", + "description": "Declares a monitor that verifies the availability and/or performance status of a particular protocol, service, or application", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "GSLB_Monitor" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "monitorType": { + "title": "Monitor Type", + "description": "Specifies the type of monitor", + "type": "string", + "enum": [ + "http", + "https", + "gateway-icmp", + "tcp", + "udp", + "external" + ] + }, + "target": { + "title": "Target (Address:Port)", + "description": "Specifies the IP address and service port of the resource that is the destination of this monitor. Format is ip:port", + "type": "string", + "default": "*:*" + }, + "interval": { + "title": "Interval", + "description": "Specifies, in seconds, the frequency at which the system issues the monitor check when either the resource is down or the status of the resource is unknown", + "type": "integer", + "minimum": 0, + "maximum": 86399, + "default": 30 + }, + "timeout": { + "title": "Timeout", + "description": "Specifies the number of seconds the target has in which to respond to the monitor request", + "type": "integer", + "minimum": 0, + "maximum": 86400, + "default": 120 + }, + "probeTimeout": { + "title": "Probe Timeout", + "description": "Specifies the number of seconds after which the system times out the probe request to the system", + "type": "integer", + "minimum": 0, + "default": 5 + }, + "ignoreDownResponseEnabled": { + "title": "Ignore Down Response", + "description": "Specifies whether the monitor immediately marks an object down when it receives a down response. If enabled, the monitor ignores the down response for the duration of timeout. The default is false (disabled)", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "gtm" + ] + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "http" + } + } + }, + "then": { + "$ref": "#/definitions/GSLB_Monitor_HTTP" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "https" + } + } + }, + "then": { + "$ref": "#/definitions/GSLB_Monitor_HTTPS" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "gateway-icmp" + } + } + }, + "then": { + "$ref": "#/definitions/GSLB_Monitor_ICMP" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "udp" + } + } + }, + "then": { + "$ref": "#/definitions/GSLB_Monitor_UDP" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "tcp" + } + } + }, + "then": { + "$ref": "#/definitions/GSLB_Monitor_TCP" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "external" + } + } + }, + "then": { + "$ref": "#/definitions/GSLB_Monitor_External" + } + } + ], + "required": [ + "class", + "monitorType" + ] + }, + "GSLB_Monitor_External": { + "description": "Additional Monitor class properties available when monitorType = external", + "type": "object", + "properties": { + "pathname": { + "title": "pathname", + "description": "Tmsh object path name of an imported existing external monitor (e.g. /Common/arg_example)", + "type": "string", + "minLength": 2, + "f5PostProcess": { + "tag": "expand" + } + }, + "expand": { + "title": "Expand", + "description": "If true (default), expand backquoted variables in script", + "type": "boolean", + "default": true + }, + "script": { + "title": "External monitor script", + "description": "Bash(1) script which implements external monitor", + "allOf": [ + { + "$ref": "#/definitions/F5string" + }, + { + "f5PostProcess": { + "tag": "expand", + "data": { + "when": "1/expand" + } + } + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "string" + } + } + ] + }, + "arguments": { + "title": "Arguments", + "description": "Arguments to specified external monitor (will be backquote-expanded)", + "type": "string", + "default": "", + "f5PostProcess": { + "tag": "expand" + } + }, + "environmentVariables": { + "description": "Specifies user defined command line parameters that the external program requires.", + "type": "object", + "additionalProperties": { + "type": "string" + }, + "default": {} + } + }, + "oneOf": [ + { + "required": [ + "pathname" + ] + }, + { + "required": [ + "script" + ] + } + ] + }, + "GSLB_Monitor_HTTP": { + "description": "Additional Monitor class properties available when monitorType = http", + "type": "object", + "properties": { + "reverseEnabled": { + "title": "Reverse Enabled", + "description": "When enabled, a successful check marks the monitored object down instead of up. You can use the Reverse mode only if you configure both the send and receive options", + "type": "boolean", + "default": false + }, + "send": { + "title": "Send String", + "description": "Specifies the text string that the monitor sends to the target object. If you do not specify a value for both the send and receive options, the monitor performs a simple service check and connect only", + "type": "string", + "default": "HEAD / HTTP/1.0\\r\\n\\r\\n", + "f5PostProcess": { + "tag": "expand" + } + }, + "receive": { + "title": "Receive String", + "description": "Specifies the text string that the monitor looks for in the returned resource. If you do not specify a value for both the send and receive options, the monitor performs a simple service check and connect only", + "type": "string", + "default": "HTTP/1.", + "f5PostProcess": { + "tag": "expand" + } + }, + "transparent": { + "title": "Transparent", + "description": "Enables monitoring of pool members through firewalls. The default value is false (disabled)", + "type": "boolean", + "default": false + } + } + }, + "GSLB_Monitor_HTTPS": { + "description": "Additional Monitor class properties available when monitorType = https", + "type": "object", + "allOf": [ + { + "properties": { + "ciphers": { + "title": "Ciphers", + "description": "Ciphersuite selection string", + "type": "string", + "default": "DEFAULT" + }, + "clientCertificate": { + "title": "Client certificate", + "description": "BIG-IP AS3 pointer to client Certificate declaration, for TLS authentication (optional)", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Certificate" + } + }, + "required": [ + "class" + ] + } + } + } + } + }, + { + "$ref": "#/definitions/GSLB_Monitor_HTTP" + } + ] + }, + "GSLB_Monitor_ICMP": { + "description": "Additional Monitor class properties available when monitorType = gateway-icmp", + "type": "object", + "properties": { + "probeInterval": { + "title": "Probe Interval", + "description": "Specifies the frequency at which the BIG-IP system probes the host server", + "type": "integer", + "minimum": 0, + "default": 1 + }, + "probeAttempts": { + "title": "Probe Attempts", + "description": "Specifies the number of times the BIG-IP system attempts to probe the host server, after which the BIG-IP system considers the host server down or unavailable", + "type": "integer", + "minimum": 0, + "default": 3 + }, + "transparent": { + "title": "Transparent", + "description": "Enables monitoring of pool members through firewalls. The default value is false (disabled)", + "type": "boolean", + "default": false + } + } + }, + "GSLB_Monitor_TCP": { + "description": "Additional Monitor class properties available when monitorType = tcp", + "type": "object", + "properties": { + "reverseEnabled": { + "title": "Reverse Enabled", + "description": "When enabled, a successful check marks the monitored object down instead of up. You can use the Reverse mode only if you configure both the send and receive options", + "type": "boolean", + "default": false + }, + "send": { + "title": "Send String", + "description": "Specifies the text string that the monitor sends to the target object. If you do not specify a value for both the send and receive options, the monitor performs a simple service check and connect only", + "type": "string", + "default": "" + }, + "receive": { + "title": "Receive String", + "description": "Specifies the text string that the monitor looks for in the returned resource. If you do not specify a value for both the send and receive options, the monitor performs a simple service check and connect only", + "type": "string", + "default": "" + }, + "transparent": { + "title": "Transparent", + "description": "Enables monitoring of pool members through firewalls. The default value is false (disabled)", + "type": "boolean", + "default": false + } + } + }, + "GSLB_Monitor_UDP": { + "description": "Additional Monitor class properties available when monitorType = udp", + "type": "object", + "properties": { + "debugEnabled": { + "title": "Debug Enabled", + "description": "When enabled, the monitor sends error messages and additional information to a log file created and labeled specifically for this monitor. The default is false (disabled)", + "type": "boolean", + "default": false + }, + "probeAttempts": { + "title": "Probe Attempts", + "description": "Specifies the number of times the BIG-IP system attempts to probe the host server, after which the BIG-IP system considers the host server down or unavailable", + "type": "integer", + "minimum": 0, + "default": 3 + }, + "probeInterval": { + "title": "Probe Interval", + "description": "Specifies the frequency at which the BIG-IP system probes the host server", + "type": "integer", + "minimum": 0, + "default": 1 + }, + "reverseEnabled": { + "title": "Reverse Enabled", + "description": "When enabled, a successful check marks the monitored object down instead of up. You can use the Reverse mode only if you configure both the send and receive options", + "type": "boolean", + "default": false + }, + "send": { + "title": "Send String", + "description": "Specifies the text string that the monitor sends to the target object. If you do not specify a value for both the send and receive options, the monitor performs a simple service check and connect only", + "type": "string", + "default": "default send string" + }, + "receive": { + "title": "Receive String", + "description": "Specifies the text string that the monitor looks for in the returned resource. If you do not specify a value for both the send and receive options, the monitor performs a simple service check and connect only", + "type": "string", + "default": "" + }, + "transparent": { + "title": "Transparent", + "description": "Enables monitoring of pool members through firewalls. The default value is false (disabled)", + "type": "boolean", + "default": false + } + } + }, + "GSLB_Pool": { + "title": "GSLB_Pool", + "description": "Declares a pool to use for load balancing", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "GSLB_Pool" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "resourceRecordType": { + "title": "Resource Record (RR) Type", + "description": "Specifies the type of resource records for this domain", + "type": "string", + "enum": [ + "A", + "AAAA", + "CNAME", + "MX" + ] + }, + "enabled": { + "title": "Enabled", + "description": "Specifies whether the pool and its resources are available for load balancing", + "type": "boolean", + "default": true + }, + "lbModePreferred": { + "title": "Preferred LB Mode", + "description": "Preferred Load Balancing mode", + "type": "string", + "enum": [ + "completion-rate", + "cpu", + "drop-packet", + "fallback-ip", + "fewest-hops", + "global-availability", + "kilobytes-per-second", + "least-connections", + "lowest-round-trip-time", + "packet-rate", + "quality-of-service", + "ratio", + "return-to-dns", + "round-robin", + "static-persistence", + "topology", + "virtual-server-capacity", + "virtual-server-score" + ], + "default": "round-robin" + }, + "lbModeAlternate": { + "title": "Alternate LB Mode", + "description": "Alternate Load Balancing mode", + "type": "string", + "enum": [ + "drop-packet", + "fallback-ip", + "global-availability", + "packet-rate", + "ratio", + "return-to-dns", + "round-robin", + "static-persistence", + "topology", + "virtual-server-capacity", + "virtual-server-score", + "none" + ], + "default": "round-robin" + }, + "lbModeFallback": { + "title": "Fallback LB mode", + "description": "Fallback Load Balancing mode", + "type": "string", + "enum": [ + "completion-rate", + "cpu", + "drop-packet", + "fallback-ip", + "fewest-hops", + "global-availability", + "kilobytes-per-second", + "least-connections", + "lowest-round-trip-time", + "packet-rate", + "quality-of-service", + "ratio", + "return-to-dns", + "round-robin", + "static-persistence", + "topology", + "virtual-server-capacity", + "virtual-server-score", + "none" + ], + "default": "return-to-dns" + }, + "manualResumeEnabled": { + "title": "Manual Resume Enabled", + "description": "Specifies whether you must manually restart a pool member that goes down", + "type": "boolean", + "default": false + }, + "ttl": { + "title": "Time-to-Live (TTL)", + "description": "Specifies the number of seconds the IP address, once found, is valid. Once the time-to-live (TTL) expires, the client has to request the IP address resolution again ", + "type": "integer", + "default": 30, + "minimum": 0, + "maximum": 4294967295 + }, + "verifyMemberEnabled": { + "title": "Verify Member Availability Enabled", + "description": "Specifies the system verifies the availability of the pool members before sending a connection to those resources", + "type": "boolean", + "default": true + } + }, + "allOf": [ + { + "if": { + "properties": { + "resourceRecordType": { + "const": "MX" + } + } + }, + "then": { + "properties": { + "maxAnswersReturned": { + "title": "Maximum Number of Answers Returned", + "description": "Specifies the maximum number of available virtual servers that the system lists in a response", + "type": "integer", + "minimum": 1, + "default": 1, + "maximum": 500 + }, + "members": { + "title": "Members", + "description": "Specifies the members of this pool", + "type": "array", + "items": { + "$ref": "#/definitions/GSLB_Pool_Member_MX" + } + } + } + } + }, + { + "if": { + "properties": { + "resourceRecordType": { + "const": "CNAME" + } + } + }, + "then": { + "allOf": [ + { + "properties": { + "members": { + "title": "Members", + "description": "Specifies the members of this pool", + "type": "array", + "items": { + "$ref": "#/definitions/GSLB_Pool_Member_CNAME" + } + } + } + }, + { + "not": { + "required": [ + "maxAnswersReturned", + "monitors" + ] + } + } + ] + } + }, + { + "if": { + "properties": { + "resourceRecordType": { + "const": "A" + } + } + }, + "then": { + "properties": { + "maxAnswersReturned": { + "title": "Maximum Number of Answers Returned", + "description": "Specifies the maximum number of available virtual servers that the system lists in a response", + "type": "integer", + "minimum": 1, + "default": 1, + "maximum": 500 + }, + "members": { + "title": "Members", + "description": "Specifies the members of this pool", + "type": "array", + "items": { + "$ref": "#/definitions/GSLB_Pool_Member_A" + } + } + } + } + }, + { + "if": { + "properties": { + "resourceRecordType": { + "const": "AAAA" + } + } + }, + "then": { + "properties": { + "maxAnswersReturned": { + "title": "Maximum Number of Answers Returned", + "description": "Specifies the maximum number of available virtual servers the system lists in a response", + "type": "integer", + "minimum": 1, + "default": 1, + "maximum": 500 + }, + "members": { + "title": "Members", + "description": "Specifies the members of this pool", + "type": "array", + "items": { + "$ref": "#/definitions/GSLB_Pool_Member_AAAA" + } + } + } + } + }, + { + "if": { + "anyOf": [ + { + "properties": { + "resourceRecordType": { + "const": "A" + } + } + }, + { + "properties": { + "resourceRecordType": { + "const": "AAAA" + } + } + } + ] + }, + "then": { + "properties": { + "monitors": { + "title": "Monitors", + "description": "Specifies the health monitors the system uses to determine whether it can use this pool for load balancing", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_GSLB_Monitor" + } + }, + "fallbackIP": { + "title": "Fallback IP", + "description": "Specifies the IP address of the server to which the system directs requests when it cannot use one of its pools to do so. Note that the system uses the fallback IP only if you select a Fallback load balancing method", + "type": "string", + "format": "f5ip" + }, + "bpsLimit": { + "title": "Maximum Bits Per Second", + "description": "The maximum allowable data throughput rate, in bits per second, for the virtual servers in the pool. If the network traffic volume exceeds this value, the system marks the pool as unavailable", + "type": "integer", + "default": 0, + "minimum": 0 + }, + "bpsLimitEnabled": { + "title": "Maximum Bits Per Second - Limit Enabled", + "description": "Enables or disables the maximum Bits Per Second (BPS) option for this pool. The default value is false (disabled)", + "type": "boolean", + "default": false + }, + "ppsLimit": { + "title": "Maximum Packets Per Second", + "description": "The maximum allowable data transfer rate, in packets per second, for the virtual servers in the pool. If the network traffic volume exceeds this value, the system marks the pool as unavailable", + "type": "integer", + "default": 0, + "minimum": 0 + }, + "ppsLimitEnabled": { + "title": "Maximum Packets Per Second - Limit Enabled", + "description": "Enables or disables the maximum Packets Per Second (PPS) option for this pool. The default value is false (disabled)", + "type": "boolean", + "default": false + }, + "connectionsLimit": { + "title": "Maximum Current Connections Per Second", + "description": "The number of current connections allowed for the virtual servers in the pool. If the current connections exceed this value, the system marks the pool as unavailable", + "type": "integer", + "default": 0, + "minimum": 0 + }, + "connectionsLimitEnabled": { + "title": "Maximum Current Connections Per Second - Limit Enabled", + "description": "Enables or disables the maximum current connections option for this pool. The default value is false (disabled)", + "type": "boolean", + "default": false + } + } + } + }, + { + "if": { + "anyOf": [ + { + "properties": { + "lbModePreferred": { + "const": "quality-of-service" + } + } + }, + { + "properties": { + "lbModeFallback": { + "const": "quality-of-service" + } + } + } + ] + }, + "then": { + "properties": { + "qosHitRatio": { + "title": "Quality of Service (QOS) Hit Ratio", + "description": "Assigns a weight to the Hit Ratio performance factor for the Quality of Service dynamic load balancing mode", + "type": "integer", + "minimum": 0, + "default": 5 + }, + "qosHops": { + "title": "Quality of Service (QOS) Hops", + "description": "Assigns a weight to the Hops performance factor for the Quality of Service dynamic load balancing mode", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "qosKbps": { + "title": "Quality of Service (QOS) Kilobytes per Second (Kbps)", + "description": "Assigns a weight to the Kilobytes per Second performance factor for the Quality of Service dynamic load balancing mode", + "type": "integer", + "minimum": 0, + "default": 3 + }, + "qosLinkCapacity": { + "title": "Quality of Service (QOS) Link Capacity", + "description": "Assigns a weight to the Link Capacity performance factor for the Quality of Service dynamic load balancing mode", + "type": "integer", + "minimum": 0, + "default": 30 + }, + "qosPacketRate": { + "title": "Quality of Service (QOS) Packet Rate", + "description": "Assigns a weight to the Packet Rate performance factor for the Quality of Service dynamic load balancing mode", + "type": "integer", + "minimum": 0, + "default": 1 + }, + "qosRoundTripTime": { + "title": "Quality of Service (QOS) Round Trip Time", + "description": "Assigns a weight to the Round Trip Time performance factor for the Quality of Service dynamic load balancing mode", + "type": "integer", + "minimum": 0, + "default": 50 + }, + "qosTopology": { + "title": "Quality of Service (QOS) Topology", + "description": "Assigns a weight to the Topology performance factor for the Quality of Service dynamic load balancing mode", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "qosVirtualServerCapacity": { + "title": "Quality of Service (QOS) Virtual Server Capacity", + "description": "Assigns a weight to the Virtual Server performance factor for the Quality of Service dynamic load balancing mode", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "qosVirtualServerScore": { + "title": "Quality of Service (QOS) Virtual Server Score", + "description": "Assigns a weight to the Virtual Server Score performance factor for the Quality of Service dynamic load balancing mode", + "type": "integer", + "minimum": 0, + "default": 0 + } + } + } + } + ], + "required": [ + "class", + "resourceRecordType" + ] + }, + "GSLB_Pool_Member_A": { + "title": "GSLB A rrType Pool Member", + "description": "Declares member of the GSLB pool", + "type": "object", + "properties": { + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "server": { + "$ref": "#/definitions/Pointer_GSLB_Server" + }, + "virtualServer": { + "description": "Specifies that the Global Traffic Manager assigns connection requests to virtual servers based on a user-defined ranking system.", + "oneOf": [ + { + "type": "string" + }, + { + "$ref": "#/definitions/Pointer_Service" + } + ] + }, + "ratio": { + "title": "Ratio", + "description": "Specifies the ratio weight assigned to the pool member. This weight determines the frequency at which the pool member is selected for load balancing", + "type": "integer", + "default": 1, + "minimum": 0, + "maximum": 65535 + }, + "enabled": { + "title": "Enabled", + "description": "When true (default), the system can use the pool member and its resources for load balancing requests", + "type": "boolean", + "default": true + }, + "dependsOn": { + "description": "Specifies the name of the virtual server on which this pool member depends.", + "type": [ + "string", + "array" + ], + "oneOf": [ + { + "type": "string", + "const": "none" + }, + { + "type": "array", + "items": { + "type": "string", + "pattern": "^/Common/Shared/.*:.*" + } + } + ] + } + }, + "additionalProperties": false, + "required": [ + "server", + "virtualServer" + ] + }, + "GSLB_Pool_Member_AAAA": { + "title": "GSLB AAAA rrType Pool Member", + "description": "Declares member of the GSLB pool", + "type": "object", + "properties": { + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "server": { + "$ref": "#/definitions/Pointer_GSLB_Server" + }, + "virtualServer": { + "description": "Specifies that the Global Traffic Manager assigns connection requests to virtual servers based on a user-defined ranking system.", + "oneOf": [ + { + "type": "string" + }, + { + "$ref": "#/definitions/Pointer_Service" + } + ] + }, + "ratio": { + "title": "Ratio", + "description": "Specifies the ratio weight assigned to the pool member. This weight determines the frequency at which the pool member is selected for load balancing", + "type": "integer", + "default": 1, + "minimum": 0, + "maximum": 65535 + }, + "enabled": { + "title": "Enabled", + "description": "When true (default), the system can use the pool member and its resources for load balancing requests", + "type": "boolean", + "default": true + }, + "dependsOn": { + "description": "Specifies the name of the virtual server on which this pool member depends.", + "type": [ + "string", + "array" + ], + "oneOf": [ + { + "type": "string", + "const": "none" + }, + { + "type": "array", + "items": { + "type": "string", + "pattern": "^/Common/Shared/.*:.*" + } + } + ] + } + }, + "additionalProperties": false, + "required": [ + "server", + "virtualServer" + ] + }, + "GSLB_Pool_Member_CNAME": { + "title": "GSLB CNAME rrType Pool Member", + "description": "Declares member of the GSLB pool", + "type": "object", + "properties": { + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "ratio": { + "title": "Ratio", + "description": "Specifies the ratio weight assigned to the pool member. This weight determines the frequency at which the pool member is selected for load balancing", + "type": "integer", + "default": 1, + "minimum": 0, + "maximum": 65535 + }, + "enabled": { + "title": "Enabled", + "description": "When true (default), the system can use the pool member and its resources for load balancing requests", + "type": "boolean", + "default": true + }, + "domainName": { + "title": "Domain Name", + "description": "Specifies the domain name for this pool member", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/definitions/Pointer_GSLB_Domain_A" + }, + { + "$ref": "#/definitions/Pointer_GSLB_Domain_AAAA" + }, + { + "$ref": "#/definitions/Pointer_GSLB_Domain_CNAME" + }, + { + "$ref": "#/definitions/Pointer_GSLB_Domain_MX" + } + ] + }, + "isDomainNameStatic": { + "title": "Static DomainName/ Static Target", + "description": "Specifies that the member's name specifies a static domain name rather than a name linked to a domain defined on the system. This might be required if the target domainName is not owned by the organization or configured on the BIG-IP. One side-effect of using a static target is that the member is always considered available for load balancing. The default is (false) disabled", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false, + "required": [ + "domainName" + ] + }, + "GSLB_Pool_Member_MX": { + "title": "GSLB MX rrType Pool Member", + "description": "Declares member of the GSLB pool", + "type": "object", + "properties": { + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "enabled": { + "title": "Enabled", + "description": "When true (default), the system can use the pool member and its resources for load balancing requests", + "type": "boolean", + "default": true + }, + "domainName": { + "title": "Domain Name", + "description": "Specifies the domain name for this pool member", + "anyOf": [ + { + "$ref": "#/definitions/Pointer_GSLB_Domain_A" + }, + { + "$ref": "#/definitions/Pointer_GSLB_Domain_AAAA" + } + ] + }, + "priority": { + "title": "Priority", + "description": "Specifies the MX resource record priority", + "type": "integer", + "default": 10, + "minimum": 0, + "maximum": 65535 + }, + "ratio": { + "title": "Ratio", + "description": "Specifies the ratio weight assigned to the pool member. This weight determines the frequency at which the pool member is selected for load balancing", + "type": "integer", + "default": 1, + "minimum": 0, + "maximum": 65535 + } + }, + "additionalProperties": false, + "required": [ + "domainName" + ] + }, + "GSLB_Server": { + "title": "GSLB_Server", + "description": "Declares a GSLB server object which contains configuration for a load balancer or a host server", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "GSLB_Server" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "enabled": { + "title": "Enabled", + "description": "Specifies whether the server is enabled or disabled", + "type": "boolean", + "default": true + }, + "serverType": { + "title": "Server Type", + "description": "Specifies the server type. The server type determines the metrics that the system can collect from the server", + "type": "string", + "enum": [ + "bigip", + "generic-host" + ], + "default": "bigip" + }, + "proberPreferred": { + "title": "Prober Preferred", + "description": "Specifies the type of prober to use to monitor servers defined in this data center. The default value is inside-data-center. Note: Prober pools are not used by the bigip monitor", + "type": "string", + "enum": [ + "inherit", + "inside-datacenter", + "outside-datacenter", + "pool" + ], + "default": "inherit" + }, + "proberFallback": { + "title": "Prober Fallback", + "description": "Specifies the type of prober to use to monitor servers defined in this data center when the preferred type is not available. The default value is any-available", + "type": "string", + "enum": [ + "inherit", + "any-available", + "inside-datacenter", + "none", + "outside-datacenter", + "pool" + ], + "default": "inherit" + }, + "dataCenter": { + "$ref": "#/definitions/Pointer_GSLB_Data_Center" + }, + "devices": { + "title": "Device List", + "description": "Specifies the actual device(s) that are represented by this server object", + "type": "array", + "items": { + "$ref": "#/definitions/GSLB_Server_Device" + }, + "minItems": 1 + }, + "virtualServers": { + "title": "Virtual Server List", + "description": "Specifies the virtual server(s) that are resources on this server object", + "type": "array", + "items": { + "$ref": "#/definitions/GSLB_Virtual_Server" + } + }, + "virtualServerDiscoveryMode": { + "title": "Virtual Server Auto Discovery Mode", + "description": "Specifies virtual server auto-discovery settings. Use 'enabled' (add, modify, delete), 'enabled-no-delete' (add, modify) or the default 'disabled' (manual configuration)", + "type": "string", + "enum": [ + "disabled", + "enabled", + "enabled-no-delete" + ], + "default": "disabled" + }, + "exposeRouteDomainsEnabled": { + "title": "Expose Route Domains Enabled", + "description": "Allows virtual servers from all route domains to be auto-discovered. The default setting is false", + "type": "boolean", + "default": false + }, + "monitors": { + "title": "Monitor List", + "description": "Specifies the health monitors the system uses to determine whether it can use this server for load balancing", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_GSLB_Monitor" + }, + "default": [ + { + "bigip": "/Common/bigip" + } + ] + }, + "bpsLimit": { + "title": "Maximum Bits Per Second", + "description": "Specifies the maximum allowable data throughput rate, in bits per second, for the virtual servers on the server. If the network traffic volume exceeds this limit, the system marks the server as unavailable", + "type": "integer", + "default": 0, + "minimum": 0 + }, + "bpsLimitEnabled": { + "title": "Maximum Bits Per Second - Limit Enabled", + "description": "Enables or disables the maximum Bits Per Second (BPS) option for the virtual servers on the server. The default value is false (disabled)", + "type": "boolean", + "default": false + }, + "ppsLimit": { + "title": "Maximum Packets Per Second", + "description": "The maximum allowable data transfer rate, in packets per second, for the virtual servers on the server. If the network traffic volume exceeds this value, the system marks the server as unavailable", + "type": "integer", + "default": 0, + "minimum": 0 + }, + "ppsLimitEnabled": { + "title": "Maximum Packets Per Second - Limit Enabled", + "description": "Enables or disables the maximum Packets Per Second (PPS) option for the virtual servers on the server. The default value is false (disabled)", + "type": "boolean", + "default": false + }, + "connectionsLimit": { + "title": "Maximum Current Connections Per Second", + "description": "The number of current connections allowed for the virtual servers on the server. If the current connections exceed this value, the system marks the server as unavailable", + "type": "integer", + "default": 0, + "minimum": 0 + }, + "connectionsLimitEnabled": { + "title": "Maximum Current Connections Per Second - Limit Enabled", + "description": "Enables or disables the maximum current connections option for the virtual servers on the server. The default value is false (disabled)", + "type": "boolean", + "default": false + }, + "cpuUsageLimit": { + "title": "Maximum CPU Percent Usage", + "description": "Specifies the percent of CPU usage. If percent of CPU usage goes above the limit, the system marks the server as unavailable", + "type": "integer", + "minimum": 0 + }, + "cpuUsageLimitEnabled": { + "title": "Maximum CPU Percent Usage - Limit Enabled", + "description": "Enables or disables the CPU Usage limit option for this pool. The default value is false (disabled)", + "type": "boolean" + }, + "memoryLimit": { + "title": "Memory Available (KB)", + "description": "Specifies the available memory in kilobytes required by the virtual servers on the server. If available memory falls below this limit, the system marks the server as unavailable", + "type": "integer", + "minimum": 0 + }, + "memoryLimitEnabled": { + "title": "Memory Available - Limit Enabled", + "description": "Enables or disables the maximum Bits Per Second (BPS) option for this pool. The default value is false (disabled)", + "type": "boolean" + }, + "serviceCheckProbeEnabled": { + "title": "Path Probe - Enabled", + "description": "Specifies whether this BIG-IP device will be used to conduct a service check probe before traffic will be delegated to it. The default value is (true) enabled ", + "type": "boolean" + }, + "pathProbeEnabled": { + "title": "Service Check Probe - Enabled", + "description": "Specifies whether this BIG-IP device will be used to conduct a path probe before traffic will be delegated to it. The default value is (true) enabled ", + "type": "boolean" + }, + "snmpProbeEnabled": { + "title": "SNMP Probe - Enabled", + "description": "Specifies whether this BIG-IP device will be used to conduct a SNMP probe before traffic will be delegated to it. The default value is (true) enabled ", + "type": "boolean" + }, + "proberPool": { + "$ref": "#/definitions/Pointer_GSLB_Prober_Pool" + } + }, + "dependencies": { + "cpuUsageLimit": { + "properties": { + "serverType": { + "const": "generic-host" + } + } + }, + "cpuUsageLimitEnabled": { + "properties": { + "serverType": { + "const": "generic-host" + } + } + }, + "memoryLimit": { + "properties": { + "serverType": { + "const": "generic-host" + } + } + }, + "memoryLimitEnabled": { + "properties": { + "serverType": { + "const": "generic-host" + } + } + }, + "serviceCheckProbeEnabled": { + "properties": { + "serverType": { + "const": "bigip" + } + } + }, + "pathProbeEnabled": { + "properties": { + "serverType": { + "const": "bigip" + } + } + }, + "snmpProbeEnabled": { + "properties": { + "serverType": { + "const": "bigip" + } + } + }, + "proberPreferred": { + "if": { + "properties": { + "proberPreferred": { + "const": "pool" + } + } + }, + "then": { + "required": [ + "proberPool" + ] + } + }, + "proberFallback": { + "if": { + "properties": { + "proberFallback": { + "const": "pool" + } + } + }, + "then": { + "required": [ + "proberPool" + ] + } + } + }, + "allOf": [ + { + "if": { + "required": [ + "serverType" + ], + "properties": { + "serverType": { + "const": "generic-host" + } + } + }, + "then": { + "properties": { + "devices": { + "maxItems": 1 + }, + "cpuUsageLimit": { + "default": 0 + }, + "cpuUsageLimitEnabled": { + "default": false + }, + "memoryLimit": { + "default": 0 + }, + "memoryLimitEnabled": { + "default": false + } + } + } + }, + { + "if": { + "required": [ + "serverType" + ], + "properties": { + "serverType": { + "const": "bigip" + } + } + }, + "then": { + "properties": { + "serviceCheckProbeEnabled": { + "default": true + }, + "pathProbeEnabled": { + "default": true + }, + "snmpProbeEnabled": { + "default": true + } + } + } + } + ], + "required": [ + "class", + "dataCenter", + "devices" + ], + "additionalProperties": false + }, + "GSLB_Server_Device": { + "description": "Configures a device for the GSLB Server", + "type": "object", + "properties": { + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "address": { + "title": "Address", + "type": "string", + "description": " Specifies an external (public) address for the device. If BIG-IP DNS configuration synchronization is enabled and all existing addresses for a device are being replaced, new addresses should be added and synchronized before old addresses are removed, otherwise the changes may fail to synchronize. Alternatively, the address configuration changes can be performed on each BIG-IP DNS system", + "format": "f5ip" + }, + "addressTranslation": { + "title": "Address Translation", + "type": "string", + "description": "Specifies the internal (private) address that corresponds to the external address", + "format": "f5ip" + } + }, + "required": [ + "address" + ] + }, + "GSLB_Data_Center": { + "title": "GSLB_Data_Center", + "description": "Declares a GSLB Data Center configuration", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "GSLB_Data_Center" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "enabled": { + "title": "Enabled", + "description": "Specifies whether the data center is enabled or disabled", + "type": "boolean", + "default": true + }, + "location": { + "title": "Location", + "description": "Specifies the location of the data center", + "type": "string" + }, + "contact": { + "title": "Contact", + "description": "Specifies the name of the administrator or the name of the department that manages the data center", + "type": "string" + }, + "proberPreferred": { + "title": "Prober Preferred", + "description": "Specifies the type of prober to use to monitor servers defined in this data center. The default value is inside-data-center. Note: Prober pools are not used by the bigip monitor", + "type": "string", + "enum": [ + "inside-datacenter", + "outside-datacenter", + "pool" + ], + "default": "inside-datacenter" + }, + "proberFallback": { + "title": "Prober Fallback", + "description": "Specifies the type of prober to use to monitor servers defined in this data center when the preferred type is not available. The default value is any-available", + "type": "string", + "enum": [ + "any-available", + "inside-datacenter", + "none", + "outside-datacenter", + "pool" + ], + "default": "any-available" + }, + "proberPool": { + "$ref": "#/definitions/Pointer_GSLB_Prober_Pool" + } + }, + "dependencies": { + "proberPool": { + "anyOf": [ + { + "properties": { + "proberPreferred": { + "const": "pool" + } + } + }, + { + "properties": { + "proberFallback": { + "const": "pool" + } + } + } + ] + } + }, + "additionalProperties": false, + "required": [ + "class" + ] + }, + "GSLB_Virtual_Server": { + "title": "GSLB virtual server", + "description": "GSLB virtual server", + "type": "object", + "properties": { + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "enabled": { + "title": "Enabled", + "description": "Specifies whether the virtual server is enabled or disabled", + "type": "boolean", + "default": true + }, + "port": { + "title": "Port", + "description": "L4 port for service (like 443 for HTTPS)", + "type": "integer", + "minimum": 0, + "maximum": 65535 + }, + "address": { + "title": "Address", + "description": "Format of address for virtual server (such as IPv4)", + "type": "string", + "format": "f5ip" + }, + "addressTranslation": { + "title": "Address Translation", + "description": "Specifies the public address that this virtual server translates into when the GSLB provider communicates between the network and the Internet. The default value is disabled", + "type": "string", + "format": "f5ip" + }, + "addressTranslationPort": { + "title": "Address Translation Port", + "description": "L4 port for service (like 443 for HTTPS)", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 0 + }, + "monitors": { + "title": "Monitors", + "description": "Specifies the health monitors that the system uses to determine whether it can use this linked virtual server for load balancing", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_GSLB_Monitor" + } + }, + "name": { + "title": "Name", + "description": "Specifies the name of the Virtual Server", + "type": "string" + } + }, + "required": [ + "address", + "port" + ], + "additionalProperties": false + }, + "GSLB_Prober_Pool": { + "title": "GSLB_Prober_Pool", + "description": "Declares a pool of BIG-IP devices that will monitor server resources for health and performance. Note: Prober pools are not used by the bigip monitor", + "f5PostProcess": { + "tag": "modules", + "data": [ + "gtm" + ] + }, + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "GSLB_Prober_Pool" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "enabled": { + "title": "Enabled", + "description": "Specifies whether this pool is available for conducting probes", + "type": "boolean", + "default": true + }, + "lbMode": { + "title": "Load Balancing Mode", + "description": "Specifies the load balancing mode the system uses to select the members of this pool", + "type": "string", + "enum": [ + "global-availability", + "round-robin" + ] + }, + "members": { + "title": "Members", + "description": "Specifies the members of the prober pool", + "type": "array", + "items": { + "$ref": "#/definitions/GSLB_Prober_Pool_Member" + } + } + } + }, + "GSLB_Prober_Pool_Member": { + "title": "GSLB Prober Pool Member", + "description": "Declares member of the GSLB prober pool", + "type": "object", + "properties": { + "enabled": { + "title": "Prober Pool Member Enabled", + "description": "Specifies whether the server can be used as a member of a prober pool", + "type": "boolean", + "default": true + }, + "memberOrder": { + "title": "Prober Pool Member Order", + "description": "Specifies the order in which this server appears in the prober pool", + "type": "integer", + "default": 0, + "minimum": 0, + "maximum": 65535 + } + } + }, + "GSLB_Topology_Records": { + "title": "GSLB_Topology_Records", + "description": "Defines GSLB Topology records", + "type": "object", + "properties": { + "label": { + "$ref": "#/definitions/Label" + }, + "class": { + "title": "Class", + "type": "string", + "const": "GSLB_Topology_Records" + }, + "longestMatchEnabled": { + "title": "Longest Match Algorithm Enabled", + "description": "Enables the algorithm that requires the system to evaluate all records in the topology statement and use the record that most completely matches the source IP address of the name resolution request. If true, the order of the records as they appear in the array will not be preserved", + "type": "boolean", + "default": true + }, + "records": { + "title": "Record List", + "description": "Specifies the actual device(s) that are represented by this server object", + "type": "array", + "items": { + "$ref": "#/definitions/GSLB_Topology_Record" + }, + "minItems": 1 + } + }, + "required": [ + "class", + "records" + ] + }, + "GSLB_Topology_Record": { + "type": "object", + "properties": { + "source": { + "title": "Request Source", + "description": "Specifies the origination section of the topology record, the local DNS", + "allOf": [ + { + "$ref": "#/definitions/GSLB_Topology_Condition" + } + ] + }, + "destination": { + "title": "Request Destination", + "description": "Specifies where the system directs the incoming DNS request", + "allOf": [ + { + "$ref": "#/definitions/GSLB_Topology_Condition" + } + ] + }, + "weight": { + "title": "Record Weight", + "description": "Specifies the weight for the topology record. The system load balances to the server object and DNS that matches the record with the highest topology weight", + "type": "integer", + "default": 1, + "minimum": 0, + "maximum": 4294967295 + } + }, + "allOf": [ + { + "not": { + "properties": { + "source": { + "properties": { + "matchType": { + "const": "pool" + } + } + } + } + } + }, + { + "not": { + "properties": { + "source": { + "properties": { + "matchType": { + "const": "datacenter" + } + } + } + } + } + } + ], + "required": [ + "source", + "destination" + ] + }, + "GSLB_Topology_Region": { + "title": "GSLB_Topology_Region", + "description": "Defines a GSLB Topology region", + "type": "object", + "properties": { + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "class": { + "title": "Class", + "type": "string", + "const": "GSLB_Topology_Region" + }, + "members": { + "title": "Region Member List", + "description": "Configures the list of members for this region", + "type": "array", + "items": { + "$ref": "#/definitions/GSLB_Topology_Condition" + } + } + }, + "required": [ + "class" + ] + }, + "GSLB_Topology_Condition": { + "type": "object", + "properties": { + "matchType": { + "title": "Match Type", + "description": "Specifies the type/category of match to perform", + "type": "string", + "enum": [ + "continent", + "country", + "datacenter", + "geoip-isp", + "isp", + "pool", + "region", + "state", + "subnet" + ] + }, + "matchOperator": { + "title": "Match Operator", + "description": "Specifies the operation to perform a match. Default value is equals (matches)", + "type": "string", + "enum": [ + "equals", + "not-equals" + ], + "default": "equals" + }, + "matchValue": { + "title": "Match Value", + "description": "Specifies the value to match", + "type": [ + "string", + "object" + ] + } + }, + "allOf": [ + { + "if": { + "properties": { + "matchType": { + "const": "continent" + } + } + }, + "then": { + "properties": { + "matchValue": { + "$ref": "#/definitions/Enum_Continent_Code_Alpha_2" + } + } + } + }, + { + "if": { + "properties": { + "matchType": { + "const": "country" + } + } + }, + "then": { + "properties": { + "matchValue": { + "$ref": "#/definitions/Enum_Country_Code_Alpha_2" + } + } + } + }, + { + "if": { + "properties": { + "matchType": { + "const": "datacenter" + } + } + }, + "then": { + "properties": { + "matchValue": { + "$ref": "#/definitions/Pointer_GSLB_Data_Center" + } + } + } + }, + { + "if": { + "properties": { + "matchType": { + "const": "geoip-isp" + } + } + }, + "then": { + "properties": { + "matchValue": { + "type": "string" + } + } + } + }, + { + "if": { + "properties": { + "matchType": { + "const": "isp" + } + } + }, + "then": { + "properties": { + "matchValue": { + "$ref": "#/definitions/Enum_ISP" + } + } + } + }, + { + "if": { + "properties": { + "matchType": { + "const": "pool" + } + } + }, + "then": { + "properties": { + "matchValue": { + "$ref": "#/definitions/Pointer_GSLB_Pool" + } + } + } + }, + { + "if": { + "properties": { + "matchType": { + "const": "region" + } + } + }, + "then": { + "properties": { + "matchValue": { + "$ref": "#/definitions/Pointer_GSLB_Topology_Region" + } + } + } + }, + { + "if": { + "properties": { + "matchType": { + "const": "state" + } + } + }, + "then": { + "properties": { + "matchValue": { + "description": "State value in the format /, for example: US/Washington", + "type": "string", + "minLength": 4 + } + } + } + }, + { + "if": { + "properties": { + "matchType": { + "const": "subnet" + } + } + }, + "then": { + "properties": { + "matchValue": { + "type": "string", + "format": "f5ip" + } + } + } + } + ], + "required": [ + "matchType", + "matchValue" + ] + }, + "GSLB_Pool_A": { + "description": "Pointer to a Pool A object", + "allOf": [ + { + "$ref": "#/definitions/GSLB_Pool" + } + ] + }, + "GSLB_Pool_AAAA": { + "description": "Pointer to a Pool AAAA object", + "allOf": [ + { + "$ref": "#/definitions/GSLB_Pool" + } + ] + }, + "GSLB_Pool_CNAME": { + "description": "Pointer to a Pool CNAME object", + "allOf": [ + { + "$ref": "#/definitions/GSLB_Pool" + } + ] + }, + "GSLB_Pool_MX": { + "description": "Pointer to a Pool MX object", + "allOf": [ + { + "$ref": "#/definitions/GSLB_Pool" + } + ] + }, + "ALG_Log_Profile": { + "type": "object", + "title": "ALG_Log_Profile", + "description": "Configures an application layer gateway log profle", + "f5PostProcess": { + "tag": "modules", + "data": [ + "cgnat" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "ALG_Log_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "csvFormat": { + "description": "Generate entries in comma-separated-values (csv) format", + "type": "boolean", + "default": false + }, + "startControlChannel": { + "description": "Event for start of control channel connection", + "type": "object", + "properties": { + "action": { + "description": "Specify the logging action to be taken when a particular event is encountered. If 'enabled' logging is enabled for the event, regardless of how the flow is created. If 'disabled' logging is disabled for the event. If 'backup-allocation-only' logging is enabled for the event when the ALG is proxy with a LSN, and translation is taken from the backup pool member only.", + "type": "string", + "enum": [ + "enabled", + "disabled", + "backup-allocation-only" + ], + "default": "disabled" + }, + "includeDestination": { + "description": "Include destination address/port in the log message", + "type": "boolean", + "default": false + } + }, + "default": { + "action": "disabled", + "includeDestination": false + }, + "additionalProperties": false + }, + "endControlChannel": { + "description": "Event for end of control channel connection", + "type": "object", + "properties": { + "action": { + "description": "Specify the logging action to be taken when a particular event is encountered. If 'enabled' logging is enabled for the event, regardless of how the flow is created. If 'disabled' logging is disabled for the event. If 'backup-allocation-only' logging is enabled for the event when the ALG is proxy with a LSN, and translation is taken from the backup pool member only.", + "type": "string", + "enum": [ + "enabled", + "disabled", + "backup-allocation-only" + ], + "default": "enabled" + }, + "includeDestination": { + "description": "Include destination address/port in the log message", + "type": "boolean", + "default": false + } + }, + "default": { + "action": "enabled", + "includeDestination": false + }, + "additionalProperties": false + }, + "startDataChannel": { + "description": "Event for start of data channel connection", + "type": "object", + "properties": { + "action": { + "description": "Specify the logging action to be taken when a particular event is encountered. If 'enabled' logging is enabled for the event, regardless of how the flow is created. If 'disabled' logging is disabled for the event. If 'backup-allocation-only' logging is enabled for the event when the ALG is proxy with a LSN, and translation is taken from the backup pool member only.", + "type": "string", + "enum": [ + "enabled", + "disabled", + "backup-allocation-only" + ], + "default": "disabled" + }, + "includeDestination": { + "description": "Include destination address/port in the log message", + "type": "boolean", + "default": false + } + }, + "default": { + "action": "disabled", + "includeDestination": false + }, + "additionalProperties": false + }, + "endDataChannel": { + "description": "Event for end of data channel connection", + "type": "object", + "properties": { + "action": { + "description": "Specify the logging action to be taken when a particular event is encountered. If 'enabled' logging is enabled for the event, regardless of how the flow is created. If 'disabled' logging is disabled for the event. If 'backup-allocation-only' logging is enabled for the event when the ALG is proxy with a LSN, and translation is taken from the backup pool member only.", + "type": "string", + "enum": [ + "enabled", + "disabled", + "backup-allocation-only" + ], + "default": "enabled" + }, + "includeDestination": { + "description": "Include destination address/port in the log message", + "type": "boolean", + "default": false + } + }, + "default": { + "action": "enabled", + "includeDestination": false + }, + "additionalProperties": false + }, + "inboundTransaction": { + "description": "Generates event log entries of SIP messages. Triggered by inbound connection to the BIG-IP system", + "type": "object", + "properties": { + "action": { + "description": "Specify the logging action to be taken when a particular event is encountered. If 'enabled' logging is enabled for the event, regardless of how the flow is created. If 'disabled' logging is disabled for the event. Inbound transaction log entry could contain both incoming and outgoing messages.", + "type": "string", + "enum": [ + "enabled", + "disabled" + ], + "default": "disabled" + } + }, + "default": { + "action": "disabled" + } + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "Security_Log_Profile": { + "type": "object", + "title": "Security_Log_Profile", + "description": "Configures a Security log profile", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm", + "asm" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Security_Log_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "application": { + "$ref": "#/definitions/Security_Log_Profile_Application" + }, + "botDefense": { + "$ref": "#/definitions/Security_Log_Profile_Bot_Defense" + }, + "classification": { + "$ref": "#/definitions/Security_Log_Profile_Classification" + }, + "dosApplication": { + "$ref": "#/definitions/Security_Log_Profile_Dos_Application" + }, + "dosNetwork": { + "$ref": "#/definitions/Security_Log_Profile_Dos_Network" + }, + "ipIntelligence": { + "$ref": "#/definitions/Security_Log_Profile_Ip_Intelligence" + }, + "nat": { + "$ref": "#/definitions/Security_Log_Profile_Nat" + }, + "network": { + "$ref": "#/definitions/Security_Log_Profile_Network" + }, + "protocolDns": { + "$ref": "#/definitions/Security_Log_Profile_Protocol_Dns" + }, + "protocolDnsDos": { + "$ref": "#/definitions/Security_Log_Profile_Protocol_Dns_Dos" + }, + "protocolInspection": { + "$ref": "#/definitions/Security_Log_Profile_Protocol_Inspection" + }, + "protocolSip": { + "$ref": "#/definitions/Security_Log_Profile_Protocol_Sip" + }, + "protocolSipDos": { + "$ref": "#/definitions/Security_Log_Profile_Protocol_Sip_Dos" + }, + "protocolTransfer": { + "$ref": "#/definitions/Security_Log_Profile_Protocol_Transfer" + }, + "sshProxy": { + "$ref": "#/definitions/Security_Log_Profile_Ssh_Proxy" + } + }, + "required": [ + "class" + ], + "dependencies": { + "application": { + "not": { + "oneOf": [ + { + "required": [ + "protocolDns" + ] + }, + { + "required": [ + "protocolSip" + ] + }, + { + "required": [ + "sshProxy" + ] + } + ] + } + }, + "protocolDns": { + "not": { + "required": [ + "application" + ] + } + }, + "protocolSip": { + "not": { + "required": [ + "application" + ] + } + }, + "sshProxy": { + "not": { + "required": [ + "application" + ] + } + } + } + }, + "Security_Log_Profile_Application": { + "description": "When enabled, specifies the system logs events from applications.", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "asm" + ] + }, + "properties": { + "facility": { + "description": "Specifies the facility category of the logged traffic", + "type": "string", + "enum": [ + "local0", + "local1", + "local2", + "local3", + "local4", + "local5", + "local6", + "local7" + ], + "default": "local0" + }, + "storageFilter": { + "description": "Adds, deletes, or replaces a set of request filters", + "type": "object", + "properties": { + "logicalOperation": { + "description": "Specifies the logical operation on associated filters", + "type": "string", + "enum": [ + "and", + "or" + ], + "default": "or" + }, + "requestType": { + "description": "Specifies which kind of requests the system or server will log", + "type": "string", + "enum": [ + "all", + "illegal", + "illegal-including-staged-signatures" + ], + "default": "illegal" + }, + "protocols": { + "description": "Specifies if request logging is dependent on the protocols", + "type": "array", + "items": { + "type": "string", + "enum": [ + "http", + "https", + "ws", + "wss" + ] + } + }, + "responseCodes": { + "description": "Specifies whether request logging is dependent on the response status codes", + "type": "array", + "items": { + "type": "string", + "enum": [ + "100", + "101", + "102", + "200", + "201", + "202", + "203", + "204", + "205", + "206", + "207", + "300", + "301", + "302", + "303", + "304", + "305", + "306", + "307", + "400", + "401", + "402", + "403", + "404", + "405", + "406", + "407", + "408", + "409", + "410", + "411", + "412", + "413", + "414", + "415", + "416", + "417", + "422", + "423", + "424", + "500", + "501", + "502", + "503", + "504", + "505", + "507", + "510" + ] + } + }, + "httpMethods": { + "description": "Specifies whether request logging is dependent on the HTTP methods", + "type": "array", + "items": { + "type": "string", + "enum": [ + "ACL", + "BDELETE", + "BMOVE", + "BPROPFIND", + "BPROPPATCH", + "CHECKIN", + "CHECKOUT", + "CONNECT", + "COPY", + "DELETE", + "GET", + "HEAD", + "LINK", + "LOCK", + "MERGE", + "MKCOL", + "MKWORKSPACE", + "MOVE", + "NOTIFY", + "OPTIONS", + "PATCH", + "POLL", + "POST", + "PROPFIND", + "PROPPATCH", + "PUT", + "REPORT", + "RPC_IN_DATA", + "RPC_OUT_DATA", + "SEARCH", + "SUBSCRIBE", + "TRACE", + "TRACK", + "UNLINK", + "UNLOCK", + "UNSUBSCRIBE", + "VERSION_CONTROL", + "X-MS-ENUMATTS" + ] + } + }, + "requestContains": { + "description": "Specifies whether the request logging is dependent on s specific string and where to look for that string", + "type": "object", + "properties": { + "searchIn": { + "description": "Where to look for the specified string", + "type": "string", + "enum": [ + "search-in-headers", + "search-in-post-data", + "search-in-query-string", + "search-in-request", + "search-in-uri" + ] + }, + "value": { + "description": "The specified string to look for", + "type": "string", + "minLength": 1 + } + }, + "required": [ + "searchIn", + "value" + ], + "additionalProperties": false + }, + "loginResults": { + "description": "Specifies whether the request logging is dependent on the login results", + "type": "array", + "items": { + "type": "string", + "enum": [ + "login-result-successful", + "login-result-failed", + "login-result-unknown" + ] + } + } + }, + "default": {}, + "additionalProperties": false + }, + "storageFormat": { + "description": "Specifies a storage format", + "anyOf": [ + { + "description": "Specifies a user string", + "type": "string", + "minLength": 1 + }, + { + "type": "object", + "properties": { + "fields": { + "description": "Replaces a set of fields when predefined storage format. Order is important - the server will display the selected items in the log sequentially according to this", + "type": "array", + "items": { + "type": "string", + "enum": [ + "attack_type", + "avr_id", + "blocking_exception_reason", + "captcha_result", + "client_type", + "date_time", + "dest_ip", + "dest_port", + "device_id", + "fragment", + "geo_location", + "headers", + "http_class_name", + "ip_address_intelligence", + "ip_client", + "ip_with_route_domain", + "is_truncated", + "logic_result", + "management_ip_address", + "management_ip_address_2", + "method", + "mobile_application_name", + "mobile_application_version", + "password", + "policy_apply_date", + "policy_name", + "protocol", + "query_string", + "request", + "request_status", + "response", + "response_code", + "route_domain", + "salt", + "session_id", + "severity", + "sig_ids", + "sig_names", + "sig_set_names", + "slot_number", + "src_port", + "staged_sig_names", + "staged_sig_set_names", + "staged_threat_campaign_names", + "sub_violations", + "support_id", + "threat_campaign_names", + "unit_hostname", + "uri", + "username", + "violation_details", + "violation_rating", + "violations", + "virus_name", + "websocket_direction", + "websocket_message_type", + "x_forwarded_for_header_value" + ] + } + }, + "delimiter": { + "description": "Specifies a delimiter when predefined storage format", + "type": "string", + "default": ",", + "minLength": 1 + } + }, + "required": [ + "fields" + ], + "additionalProperties": false + } + ] + }, + "guaranteeLoggingEnabled": { + "description": "Indicates whether to guarantee local logging", + "type": "boolean", + "default": false + }, + "guaranteeResponseLoggingEnabled": { + "description": "Indicates whether to guarantee local response logging. guaranteeLoggingEnabled must be true and responseLogging must be illegal or all", + "type": "boolean", + "default": false + }, + "localStorage": { + "description": "Enables or disabled local storage", + "type": "boolean", + "default": true + }, + "maxEntryLength": { + "description": "Specifies the maximum entry length", + "type": "string", + "enum": [ + "1k", + "2k", + "10k", + "64k" + ], + "default": "2k" + }, + "maxHeaderSize": { + "description": "Specifies the maximum headers size", + "type": "integer", + "minimum": 1, + "maximum": 2048 + }, + "maxQuerySize": { + "description": "Specifies the maximum query string size", + "type": "integer", + "minimum": 1, + "maximum": 2048 + }, + "maxRequestSize": { + "description": "Specifies the maximum request size", + "type": "integer", + "minimum": 1, + "maximum": 2048 + }, + "protocol": { + "description": "Specifies the protocol supported by the remote server", + "type": "string", + "enum": [ + "udp", + "tcp", + "tcp-rfc3195" + ], + "default": "tcp" + }, + "remoteStorage": { + "description": "Specifies a remote storage type", + "type": "string", + "enum": [ + "remote", + "splunk", + "arcsight", + "bigiq" + ] + }, + "reportAnomaliesEnabled": { + "description": "Indicates whether to report detected anomalies", + "type": "boolean", + "default": false + }, + "responseLogging": { + "description": "Specifies a response logging type", + "type": "string", + "enum": [ + "none", + "illegal", + "all" + ], + "default": "none" + }, + "servers": { + "description": "Adds, deletes, or replaces a set of remote servers", + "type": "array", + "items": { + "type": "object", + "properties": { + "address": { + "description": "The IP address", + "type": "string" + }, + "port": { + "description": "The service port", + "type": "string" + } + }, + "required": [ + "address", + "port" + ], + "additionalProperties": false + } + } + }, + "additionalProperties": false + }, + "Security_Log_Profile_Bot_Defense": { + "title": "Bot Defense Log Profile", + "description": "Specifies, when enabled, the system logs events from the Proactive Bot Defense mechanism.", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "asm" + ] + }, + "properties": { + "localPublisher": { + "description": "Specifies, when enabled, a Log Publisher to log events to (Note: This publisher should have a single local-database destination)", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Log_Publisher" + } + ] + }, + "remotePublisher": { + "description": "Enables selecting a Log Publisher that has Splunk enabled", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Log_Publisher" + } + ] + }, + "logBotSignatureMatchedRequests": { + "description": "This option enables or disables the logging of reported bot signature requests", + "type": "boolean", + "default": false + }, + "logCaptchaChallengedRequests": { + "description": "This option enables or disables the logging of captcha challenged requests", + "type": "boolean", + "default": false + }, + "logChallengedRequests": { + "description": "This option enables or disables the logging of challenged requests", + "type": "boolean", + "default": false + }, + "logIllegalRequests": { + "description": "This option enables or disables the logging of illegal requests", + "type": "boolean", + "default": true + }, + "logLegalRequests": { + "description": "This option enables or disables the logging of legal requests", + "type": "boolean", + "default": false + }, + "logAlarm": { + "description": "This option enables or disables the logging of requests with alarm mitigation. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + }, + "logBlock": { + "description": "This option enables or disables the logging of requests with block mitigation. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + }, + "logBrowser": { + "description": "This option enables or disables the logging of requests with browser classification. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + }, + "logBrowserVerificationAction": { + "description": "This option enables or disables the logging of requests by browser verification action. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + }, + "logCaptcha": { + "description": "This option enables or disables the logging of requests with captcha mitigation. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + }, + "logDeviceIdCollectionRequest": { + "description": "This option enables or disables the logging of requests by device ID collection. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + }, + "logMaliciousBot": { + "description": "This option enables or disables the logging of requests with malicious bot classification. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + }, + "logMobileApplication": { + "description": "This option enables or disables the logging of requests with mobile application classification. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + }, + "logNone": { + "description": "This option enables or disables the logging of requests with no mitigation. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + }, + "logRateLimit": { + "description": "This option enables or disables the logging of requests with rate limit mitigation. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + }, + "logSuspiciousBrowser": { + "description": "This option enables or disables the logging of requests with suspicious browser classification. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + }, + "logTcpReset": { + "description": "This option enables or disables the logging of requests with TCP reset mitigation. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + }, + "logTrustedBot": { + "description": "This option enables or disables the logging of requests with trusted bot classification. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + }, + "logUnknown": { + "description": "This option enables or disables the logging of requests with unknown classification. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": true + }, + "logUntrustedBot": { + "description": "This option enables or disables the logging of requests with untrusted bot classification. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + }, + "logHoneyPotPage": { + "description": "This option enables or disables the logging of requests with honey pot page mitigation. This property is available on BIGIP 15.0 and above.", + "type": "boolean", + "default": false + }, + "logRedirectToPool": { + "description": "This option enables or disables the logging of requests with redirect to pool mitigation. This property is available on BIGIP 15.0 and above.", + "type": "boolean", + "default": false + }, + "logChallengeFailureRequest": { + "description": "This option enables or disables the logging of requests by challenge failure. This property is available on BIGIP 15.0 and above.", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + }, + "Security_Log_Profile_Classification": { + "title": "Classification Log Profile", + "description": "Specifies, when enabled, that the system logs events from the Classification engine.", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + }, + "properties": { + "publisher": { + "description": "Specifies where the system sends log messages", + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to log publisher declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Log_Publisher" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP log publisher", + "description": "Pathname of existing BIG-IP log publisher", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys log-config publisher" + ] + } + }, + "logAllMatches": { + "description": "This option enables or disables the logging of all matches", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + }, + "Security_Log_Profile_Dos_Application": { + "title": "DoS Application Log Profile", + "description": "Specifies, when enabled, that the system logs detected application DoS attacks", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "asm" + ] + }, + "properties": { + "localPublisher": { + "description": "Specifies the local log publisher used for Application DoS attacks (Note: This publisher should have a single local-database destination)", + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to log publisher declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Log_Publisher" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP log publisher", + "description": "Pathname of existing BIG-IP log publisher", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys log-config publisher" + ] + } + }, + "remotePublisher": { + "description": "Specifies the remote log publisher used for Application DoS attacks (Note: This publisher should have ArcSight or Splunk destinations)", + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to log publisher declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Log_Publisher" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP log publisher", + "description": "Pathname of existing BIG-IP log publisher", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys log-config publisher" + ] + } + } + }, + "additionalProperties": false + }, + "Security_Log_Profile_Dos_Network": { + "title": "DoS Network Log Profile", + "description": "Specifies, when enabled, that the system logs detected network DoS attacks", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm", + "dos", + "em" + ] + }, + "properties": { + "publisher": { + "description": "Specifies the name of the log publisher used for logging Network DoS events", + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to log publisher declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Log_Publisher" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP log publisher", + "description": "Pathname of existing BIG-IP log publisher", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys log-config publisher" + ] + } + } + }, + "additionalProperties": false + }, + "Security_Log_Profile_Nat": { + "title": "Network Address Translation Log Profile", + "description": "Specifies, when enabled, that the system logs Firewall NAT events", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + }, + "properties": { + "publisher": { + "description": "Specifies the name of the log publisher used for logging Network Address Translation events", + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to log publisher declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Log_Publisher" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP log publisher", + "description": "Pathname of existing BIG-IP log publisher", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys log-config publisher" + ] + } + }, + "logErrors": { + "description": "Generates event log entries when a NAT translation errors occur", + "type": "boolean", + "default": false + }, + "logSubscriberId": { + "description": "Logs the subscriber ID associated with a subscriber IP address", + "type": "boolean", + "default": false + }, + "logQuotaExceeded": { + "description": "Generates event log entries when a NAT client exceeds allocated resources", + "type": "boolean", + "default": false + }, + "logStartInboundSession": { + "description": "Generates event log entries at the start of the incoming connection event for a translated endpoint. Triggered when the system creates the inbound session.", + "type": "boolean", + "default": false + }, + "logEndInboundSession": { + "description": "Generates event log entries at the end of the incoming connection event for a translated endpoint. Triggered when the system frees the inbound session.", + "type": "boolean", + "default": false + }, + "logStartOutboundSession": { + "description": "Generates event log entries at start of the translation event for a NAT client. Triggered when the system creates the outbound session.", + "type": "boolean", + "default": false + }, + "logStartOutboundSessionDestination": { + "description": "Include destination address and port with log entry for the start of the translation event for a NAT client. This is applicable only if lsn-legacy-mode is enabled", + "type": "boolean", + "default": false + }, + "logEndOutboundSession": { + "description": "Generates event log entries at end of translation event for a NAT client. Triggered when the system frees the outbound session.", + "type": "boolean", + "default": false + }, + "logEndOutboundSessionDestination": { + "description": "Include destination address and port with log entry for the end of the translation event for a NAT client. This is applicable only if lsn-legacy-mode is enabled", + "type": "boolean", + "default": false + }, + "lsnLegacyMode": { + "description": "This option specifies whether translation events (and other NAT events) are logged in existing CGNAT/LSN formats (for backward compatibility with LSN events).", + "type": "boolean", + "default": false + }, + "rateLimitAggregate": { + "description": " This option sets the aggregate rate for all the Firewall NAT log events that the system can log per second", + "type": "integer", + "default": 4294967295 + }, + "rateLimitErrors": { + "description": "This option rate limits the errors the system logs per second", + "type": "integer", + "default": 4294967295 + }, + "rateLimitQuotaExceeded": { + "description": "This option rate limits the quota exceeded log events per second", + "type": "integer", + "default": 4294967295 + }, + "rateLimitStartInboundSession": { + "description": "This option rate limits the start inbound session log events per second", + "type": "integer", + "default": 4294967295 + }, + "rateLimitEndInboundSession": { + "description": "This option rate limits the end inbound session log events per second", + "type": "integer", + "default": 4294967295 + }, + "rateLimitStartOutboundSession": { + "description": "This option rate limits the start outbound session log events per second", + "type": "integer", + "default": 4294967295 + }, + "rateLimitEndOutboundSession": { + "description": "This option rate limits the end outbound session log events per second", + "type": "integer", + "default": 4294967295 + }, + "formatErrors": { + "$ref": "#/definitions/Security_Log_Profile_Nat_Storage_Format" + }, + "formatQuotaExceeded": { + "$ref": "#/definitions/Security_Log_Profile_Nat_Storage_Format" + }, + "formatStartInboundSession": { + "$ref": "#/definitions/Security_Log_Profile_Nat_Storage_Format" + }, + "formatEndInboundSession": { + "$ref": "#/definitions/Security_Log_Profile_Nat_Storage_Format" + }, + "formatStartOutboundSession": { + "$ref": "#/definitions/Security_Log_Profile_Nat_Storage_Format" + }, + "formatEndOutboundSession": { + "$ref": "#/definitions/Security_Log_Profile_Nat_Storage_Format" + } + }, + "required": [ + "publisher" + ], + "additionalProperties": false, + "dependencies": { + "logStartOutboundSessionDestination": { + "if": { + "properties": { + "logStartOutboundSessionDestination": { + "const": true + } + } + }, + "then": { + "properties": { + "logStartOutboundSession": { + "const": true + } + } + } + }, + "logEndOutboundSessionDestination": { + "if": { + "properties": { + "logEndOutboundSessionDestination": { + "const": true + } + } + }, + "then": { + "properties": { + "logEndOutboundSession": { + "const": true + } + } + } + } + } + }, + "Security_Log_Profile_Nat_Storage_Format": { + "description": "Specifies the format type for log messages", + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "object", + "properties": { + "fields": { + "description": "Replaces a set of fields in the predefined storage format", + "type": "array", + "items": { + "type": "string", + "enum": [ + "context-name", + "duration", + "route-domain", + "sub-id", + "translated-dest-port", + "translated-src-port", + "dest-ip", + "event-name", + "src-ip", + "timestamp", + "translated-route-domain", + "dest-port", + "protocol", + "src-port", + "translated-dest-ip", + "translated-src-ip" + ] + } + }, + "delimiter": { + "description": "Specifies a field delimiter in the predefined storage format", + "type": "string", + "default": "." + } + }, + "required": [ + "fields" + ], + "additionalProperties": false + } + ] + }, + "Security_Log_Profile_Network": { + "title": "Network Log Profile", + "description": "Specifies, when enabled, that the system logs ACL rule matches, TCP events, and/or TCP/IP errors sent to the network firewall", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm", + "em" + ] + }, + "properties": { + "publisher": { + "description": "Specifies the name of the log publisher used for logging Network events", + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to log publisher declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Log_Publisher" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP log publisher", + "description": "Pathname of existing BIG-IP log publisher", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys log-config publisher" + ] + } + }, + "logRuleMatchAccepts": { + "description": "Specifies, when enabled, that the system logs packets that match ACL rules configured with action = Accept", + "type": "boolean", + "default": false + }, + "logRuleMatchDrops": { + "description": "Specifies, when enabled, that the system logs packets that match ACL rules configured with action = Drop", + "type": "boolean", + "default": false + }, + "logRuleMatchRejects": { + "description": "Specifies, when enabled, that the system logs packets that match ACL rules configured with action = Reject", + "type": "boolean", + "default": false + }, + "logIpErrors": { + "description": "Specifies, when enabled, that the system logs IP error packets", + "type": "boolean", + "default": false + }, + "logTcpErrors": { + "description": "Specifies, when enabled, that the system logs TCP error packets", + "type": "boolean", + "default": false + }, + "logTcpEvents": { + "description": "Specifies, when enabled, that the system logs TCP events (open and close of TCP sessions)", + "type": "boolean", + "default": false + }, + "logTranslationFields": { + "description": "Specifies, when enabled, that the system logs translation values if and when it logs a network firewall event", + "type": "boolean", + "default": false + }, + "alwaysLogRegion": { + "description": "Specifies, when enabled, that when a geolocation event causes a network firewall event, the system logs the associated IP address", + "type": "boolean", + "default": false + }, + "rateLimitRuleMatchAccepts": { + "description": "This option sets rate limits for the logging of packets that match ACL rules configured with action = Accept or action = Accept Decisively", + "type": "integer", + "default": 4294967295 + }, + "rateLimitRuleMatchDrops": { + "description": "This option sets rate limits for the logging of packets that match ACL rules configured with action = Accept or action = Accept Decisively", + "type": "integer", + "default": 4294967295 + }, + "rateLimitRuleMatchRejects": { + "description": "This option sets rate limits for the logging of packets that match ACL rules configured with action = Reject", + "type": "integer", + "default": 4294967295 + }, + "rateLimitIpErrors": { + "description": "This option enables or disables the logging of IP error packets", + "type": "integer", + "default": 4294967295 + }, + "rateLimitTcpErrors": { + "description": "This option sets rate limits for the logging of TCP error packets", + "type": "integer", + "default": 4294967295 + }, + "rateLimitTcpEvents": { + "description": "This option sets rate limits for the logging of TCP events on client side", + "type": "integer", + "default": 4294967295 + }, + "rateLimitAggregate": { + "description": "This option sets the aggregate rate limit that applies to any network logging message", + "type": "integer", + "default": 4294967295 + }, + "storageFormat": { + "description": "Specifies the format type for log messages. If it is a string it is user-defined", + "anyOf": [ + { + "description": "Use this for user-defined storage format", + "type": "string", + "minLength": 1 + }, + { + "type": "object", + "properties": { + "fields": { + "description": "Replaces a set of fields in the predefined storage format", + "type": "array", + "items": { + "type": "string", + "enum": [ + "acl-policy-name", + "acl-policy-type", + "acl-rule-name", + "action", + "bigip-hostname", + "context-name", + "context-type", + "date-time", + "dest-ip", + "dest-port", + "drop-reason", + "management-ip-address", + "protocol", + "route-domain", + "sa-translation-pool", + "sa-translation-type", + "src-ip", + "src-port", + "translated-dest-ip", + "translated-dest-port", + "translated-ip-protocol", + "translated-route-domain", + "translated-src-ip", + "translated-src-port", + "translated-vlan", + "vlan" + ] + } + }, + "delimiter": { + "description": "Specifies a field delimiter in the predefined storage format", + "type": "string", + "default": "." + } + }, + "required": [ + "fields" + ], + "additionalProperties": false + } + ] + } + }, + "additionalProperties": false + }, + "Security_Log_Profile_Ip_Intelligence": { + "title": "IP Intelligence Log Profile", + "description": "Specifies, when enabled, that the system logs IP Intelligence events", + "type": "object", + "properties": { + "publisher": { + "description": "Specifies the name of the log publisher used for logging IP Intelligence events", + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to log publisher declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Log_Publisher" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP log publisher", + "description": "Pathname of existing BIG-IP log publisher", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys log-config publisher" + ] + } + }, + "logTranslationFields": { + "description": "Specifies, when enabled, that the system logs translation values if and when it logs a network firewall event", + "type": "boolean", + "default": false + }, + "rateLimitAggregate": { + "description": "Defines a rate limit for all combined IP intelligence log messages per second", + "type": "integer", + "default": 4294967295 + } + }, + "additionalProperties": false + }, + "Security_Log_Profile_Protocol_Dns": { + "title": "Protocol DNS Log Profile", + "description": "Specifies, when enabled, that the system logs DNS security events", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm", + "em" + ] + }, + "properties": { + "publisher": { + "description": "Specifies the name of the log publisher used for logging DNS security events", + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to log publisher declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Log_Publisher" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP log publisher", + "description": "Pathname of existing BIG-IP log publisher", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys log-config publisher" + ] + } + }, + "logDroppedRequests": { + "description": "Specifies, when enabled, that the system logs dropped DNS requests", + "type": "boolean", + "default": false + }, + "logFilteredDroppedRequests": { + "description": "Specifies, when enabled, that the system logs DNS requests dropped due to DNS query/header-opcode filtering. The system does not log DNS requests dropped due to errors in the way the system processes DNS packets.", + "type": "boolean", + "default": false + }, + "logMalformedRequests": { + "description": "Specifies, when enabled, that the system logs malformed DNS requests", + "type": "boolean", + "default": false + }, + "logRejectedRequests": { + "description": "Specifies, when enabled, that the system logs rejected DNS requests", + "type": "boolean", + "default": false + }, + "logMaliciousRequests": { + "description": "Specifies, when enabled, that the system logs malicious DNS requests", + "type": "boolean", + "default": false + }, + "storageFormat": { + "description": "Specifies the format type for log messages", + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "object", + "properties": { + "fields": { + "description": "Replaces a set of fields in the predefined storage format", + "type": "array", + "items": { + "type": "string", + "enum": [ + "action", + "attack-type", + "context-name", + "date-time", + "dest-ip", + "dest-port", + "dns-query-name", + "dns-query-type", + "src-ip", + "src-port", + "vlan", + "route-domain" + ] + } + }, + "delimiter": { + "description": "Specifies a field delimiter in the predefined storage format", + "type": "string", + "default": "." + } + }, + "required": [ + "fields" + ], + "additionalProperties": false + } + ] + } + }, + "additionalProperties": false + }, + "Security_Log_Profile_Protocol_Sip_Dos": { + "title": "Protocol SIP DoS Log Profile", + "description": "Specifies, when enabled, that the system logs detected SIP DoS attacks", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm", + "em" + ] + }, + "properties": { + "publisher": { + "description": "Specifies the name of the log publisher used for logging SIP DoS events", + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to log publisher declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Log_Publisher" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP log publisher", + "description": "Pathname of existing BIG-IP log publisher", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys log-config publisher" + ] + } + } + }, + "additionalProperties": false + }, + "Security_Log_Profile_Protocol_Sip": { + "title": "Protocol SIP Log Profile", + "description": "Specifies, when enabled, that the system logs SIP protocol security events", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm", + "em" + ] + }, + "properties": { + "publisher": { + "description": "Specifies the name of the log publisher used for logging SIP protocol security events", + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to log publisher declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Log_Publisher" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP log publisher", + "description": "Pathname of existing BIG-IP log publisher", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys log-config publisher" + ] + } + }, + "logDroppedRequests": { + "description": "Specifies, when enabled, that the system logs dropped requests", + "type": "boolean", + "default": false + }, + "logGlobalFailures": { + "description": "Specifies, when enabled, that the system logs global failures", + "type": "boolean", + "default": false + }, + "logMalformedRequests": { + "description": "Specifies, when enabled, that the system logs malformed requests", + "type": "boolean", + "default": false + }, + "logRedirectedResponses": { + "description": "Specifies, when enabled, that the system logs redirection responses", + "type": "boolean", + "default": false + }, + "logRequestFailures": { + "description": "Specifies, when enabled, that the system logs request failures", + "type": "boolean", + "default": false + }, + "logServerErrors": { + "description": "Specifies, when enabled, that the system logs server errors", + "type": "boolean", + "default": false + }, + "storageFormat": { + "description": "Specifies the format type for log messages", + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "object", + "properties": { + "fields": { + "description": "Replaces a set of fields in the predefined storage format", + "type": "array", + "items": { + "type": "string", + "enum": [ + "action", + "context-name", + "date-time", + "dest-ip", + "dest-port", + "sip-method-type", + "sip-caller", + "sip-callee", + "src-ip", + "src-port", + "vlan", + "route-domain" + ] + } + }, + "delimiter": { + "description": "Specifies a field delimiter in the predefined storage format", + "type": "string", + "default": "." + } + }, + "required": [ + "fields" + ], + "additionalProperties": false + } + ] + } + }, + "additionalProperties": false + }, + "Security_Log_Profile_Protocol_Dns_Dos": { + "title": "Protocol DNS DoS Log Profile", + "description": "Specifies, when enabled, that the system logs detected DNS DoS attacks", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm", + "em" + ] + }, + "properties": { + "publisher": { + "description": "Specifies the name of the log publisher used for logging DNS DoS events", + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to log publisher declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Log_Publisher" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP log publisher", + "description": "Pathname of existing BIG-IP log publisher", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys log-config publisher" + ] + } + } + }, + "additionalProperties": false + }, + "Security_Log_Profile_Protocol_Inspection": { + "title": "Protocol Inspection Log Profile", + "description": "Specifies, when enabled, that the system logs events from the Protocol Inspection engine", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm", + "em" + ] + }, + "properties": { + "publisher": { + "$ref": "#/definitions/Pointer_Log_Publisher" + }, + "logPacketPayloadEnabled": { + "description": "Enable logging of the packet payload for Protocol Inspection events", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + }, + "Security_Log_Profile_Protocol_Transfer": { + "title": "Protocol Transfer Log Profile", + "description": "Specifies, when enabled, that the system logs HTTP, FTP, and SMTP protocol security events", + "type": "object", + "properties": { + "publisher": { + "description": "Specifies where the system sends log messages", + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to log publisher declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Log_Publisher" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP log publisher", + "description": "Pathname of existing BIG-IP log publisher", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys log-config publisher" + ] + } + } + }, + "additionalProperties": false + }, + "Security_Log_Profile_Ssh_Proxy": { + "title": "SSH Proxy Security Log Profile", + "description": "Specifies, when enabled, that the system logs SSH Proxy events", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm", + "em" + ] + }, + "properties": { + "publisher": { + "description": "Specifies the name of the log publisher used for logging SSH Proxy events", + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to log publisher declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Log_Publisher" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP log publisher", + "description": "Pathname of existing BIG-IP log publisher", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys log-config publisher" + ] + } + }, + "logClientAuthFail": { + "description": "Specifies the name of the log publisher used for logging SSH Proxy events", + "type": "boolean", + "default": false + }, + "logClientAuthSuccess": { + "description": "Specifies, when enabled, that the system logs client auth success events", + "type": "boolean", + "default": false + }, + "logClientAuthPartial": { + "description": "Specifies, when enabled, that the system logs client auth partial events", + "type": "boolean", + "default": false + }, + "logServerAuthFail": { + "description": "Specifies, when enabled, that the system logs server auth failure events", + "type": "boolean", + "default": false + }, + "logServerAuthSuccess": { + "description": "Specifies, when enabled, that the system logs server auth failure events", + "type": "boolean", + "default": false + }, + "logServerAuthPartial": { + "description": "Specifies, when enabled, that the system logs server auth partial events", + "type": "boolean", + "default": false + }, + "logDisallowedChannelAction": { + "description": "Specifies, when enabled, that the system logs disallowed channel actions", + "type": "boolean", + "default": false + }, + "logAllowedChannelAction": { + "description": "Specifies, when enabled, that the system logs allowed channel actions", + "type": "boolean", + "default": false + }, + "logSshTimeout": { + "description": "Specifies, when enabled, that the system logs SSH timeouts", + "type": "boolean", + "default": false + }, + "logNonSshTraffic": { + "description": "Specifies, when enabled, that the system logs non-SSH traffic events", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + }, + "Traffic_Log_Profile": { + "title": "Traffic_Log_Profile", + "description": "A traffic log profile", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Traffic_Log_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "parentProfile": { + "description": "Specifies the name of the object to inherit the settings from", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Traffic_Log_Profile" + } + ], + "default": { + "bigip": "/Common/request-log" + } + }, + "requestSettings": { + "description": "The request settings for the profile", + "allOf": [ + { + "$ref": "#/definitions/Traffic_Log_Profile_Request_Settings" + } + ], + "default": {} + }, + "responseSettings": { + "description": "The response settings for the profile", + "allOf": [ + { + "$ref": "#/definitions/Traffic_Log_Profile_Response_Settings" + } + ], + "default": {} + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "Traffic_Log_Profile_Response_Settings": { + "description": "A traffic log profiles response settings", + "type": "object", + "properties": { + "byDefaultEnabled": { + "description": "Default response action and if response logging can be overridden by iRule", + "type": "boolean", + "default": true + }, + "responseErrorLoggingEnabled": { + "description": "Enable secondary logging if insufficient bandwidth for primary. Best used to send an alert to a separate destination", + "type": "boolean", + "default": false + }, + "responseErrorPool": { + "description": "Specifies the name of the pool from which to select log servers", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Pool" + } + ] + }, + "responseErrorProtocol": { + "description": "Specifies the HighSpeedLogging protocol to use when logging", + "type": "string", + "enum": [ + "mds-tcp", + "mds-udp" + ], + "default": "mds-udp" + }, + "responseErrorTemplate": { + "description": "Template to use when generating log messages", + "type": "string" + }, + "responsePool": { + "description": "Specifies the name of the pool from which to select log servers", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Pool" + } + ] + }, + "responseProtocol": { + "description": "Specifies the HighSpeedLogging protocol to use when logging", + "type": "string", + "enum": [ + "mds-tcp", + "mds-udp" + ], + "default": "mds-udp" + }, + "responseTemplate": { + "description": "Template to use when generating log messages", + "type": "string" + }, + "responseEnabled": { + "description": "Enables or disables logging before the response is returned to the client", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + }, + "Traffic_Log_Profile_Request_Settings": { + "description": "A traffic log profiles request settings", + "type": "object", + "properties": { + "requestErrorLoggingEnabled": { + "description": "Enable secondary logging if insufficient bandwidth for primary. Best used to send an alert to a separate destination", + "type": "boolean", + "default": false + }, + "proxyCloseOnErrorEnabled": { + "description": "Specifies, if enabled, that the logging profile will close the connection after sending its proxy-response", + "type": "boolean", + "default": false + }, + "proxyRespondOnLoggingErrorEnabled": { + "description": "Specifies that the logging profile respond directly if the logging fails", + "type": "boolean", + "default": false + }, + "proxyResponse": { + "description": "Specifies the response to send on logging errors", + "type": "string" + }, + "requestErrorPool": { + "description": "Specifies the name of the pool from which to select log servers", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Pool" + } + ] + }, + "requestErrorProtocol": { + "description": "Specifies the HighSpeedLogging protocol to use when logging", + "type": "string", + "enum": [ + "mds-tcp", + "mds-udp" + ], + "default": "mds-udp" + }, + "requestErrorTemplate": { + "description": "Template to use when generating log messages", + "type": "string" + }, + "requestPool": { + "description": "Specifies the name of the pool from which to select log servers", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Pool" + } + ] + }, + "requestProtocol": { + "description": "Specifies the HighSpeedLogging protocol to use when logging", + "type": "string", + "enum": [ + "mds-tcp", + "mds-udp" + ], + "default": "mds-udp" + }, + "requestTemplate": { + "description": "Template to use when generating log messages", + "type": "string" + }, + "requestEnabled": { + "description": "Enables or disables logging before the response is returned to the client", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + }, + "Endpoint_Policy_Rule": { + "title": "Rule", + "description": "A rule for an Endpoint policy that describes actions to perform on traffic matching given conditions", + "type": "object", + "properties": { + "name": { + "title": "Name", + "description": "Name of the endpoint policy rule", + "type": "string", + "pattern": "^[a-zA-Z0-9_\\-.:%]+$", + "maxLength": 64000 + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "conditions": { + "title": "Conditions", + "description": "Specifies the conditions for the rule to apply", + "type": "array", + "items": { + "$ref": "#/definitions/Policy_Condition" + }, + "default": [] + }, + "actions": { + "title": "Actions", + "description": "Specifies the actions for the rule to execute", + "type": "array", + "items": { + "$ref": "#/definitions/Policy_Action" + }, + "default": [] + } + }, + "additionalProperties": false, + "required": [ + "name" + ] + }, + "Endpoint_Policy": { + "title": "Endpoint_Policy", + "description": "Policy to manage connections based on metadata and content", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Endpoint_Policy" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "rules": { + "title": "Rules", + "description": "List of policy rules, order is significant", + "type": "array", + "items": { + "$ref": "#/definitions/Endpoint_Policy_Rule" + } + }, + "strategy": { + "title": "Strategy", + "description": "Rule-matching strategy; value 'custom' means BIG-IP AS3 requires a custom strategy (default is best-match)", + "type": "string", + "enum": [ + "all-match", + "best-match", + "first-match", + "custom" + ], + "default": "best-match" + }, + "customStrategy": { + "title": "Custom strategy", + "description": "BIG-IP AS3 pointer to custom strategy declaration", + "if": { + "type": "string" + }, + "then": { + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Endpoint_Strategy" + } + }, + "required": [ + "class" + ] + } + } + }, + "else": { + "type": "object", + "properties": { + "bigip": { + "title": "BIG-IP LTM strategy", + "description": "Pathname of existing BIG-IP LTM strategy", + "type": "string", + "format": "f5bigip" + } + }, + "required": [ + "bigip" + ], + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm policy-strategy" + ] + } + } + } + }, + "additionalProperties": false, + "dependencies": { + "strategy": { + "if": { + "properties": { + "strategy": { + "const": "custom" + } + } + }, + "then": { + "required": [ + "customStrategy" + ] + } + } + }, + "required": [ + "class" + ] + }, + "Endpoint_Strategy": { + "title": "Endpoint_Strategy", + "description": "Strategy for evaluation of an Endpoint policy", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Endpoint_Strategy" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "matchMethod": { + "title": "Match method", + "description": "Specifies the match method", + "type": "string", + "enum": [ + "all-match", + "best-match", + "first-match" + ] + }, + "operands": { + "title": "Operands", + "description": "Specifies the attribute for the rule to match. Sometimes this represents a specific value (for example, http-method or http-status), but frequently the operand needs a specific Selector to identify an instance (for example, http-header needs a Selectorname parameter).", + "type": "array", + "items": { + "title": "Operand", + "type": "string" + } + } + }, + "additionalProperties": false, + "required": [ + "class", + "matchMethod" + ] + }, + "Policy_Action": { + "type": "object", + "description": "LTM policy action", + "properties": { + "type": { + "description": "Selects the LTM policy action this object describes", + "type": "string", + "enum": [ + "http", + "httpCookie", + "httpHeader", + "httpRedirect", + "httpUri", + "botDefense", + "waf", + "forward", + "drop", + "clientSsl", + "persist", + "tcl", + "log" + ] + } + }, + "allOf": [ + { + "if": { + "properties": { + "type": { + "const": "http" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Action_HTTP" + } + }, + { + "if": { + "properties": { + "type": { + "const": "waf" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Action_WAF" + } + }, + { + "if": { + "properties": { + "type": { + "const": "botDefense" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Action_Bot_Defense" + } + }, + { + "if": { + "properties": { + "type": { + "const": "forward" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Action_Forward" + } + }, + { + "if": { + "properties": { + "type": { + "const": "drop" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Action_Drop" + } + }, + { + "if": { + "properties": { + "type": { + "const": "httpRedirect" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Action_HTTP_Redirect" + } + }, + { + "if": { + "properties": { + "type": { + "const": "httpHeader" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Action_HTTP_Header" + } + }, + { + "if": { + "properties": { + "type": { + "const": "httpUri" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Action_HTTP_URI" + } + }, + { + "if": { + "properties": { + "type": { + "const": "httpCookie" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Action_HTTP_Cookie" + } + }, + { + "if": { + "properties": { + "type": { + "const": "clientSsl" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Action_Client_SSL" + } + }, + { + "if": { + "properties": { + "type": { + "const": "persist" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Action_Persist" + } + }, + { + "if": { + "properties": { + "type": { + "const": "tcl" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Action_TCL" + } + }, + { + "if": { + "properties": { + "type": { + "const": "log" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Action_Log" + } + } + ], + "required": [ + "type" + ] + }, + "Policy_Action_HTTP": { + "type": "object", + "description": "Provides the ability to enable or disable BIG-IP's HTTP filter processing", + "properties": { + "event": { + "type": "string", + "description": "When to run this event in the request-response cycle", + "enum": [ + "client-accepted", + "proxy-request", + "request", + "response", + "server-connected" + ], + "default": "request" + }, + "enabled": { + "description": "Enable BIG-IP's HTTP filter processing", + "type": "boolean", + "default": true + } + }, + "required": [] + }, + "Policy_Action_WAF": { + "type": "object", + "description": "Control web security", + "properties": { + "event": { + "type": "string", + "description": "When to run this event in the request-response cycle", + "enum": [ + "client-accepted", + "proxy-request", + "request" + ], + "default": "request" + }, + "policy": { + "$ref": "#/definitions/Pointer_WAF_Policy" + } + }, + "required": [] + }, + "Policy_Action_Bot_Defense": { + "type": "object", + "description": "Enable or disable Unified Bot Defense processing", + "properties": { + "event": { + "type": "string", + "description": "When to run this event in the request-response cycle", + "enum": [ + "client-accepted", + "proxy-request", + "request" + ], + "default": "request" + }, + "profile": { + "$ref": "#/definitions/Pointer_Bot_Defense_Profile" + } + }, + "required": [] + }, + "Policy_Action_Drop": { + "type": "object", + "description": "Reset connection", + "properties": { + "event": { + "type": "string", + "description": "When to run this event in the request-response cycle", + "enum": [ + "proxy-request", + "request", + "ssl-client-hello" + ], + "default": "ssl-client-hello" + } + } + }, + "Policy_Action_Forward_Select": { + "description": "Select appropriate location for forwarding the connection based on specified parameters", + "type": "object", + "allOf": [ + { + "oneOf": [ + { + "type": "object", + "properties": { + "pool": { + "$ref": "#/definitions/Pointer_Pool" + } + }, + "required": [ + "pool" + ] + }, + { + "type": "object", + "properties": { + "service": { + "$ref": "#/definitions/Pointer_Service" + } + }, + "required": [ + "service" + ] + } + ] + }, + { + "properties": { + "snat": { + "description": "Controls SNAT Automap", + "type": "string", + "enum": [ + "disable", + "automap" + ] + } + } + } + ] + }, + "Policy_Action_Forward": { + "description": "Controls where the system forwards a connection", + "type": "object", + "allOf": [ + { + "properties": { + "event": { + "type": "string", + "description": "When to run this event in the request-response cycle", + "enum": [ + "ssl-client-hello", + "request" + ], + "default": "ssl-client-hello" + } + } + }, + { + "oneOf": [ + { + "type": "object", + "properties": { + "select": { + "description": "Select appropriate location for forwarding the connection based on specified parameters", + "allOf": [ + { + "$ref": "#/definitions/Policy_Action_Forward_Select" + } + ] + } + }, + "required": [ + "select" + ] + } + ] + } + ] + }, + "Policy_Action_HTTP_Redirect": { + "type": "object", + "description": "Redirect an HTTP request to a different URL", + "properties": { + "event": { + "type": "string", + "description": "When to run this event in the request-response cycle", + "enum": [ + "proxy-request", + "request", + "response" + ], + "default": "proxy-request" + }, + "location": { + "description": "The new URL for which the system will send a redirect response; you can use a Tcl command substitution for this field", + "type": "string" + }, + "code": { + "description": "HTTP status code for the redirect. Note: code is only supported in TMOS version 14.0+.", + "type": "integer", + "minimum": 300, + "maximum": 399 + } + }, + "required": [ + "location" + ] + }, + "Policy_Action_HTTP_Header": { + "type": "object", + "description": "Modify HTTP header in request or response", + "allOf": [ + { + "type": "object", + "properties": { + "event": { + "type": "string", + "description": "When to run this event in the request-response cycle", + "enum": [ + "request", + "response" + ], + "default": "request" + } + } + }, + { + "oneOf": [ + { + "type": "object", + "properties": { + "replace": { + "type": "object", + "description": "Replace HTTP header in request or response", + "properties": { + "name": { + "type": "string", + "description": "Name of HTTP header" + }, + "value": { + "type": "string", + "description": "New value for HTTP header; you can use a Tcl command substitution for this field" + } + }, + "required": [ + "name", + "value" + ], + "additionalProperties": false + } + }, + "required": [ + "replace" + ] + }, + { + "type": "object", + "properties": { + "insert": { + "type": "object", + "description": "Insert HTTP header into request or response", + "properties": { + "name": { + "type": "string", + "description": "Name of HTTP header" + }, + "value": { + "type": "string", + "description": "New value for HTTP header; you can use a Tcl command substitution for this field" + } + }, + "required": [ + "name", + "value" + ], + "additionalProperties": false + } + }, + "required": [ + "insert" + ] + }, + { + "type": "object", + "properties": { + "remove": { + "type": "object", + "description": "Remove HTTP header from request or response", + "properties": { + "name": { + "type": "string", + "description": "Name of HTTP header" + } + }, + "required": [ + "name" + ], + "additionalProperties": false + } + }, + "required": [ + "remove" + ] + } + ] + } + ] + }, + "Policy_Action_HTTP_URI": { + "type": "object", + "description": "Modify the request's URI, path, or query string", + "properties": { + "event": { + "type": "string", + "description": "When to run this event in the request-response cycle", + "enum": [ + "request" + ], + "default": "request" + }, + "replace": { + "type": "object", + "description": "Replace URI, path, or query string in request", + "oneOf": [ + { + "type": "object", + "properties": { + "value": { + "type": "string", + "description": "New value for URI; you can use a Tcl command substitution for this field" + } + }, + "required": [ + "value" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "path": { + "type": "string", + "description": "New value for path; you can use a Tcl command substitution for this field" + } + }, + "required": [ + "path" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "queryString": { + "type": "string", + "description": "New value for query string; you can use a Tcl command substitution for this field" + } + }, + "required": [ + "queryString" + ], + "additionalProperties": false + } + ] + } + }, + "required": [ + "replace" + ] + }, + "Policy_Action_HTTP_Cookie": { + "type": "object", + "description": "Modify the request's \"Cookie:\" header", + "allOf": [ + { + "type": "object", + "properties": { + "event": { + "type": "string", + "description": "When to run this event in the request-response cycle", + "enum": [ + "request" + ], + "default": "request" + } + } + }, + { + "oneOf": [ + { + "type": "object", + "properties": { + "insert": { + "type": "object", + "description": "Insert HTTP \"Cookie:\" header into request", + "properties": { + "name": { + "type": "string", + "description": "Name of HTTP cookie" + }, + "value": { + "type": "string", + "description": "New value for HTTP cookie; you can use a Tcl command substitution for this field" + } + }, + "required": [ + "name", + "value" + ], + "additionalProperties": false + } + }, + "required": [ + "insert" + ] + }, + { + "type": "object", + "properties": { + "remove": { + "type": "object", + "description": "Remove HTTP \"Cookie:\" header from request", + "properties": { + "name": { + "type": "string", + "description": "Name of HTTP cookie" + } + }, + "required": [ + "name" + ], + "additionalProperties": false + } + }, + "required": [ + "remove" + ] + } + ] + } + ] + }, + "Policy_Action_Client_SSL": { + "type": "object", + "description": "Enable or disable encrypted connections to backend servers", + "properties": { + "event": { + "type": "string", + "description": "When to run this event in the request-response cycle", + "enum": [ + "client-accepted", + "proxy-request", + "request", + "proxy-connect", + "proxy-response", + "server-connected" + ], + "default": "client-accepted" + }, + "enabled": { + "description": "Enable encrypted connections to backend servers", + "type": "boolean", + "default": true + } + }, + "required": [] + }, + "Policy_Action_Persist": { + "type": "object", + "description": "Control over how a connection is persisted", + "allOf": [ + { + "type": "object", + "properties": { + "event": { + "type": "string", + "description": "When to run this event in the request-response cycle", + "enum": [ + "client-accepted", + "proxy-request", + "request" + ], + "default": "client-accepted" + } + } + }, + { + "oneOf": [ + { + "type": "object", + "properties": { + "disable": { + "type": "object", + "title": "Disable", + "description": "Disable persistence. When specifying set this property to an empty object (disable: {}).", + "additionalProperties": false + } + }, + "required": [ + "disable" + ] + }, + { + "type": "object", + "properties": { + "sourceAddress": { + "type": "object", + "title": "Source Address", + "description": "Persist the connection based on the source IP address", + "properties": { + "netmask": { + "title": "Network Mask", + "type": "string", + "description": "Network mask", + "format": "f5ip" + }, + "timeout": { + "title": "Timeout", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "description": "Timeout value in seconds" + } + }, + "required": [ + "netmask", + "timeout" + ], + "additionalProperties": false + } + }, + "required": [ + "sourceAddress" + ] + }, + { + "type": "object", + "properties": { + "destinationAddress": { + "type": "object", + "title": "Destination Address", + "description": "Persist the connection based on the destination IP address", + "properties": { + "netmask": { + "title": "Network Mask", + "type": "string", + "description": "Network mask", + "format": "f5ip" + }, + "timeout": { + "title": "Timeout", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "description": "Timeout value in seconds" + } + }, + "required": [ + "netmask", + "timeout" + ], + "additionalProperties": false + } + }, + "required": [ + "destinationAddress" + ] + }, + { + "type": "object", + "properties": { + "cookieInsert": { + "type": "object", + "title": "Cookie Insert", + "description": "Persist the connection using cookie insertion", + "properties": { + "name": { + "type": "string", + "title": "Name", + "description": "Name of cookie" + }, + "expiry": { + "type": "string", + "title": "Expiry", + "description": "Expiration duration expressed as [Nd][HH:MM[:SS]]" + } + }, + "required": [ + "name", + "expiry" + ], + "additionalProperties": false + } + }, + "required": [ + "cookieInsert" + ] + }, + { + "type": "object", + "properties": { + "cookieRewrite": { + "type": "object", + "title": "Cookie Rewrite", + "description": "Persist the connection using cookie rewrite", + "properties": { + "name": { + "type": "string", + "title": "Name", + "description": "Name of cookie" + }, + "expiry": { + "type": "string", + "title": "Expiry", + "description": "Expiration duration expressed as [Nd][HH:MM[:SS]]" + } + }, + "required": [ + "name", + "expiry" + ], + "additionalProperties": false + } + }, + "required": [ + "cookieRewrite" + ] + }, + { + "type": "object", + "properties": { + "cookiePassive": { + "type": "object", + "title": "Cookie Passive", + "description": "Persist the connection using cookie passive", + "properties": { + "name": { + "type": "string", + "title": "Name", + "description": "Name of cookie" + } + }, + "required": [ + "name" + ], + "additionalProperties": false + } + }, + "required": [ + "cookiePassive" + ] + }, + { + "type": "object", + "properties": { + "cookieHash": { + "type": "object", + "title": "Cookie Hash", + "description": "Persist the connection using cookie hash", + "properties": { + "name": { + "type": "string", + "title": "Name", + "description": "Name of cookie" + }, + "offset": { + "type": "integer", + "title": "Offset", + "minimum": 0, + "maximum": 65535, + "description": "Offset into hash" + }, + "length": { + "type": "integer", + "title": "Length", + "minimum": 0, + "maximum": 65535, + "description": "Substring length" + }, + "timeout": { + "title": "Timeout", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "description": "Timeout value in seconds" + } + }, + "required": [ + "name", + "offset", + "length", + "timeout" + ], + "additionalProperties": false + } + }, + "required": [ + "cookieHash" + ] + }, + { + "type": "object", + "properties": { + "universal": { + "type": "object", + "title": "Universal", + "description": "Persist the connection using a user-defined key", + "properties": { + "key": { + "type": "string", + "title": "Key", + "description": "The key to use. Tcl command substitution is allowed" + }, + "timeout": { + "title": "Timeout", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "description": "Timeout value in seconds" + } + }, + "required": [ + "key", + "timeout" + ], + "additionalProperties": false + } + }, + "required": [ + "universal" + ] + }, + { + "type": "object", + "properties": { + "hash": { + "type": "object", + "title": "Hash", + "description": "Persist the connection using the hash of a key", + "properties": { + "key": { + "type": "string", + "title": "Key", + "description": "The key to use. Tcl command substitution is allowed" + }, + "timeout": { + "title": "Timeout", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "description": "Timeout value in seconds" + } + }, + "required": [ + "key", + "timeout" + ], + "additionalProperties": false + } + }, + "required": [ + "hash" + ] + }, + { + "type": "object", + "properties": { + "carp": { + "type": "object", + "title": "Cache Array Routing Protocol (CARP)", + "description": "Persist the connection using Cache Array Routing Protocol (CARP) algorithm", + "properties": { + "key": { + "type": "string", + "title": "Key", + "description": "The key to use. Tcl command substitution is allowed" + }, + "timeout": { + "title": "Timeout", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "description": "Timeout value in seconds" + } + }, + "required": [ + "key", + "timeout" + ], + "additionalProperties": false + } + }, + "required": [ + "carp" + ] + } + ] + } + ] + }, + "Policy_Action_TCL": { + "type": "object", + "description": "Set a Tcl variable in runtime environment", + "properties": { + "event": { + "type": "string", + "description": "When to run this event in the request-response cycle", + "enum": [ + "proxy-request", + "request", + "response", + "ssl-client-hello", + "ssl-server-hello", + "ssl-server-handshake" + ], + "default": "request" + }, + "setVariable": { + "type": "object", + "description": "Set a Tcl variable in the runtime environment", + "properties": { + "expression": { + "type": "string", + "description": "Tcl expression to evaluate" + }, + "name": { + "type": "string", + "description": "Name of variable" + } + }, + "required": [ + "expression", + "name" + ] + } + }, + "required": [ + "setVariable" + ] + }, + "Policy_Action_Log": { + "type": "object", + "description": "Writes messages to local or remote system log", + "properties": { + "event": { + "type": "string", + "description": "When to run this event in the request-response cycle", + "enum": [ + "classification-detected", + "client-accepted", + "proxy-connect", + "proxy-request", + "proxy-response", + "request", + "response", + "server-connected", + "ssl-client-hello", + "ssl-client-serverhello-send", + "ssl-server-handshake", + "ssl-server-hello", + "ws-request", + "ws-response" + ], + "default": "ssl-client-hello" + }, + "write": { + "type": "object", + "description": "Write a message to the system log files", + "properties": { + "message": { + "type": "string", + "description": "The message to write to the system log. Can also be a Tcl command substitution", + "minLength": 1 + }, + "facility": { + "type": "string", + "description": "Standard syslog facility associated with the message", + "enum": [ + "authpriv", + "cron", + "daemon", + "ftp", + "kern", + "local0", + "local1", + "local2", + "local3", + "local4", + "local5", + "local6", + "local7", + "lpr", + "mail", + "news", + "security", + "user", + "uucp" + ], + "default": "local0" + }, + "priority": { + "type": "string", + "description": "Standard syslog priority associated with the message", + "enum": [ + "crit", + "debug", + "error", + "info", + "notice", + "warning" + ], + "default": "info" + }, + "ipAddress": { + "type": "string", + "description": "The IP address of the remote syslog server", + "format": "f5ip" + }, + "port": { + "type": "integer", + "description": "The port number of the remote syslog server", + "minimum": 0, + "maximum": 65535, + "default": 0 + } + }, + "required": [ + "message" + ] + } + }, + "required": [ + "write" + ] + }, + "Policy_Condition": { + "type": "object", + "description": "LTM policy condition", + "properties": { + "type": { + "description": "Selects the LTM policy condition this object describes", + "type": "string", + "enum": [ + "httpHeader", + "httpMethod", + "httpUri", + "httpCookie", + "sslExtension", + "tcp", + "geoip" + ] + } + }, + "allOf": [ + { + "if": { + "properties": { + "type": { + "const": "httpUri" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Condition_HTTP_URI" + } + }, + { + "if": { + "properties": { + "type": { + "const": "httpHeader" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Condition_HTTP_Header" + } + }, + { + "if": { + "properties": { + "type": { + "const": "httpMethod" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Condition_HTTP_Method" + } + }, + { + "if": { + "properties": { + "type": { + "const": "httpCookie" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Condition_HTTP_Cookie" + } + }, + { + "if": { + "properties": { + "type": { + "const": "sslExtension" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Condition_SSL_Extension" + } + }, + { + "if": { + "properties": { + "type": { + "const": "tcp" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Condition_TCP" + } + }, + { + "if": { + "properties": { + "type": { + "const": "geoip" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Condition_GeoIP" + } + } + ], + "required": [ + "type" + ] + }, + "Policy_Condition_HTTP_URI": { + "description": "Inspect the URI on a request and match on various parts or the entire URI", + "type": "object", + "allOf": [ + { + "type": "object", + "properties": { + "event": { + "description": "When to evaluate this condition in the request-response cycle", + "type": "string", + "enum": [ + "proxy-request", + "request" + ], + "default": "request" + } + } + }, + { + "oneOf": [ + { + "type": "object", + "properties": { + "path": { + "description": "Match on the URI path", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_String" + } + ] + }, + "normalized": { + "description": "Normalizes the result to a canonical form to allow consistent comparisons", + "type": "boolean", + "default": false + } + }, + "required": [ + "path" + ] + }, + { + "type": "object", + "properties": { + "scheme": { + "description": "Match on the scheme (e.g. http, https, ftp, file)", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_String" + } + ] + }, + "normalized": { + "description": "Normalizes the result to a canonical form to allow consistent comparisons", + "type": "boolean", + "default": false + } + }, + "required": [ + "scheme" + ] + }, + { + "type": "object", + "properties": { + "host": { + "description": "Match on the hostname in the URI", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_String" + } + ] + }, + "normalized": { + "description": "Normalizes the result to a canonical form to allow consistent comparisons", + "type": "boolean", + "default": false + } + }, + "required": [ + "host" + ] + }, + { + "type": "object", + "properties": { + "port": { + "description": "Match on the port number in the URI", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_Number" + } + ] + }, + "normalized": { + "description": "Normalizes the result to a canonical form to allow consistent comparisons", + "type": "boolean", + "default": false + } + }, + "required": [ + "port" + ] + }, + { + "type": "object", + "properties": { + "extension": { + "description": "Match on the file extension in the URI (e.g. jpg, html, cgi)", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_String" + } + ] + }, + "normalized": { + "description": "Normalizes the result to a canonical form to allow consistent comparisons", + "type": "boolean", + "default": false + } + }, + "required": [ + "extension" + ] + }, + { + "type": "object", + "properties": { + "queryString": { + "description": "Match against text in the query string", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_String" + } + ] + }, + "normalized": { + "description": "Normalizes the result to a canonical form to allow consistent comparisons", + "type": "boolean", + "default": false + } + }, + "required": [ + "queryString" + ] + }, + { + "type": "object", + "properties": { + "queryParameter": { + "description": "Match value of the named query parameter from the query string", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_String" + } + ] + }, + "name": { + "description": "Specify the name of the particular query parameter whose value you want to use", + "type": "string" + }, + "normalized": { + "description": "Normalizes the result to a canonical form to allow consistent comparisons", + "type": "boolean", + "default": false + } + }, + "required": [ + "queryParameter", + "name" + ] + }, + { + "type": "object", + "properties": { + "unnamedQueryParameter": { + "description": "Match the value of a query parameter by a numeric index instead of by name", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_String" + } + ] + }, + "index": { + "description": "The numeric order of the item whose value you want to use, start at 1; negative values indicate counting right to left", + "type": "integer", + "minimum": 1 + }, + "normalized": { + "description": "Normalizes the result to a canonical form to allow consistent comparisons", + "type": "boolean", + "default": false + } + }, + "required": [ + "unnamedQueryParameter", + "index" + ] + }, + { + "type": "object", + "properties": { + "pathSegment": { + "description": "Match a part of the URI path by a numeric index", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_String" + } + ] + }, + "index": { + "description": "The numeric order of the item whose value you want to use, start at 1; negative values indicate counting right to left", + "type": "integer", + "minimum": 1 + }, + "normalized": { + "description": "Normalizes the result to a canonical form to allow consistent comparisons", + "type": "boolean", + "default": false + } + }, + "required": [ + "pathSegment", + "index" + ] + }, + { + "type": "object", + "properties": { + "all": { + "description": "Match on the full URI", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_String" + } + ] + }, + "normalized": { + "description": "Normalizes the result to a canonical form to allow consistent comparisons", + "type": "boolean", + "default": false + } + }, + "required": [ + "all" + ] + } + ] + } + ] + }, + "Policy_Condition_HTTP_Header": { + "description": "Match against any HTTP header", + "type": "object", + "allOf": [ + { + "type": "object", + "properties": { + "event": { + "description": "When to evaluate this condition in the request-response cycle", + "type": "string", + "enum": [ + "proxy-request", + "request", + "proxy-connect", + "proxy-response", + "response" + ], + "default": "proxy-request" + } + } + }, + { + "oneOf": [ + { + "type": "object", + "properties": { + "all": { + "description": "Match on the full HTTP header", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_String" + } + ] + }, + "name": { + "description": "Specify the name of the particular HTTP header whose value you want to use", + "type": "string" + } + }, + "required": [ + "all", + "name" + ] + } + ] + } + ] + }, + "Policy_Condition_HTTP_Method": { + "description": "Match against any HTTP method", + "type": "object", + "allOf": [ + { + "type": "object", + "properties": { + "event": { + "description": "When to evaluate this condition in the request-response cycle", + "type": "string", + "enum": [ + "proxy-request", + "request" + ], + "default": "proxy-request" + } + } + }, + { + "type": "object", + "properties": { + "all": { + "description": "Match on the full HTTP method", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_String" + } + ] + } + }, + "required": [ + "all" + ] + } + ] + }, + "Policy_Condition_HTTP_Cookie": { + "description": "Inspect an HTTP request Cookie: header", + "type": "object", + "allOf": [ + { + "type": "object", + "properties": { + "event": { + "description": "When to evaluate this condition in the request-response cycle", + "type": "string", + "enum": [ + "proxy-request", + "request", + "proxy-connect" + ], + "default": "proxy-request" + } + } + }, + { + "oneOf": [ + { + "type": "object", + "properties": { + "all": { + "description": "Match on the full HTTP cookie", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_String" + } + ] + }, + "name": { + "description": "Specify the name of the particular HTTP cookie whose value you want to use", + "type": "string" + } + }, + "required": [ + "all", + "name" + ] + } + ] + } + ] + }, + "Policy_Condition_SSL_Extension": { + "description": "Inspect SSL extensions being negotiated during HELLO phase", + "type": "object", + "allOf": [ + { + "type": "object", + "properties": { + "event": { + "description": "When to evaluate this condition in the request-response cycle", + "type": "string", + "enum": [ + "ssl-client-hello", + "ssl-server-hello" + ], + "default": "ssl-client-hello" + } + } + }, + { + "oneOf": [ + { + "type": "object", + "properties": { + "serverName": { + "description": "Server name indication", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_String" + } + ] + } + }, + "required": [ + "serverName" + ] + }, + { + "type": "object", + "properties": { + "npn": { + "description": "Server name indication", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_String" + } + ] + }, + "index": { + "description": "The numeric order of the item whose value you want to use, start at 1; negative values indicate counting right to left", + "type": "integer", + "minimum": 1, + "default": 0 + } + }, + "required": [ + "npn" + ] + }, + { + "type": "object", + "properties": { + "alpn": { + "description": "Server name indication", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_String" + } + ] + }, + "index": { + "description": "The numeric order of the item whose value you want to use, start at 1; negative values indicate counting right to left", + "type": "integer", + "minimum": 1, + "default": 0 + } + }, + "required": [ + "alpn" + ] + } + ] + } + ] + }, + "Policy_Condition_TCP": { + "description": "Match against specific TCP properties", + "type": "object", + "allOf": [ + { + "type": "object", + "properties": { + "event": { + "description": "When to evaluate this condition in the request-response cycle", + "type": "string", + "enum": [ + "request", + "response", + "classification-detected", + "client-accepted", + "proxy-connect", + "proxy-request", + "proxy-response", + "server-connected", + "ssl-client-hello", + "ssl-client-serverhello-send", + "ssl-server-handshake", + "ssl-server-hello", + "ws-request", + "ws-response" + ], + "default": "request" + } + } + }, + { + "oneOf": [ + { + "type": "object", + "properties": { + "address": { + "description": "Specify the address to use", + "allOf": [ + { + "$ref": "#/definitions/Policy_Match_String" + } + ] + } + }, + "required": [ + "address" + ] + }, + { + "type": "object", + "properties": { + "port": { + "description": "Specify the port to use", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_Number" + } + ] + } + }, + "required": [ + "port" + ] + } + ] + } + ] + }, + "Policy_Condition_GeoIP": { + "description": "Match against specific GeoIP properties", + "type": "object", + "allOf": [ + { + "type": "object", + "properties": { + "event": { + "description": "When to evaluate this condition in the request-response cycle", + "type": "string", + "enum": [ + "request", + "response", + "client-accepted", + "proxy-connect", + "proxy-request", + "proxy-response", + "server-connected", + "ssl-client-hello", + "ssl-client-serverhello-send", + "ssl-server-handshake", + "ssl-server-hello" + ], + "default": "request" + } + } + }, + { + "oneOf": [ + { + "type": "object", + "properties": { + "continent": { + "description": "Two-character continent code: AF, AN, AS, OC, EU, NA, SA", + "allOf": [ + { + "$ref": "#/definitions/Policy_Match_String" + } + ] + } + }, + "required": [ + "continent" + ] + }, + { + "type": "object", + "properties": { + "countryCode": { + "description": "Two-character country code as defined in ISO-3166-2", + "allOf": [ + { + "$ref": "#/definitions/Policy_Match_String" + } + ] + } + }, + "required": [ + "countryCode" + ] + }, + { + "type": "object", + "properties": { + "countryName": { + "description": "Full name of country", + "allOf": [ + { + "$ref": "#/definitions/Policy_Match_String" + } + ] + } + }, + "required": [ + "countryName" + ] + }, + { + "type": "object", + "properties": { + "isp": { + "description": "Internet Service Provider associated with address", + "allOf": [ + { + "$ref": "#/definitions/Policy_Match_String" + } + ] + } + }, + "required": [ + "isp" + ] + }, + { + "type": "object", + "properties": { + "org": { + "description": "Organization associated with address", + "allOf": [ + { + "$ref": "#/definitions/Policy_Match_String" + } + ] + } + }, + "required": [ + "org" + ] + }, + { + "type": "object", + "properties": { + "regionCode": { + "description": "Abbreviation of State, Province, or country-specific region", + "allOf": [ + { + "$ref": "#/definitions/Policy_Match_String" + } + ] + } + }, + "required": [ + "regionCode" + ] + }, + { + "type": "object", + "properties": { + "regionName": { + "description": "Full name of State, Province, or country-specific region", + "allOf": [ + { + "$ref": "#/definitions/Policy_Match_String" + } + ] + } + }, + "required": [ + "regionName" + ] + } + ] + } + ] + }, + "Policy_Compare_String": { + "description": "Perform a comparison against string values", + "type": "object", + "properties": { + "operand": { + "description": "Specifies the comparison the system should perform with values. The operands exists and does-not-exist do not accept values and are available on BIGIP 15.0 and above.", + "type": "string", + "enum": [ + "equals", + "does-not-equal", + "starts-with", + "does-not-start-with", + "ends-with", + "does-not-end-with", + "contains", + "does-not-contain", + "exists", + "does-not-exist" + ], + "default": "equals" + }, + "values": { + "description": "A list of strings to do comparisons against", + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "datagroup": { + "description": "Reference to a data-group containing the values", + "$ref": "#/definitions/Datagroup_Value" + }, + "caseSensitive": { + "description": "Specifies if the comparison the system should perform with case sensitivity", + "type": "boolean", + "default": false + } + }, + "dependencies": { + "operand": { + "if": { + "allOf": [ + { + "properties": { + "operand": { + "not": { + "const": "exists" + } + } + } + }, + { + "properties": { + "operand": { + "not": { + "const": "does-not-exist" + } + } + } + } + ] + }, + "then": { + "oneOf": [ + { + "required": [ + "values" + ] + }, + { + "required": [ + "datagroup" + ] + } + ] + } + } + }, + "additionalProperties": false + }, + "Policy_Compare_Number": { + "description": "Perform a comparison against number values", + "type": "object", + "properties": { + "operand": { + "description": "Specifies the comparison the system should perform with values", + "type": "string", + "enum": [ + "equals", + "does-not-equal", + "less", + "greater", + "less-or-equal", + "greater-or-equal" + ], + "default": "equals" + }, + "values": { + "description": "A list of numbers to do comparisons against", + "type": "array", + "items": { + "type": "integer" + }, + "minItems": 1 + } + }, + "required": [ + "values" + ], + "additionalProperties": false + }, + "Policy_Match_String": { + "description": "Perform a comparison that either matches or does-not-match", + "type": "object", + "properties": { + "operand": { + "description": "Specifies the comparison", + "type": "string", + "enum": [ + "matches", + "does-not-match" + ], + "default": "matches" + }, + "values": { + "description": "A list of strings to compare against", + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "datagroup": { + "description": "Reference to a data-group containing the values", + "$ref": "#/definitions/Datagroup_Value" + } + }, + "oneOf": [ + { + "required": [ + "values" + ] + }, + { + "required": [ + "datagroup" + ] + } + ], + "additionalProperties": false + }, + "Datagroup_Value": { + "description": "Reference to a data-group containing the values", + "type": "object", + "properties": { + "bigip": { + "title": "BIG-IP Data-Group", + "description": "Pathname of existing BIG-IP Data-Group", + "type": "string", + "format": "f5bigip" + }, + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to Data_Group", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Data_Group" + } + }, + "required": [ + "class" + ] + } + } + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm data-group internal" + ] + } + }, + "Bandwidth_Control_Policy": { + "title": "Bandwidth_Control_Policy", + "description": "Create a listener to specify how to handle traffic for policy enforcement", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Bandwidth_Control_Policy" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "dynamicControlEnabled": { + "description": "Specifies whether the policy is a static or dynamic policy. When enabled, the policy is dynamic, and additional settings are available. A dynamic policy enforces the specified maximum user rate and flow fairness for all traffic associated with the policy and for each session. The default is disabled, which indicates a static policy. A static policy enforces the maximum rate for combined traffic and does not guarantee fairness bandwidth for each session.", + "type": "boolean", + "default": false + }, + "maxBandwidth": { + "description": "Specifies the maximum amount of bandwidth that traffic associated with the bandwidth control policy can use. The range is from 1 Mbps to 320 Gbps (between 1000000 bps and 320000000000 bps.", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709552000 + }, + "maxBandwidthUnit": { + "description": "Specifies the units used by the maxBandwidth property", + "type": "string", + "enum": [ + "bps", + "Kbps", + "Mbps", + "Gbps" + ], + "default": "Mbps" + }, + "maxUserBandwidth": { + "description": "Specifies the maximum amount of bandwidth that each session associated with the bandwidth control policy can use. The range is from 5 Kbps to 2 Gbps. Note: For FTP traffic, the throughput is roughly half of this setting, because the FTP protocol creates two connections per user: a control connection and a data connection.", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709552000, + "default": 0 + }, + "maxUserBandwidthUnit": { + "description": "Specifies the units used by the maxUserBandwidth property", + "type": "string", + "enum": [ + "bps", + "Kbps", + "Mbps", + "Gbps" + ], + "default": "Mbps" + }, + "maxUserPPS": { + "description": "Specifies the limiter in packets per second that traffic is allowed per instance. It functions as a DoS limiter without fair share allocation. The system applies whichever value is lower, between this value and the specified Maximum Rate Per User. When both values are specified, both must pass for packets to go through. You can specify the rate in packets per second (PPS), kilo packets per second (KPPS), mega packets per second (MPPS), or giga packets per second (GPPS). The default value is 0 (not configured).", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709552000, + "default": 0 + }, + "maxUserPPSUnit": { + "description": "Specifies the units used by the maxUserBandwidthPPS property", + "type": "string", + "enum": [ + "bpps", + "Kpps", + "Mpps", + "Gpps" + ], + "default": "Mpps" + }, + "loggingEnabled": { + "description": "Specifies whether the system measures bandwidth on all future instances of this bandwidth control policy. When enabled, the system measures bandwidth and sends it to the log publisher specified by the logPublisher setting. You can override this setting using iRules. For example, if you want measurement on only some instances, keep this setting disabled, and use iRules to enable measurement on specific instances.", + "type": "boolean", + "default": false + }, + "logPublisher": { + "$ref": "#/definitions/Pointer_Log_Publisher" + }, + "logPeriod": { + "description": "Specifies the frequency, in milliseconds, with which the system generates bandwidth measurement logs", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709552000, + "default": 2048 + }, + "markIP": { + "description": "Specifies whether to mark traffic that exceeds the per-user limit by setting a Type of Service (ToS) bit in the IP headers of TCP packets associated with this bandwidth control policy. The default value is \"pass-through\", which means there is no change to the ToS bit. To set a ToS bit use a value from 0 to 63. If this setting is specified, the bandwidth policy is not enforced, but rather the packets are marked for a downstream system to process.", + "if": { + "type": "string" + }, + "then": { + "const": "pass-through" + }, + "else": { + "type": "integer", + "minimum": 0, + "maximum": 63 + }, + "default": "pass-through" + }, + "markL2": { + "description": "Specifies whether to mark traffic that exceeds the per-user limit by setting a Quality of Service (QoS) bit in the L2 headers of packets associated with this bandwidth control policy. The default value is \"pass-through\", which means there is no change to the QoS bit. To set a QoS bit use a value from 0 to 7. If this setting is specified, the bandwidth policy is not enforced, but rather the packets are marked for a downstream system to process.", + "if": { + "type": "string" + }, + "then": { + "const": "pass-through" + }, + "else": { + "type": "integer", + "minimum": 0, + "maximum": 7 + }, + "default": "pass-through" + }, + "categories": { + "description": "This specifies the categories under policy. Note: policy need to be enabled as dynamic to configure categories. Up to a maximum of 32 categories can be configured. All the categories under the dynamic policy share the bandwidth as specified for the category, up to a maximum of maxUserBandwidth.", + "additionalProperties": { + "$ref": "#/definitions/Bandwidth_Control_Policy_Category" + } + } + }, + "required": [ + "class", + "maxBandwidth" + ], + "if": { + "required": [ + "dynamicControlEnabled" + ], + "properties": { + "dynamicControlEnabled": { + "const": true + } + } + }, + "then": { + "required": [ + "maxUserBandwidth" + ] + }, + "additionalProperties": false + }, + "Idle_Timeout_Policy": { + "title": "Idle_Timeout_Policy", + "description": "Destination port based idle timeout policy", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Idle_Timeout_Policy" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "rules": { + "description": "List of idle timeout rules", + "type": "array", + "items": { + "$ref": "#/definitions/Idle_Timeout_Rule" + } + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "Idle_Timeout_Rule": { + "description": "Idle timeout rule", + "type": "object", + "properties": { + "name": { + "description": "Idle timeout rule name", + "type": "string", + "pattern": "^[A-Za-z_][0-9A-Za-z_/-]*$", + "maxLength": 64 + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "protocol": { + "type": "string", + "allOf": [ + { + "$ref": "#/definitions/Enum_Protocols_Idle_Timeout_Policy" + } + ], + "default": "all-other" + }, + "destinationPorts": { + "type": "array", + "description": "List of ports, port ranges (for example, 80, \"8080-8090\"), or \"all-other\".", + "items": { + "type": [ + "integer", + "string" + ] + }, + "minItems": 1 + }, + "idleTimeout": { + "description": "Idle timeout in seconds", + "type": [ + "integer", + "string" + ], + "oneOf": [ + { + "type": "integer" + }, + { + "type": "string", + "enum": [ + "immediate", + "indefinite", + "unspecified" + ] + } + ], + "default": "unspecified" + } + }, + "required": [ + "name" + ], + "additionalProperties": false + }, + "Bandwidth_Control_Policy_Category": { + "description": "Create a listener to specify how to handle traffic for policy enforcement", + "type": "object", + "properties": { + "remark": { + "$ref": "#/definitions/Remark" + }, + "maxBandwidth": { + "description": "Specifies the maximum bandwidth that this category of traffic can use when associated with this bandwidth control policy. The range is from 5 kbps to the value set for Maximum Rate Per User.", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709552000 + }, + "maxBandwidthUnit": { + "description": "Specifies the units used by the maxBandwidth property", + "type": "string", + "enum": [ + "bps", + "Kbps", + "Mbps", + "Gbps", + "%" + ], + "default": "Mbps" + }, + "markIP": { + "description": "Specifies whether to mark traffic that exceeds the per-user limit by setting a Type of Service (ToS) bit in the IP headers of TCP packets associated with this bandwidth control policy. The default value is \"pass-through\", which means there is no change to the ToS bit. To set a ToS bit use a value from 0 to 63. If this setting is specified, the bandwidth policy is not enforced, but rather the packets are marked for a downstream system to process.", + "if": { + "type": "string" + }, + "then": { + "const": "pass-through" + }, + "else": { + "type": "integer", + "minimum": 0, + "maximum": 63 + }, + "default": "pass-through" + }, + "markL2": { + "description": "Specifies whether to mark traffic that exceeds the per-user limit by setting a Quality of Service (QoS) bit in the L2 headers of packets associated with this bandwidth control policy. The default value is \"pass-through\", which means there is no change to the QoS bit. To set a QoS bit use a value from 0 to 7. If this setting is specified, the bandwidth policy is not enforced, but rather the packets are marked for a downstream system to process.", + "if": { + "type": "string" + }, + "then": { + "const": "pass-through" + }, + "else": { + "type": "integer", + "minimum": 0, + "maximum": 7 + }, + "default": "pass-through" + } + }, + "required": [ + "maxBandwidth" + ], + "additionalProperties": false + }, + "Net_Address_List": { + "title": "Net_Address_List", + "description": "You can use the address-list component to define reusable lists of addresses. This property requires a BIG-IP version of 14.1 or higher.", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Net_Address_List" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "addresses": { + "type": "array", + "description": "A list of IPv4 and IPv6 addresses and address ranges. You can specify a network with CIDR slash notation.", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "addressLists": { + "type": "array", + "description": "A list of other address lists (each by BIG-IP AS3 pointer or BIG-IP pathname).", + "items": { + "$ref": "#/definitions/Pointer_Net_Address_List" + }, + "minItems": 1 + } + }, + "required": [ + "class" + ], + "anyOf": [ + { + "required": [ + "addresses" + ] + }, + { + "required": [ + "addressLists" + ] + } + ], + "additionalProperties": false + }, + "Net_Port_List": { + "title": "Net_Port_List", + "description": "You can use the port-list component to define reusable lists of ports. This property requires a BIG-IP version of 14.1 or higher.", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Net_Port_List" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "ports": { + "type": "array", + "description": "A list of ports and port ranges (for example, 80, \"8080-8090\").", + "items": { + "type": [ + "integer", + "string" + ] + }, + "minItems": 1 + }, + "portLists": { + "type": "array", + "description": "A list of other port lists (each by BIG-IP AS3 pointer or BIG-IP pathname).", + "items": { + "$ref": "#/definitions/Pointer_Net_Port_List" + }, + "minItems": 1 + } + }, + "required": [ + "class" + ], + "anyOf": [ + { + "required": [ + "ports" + ] + }, + { + "required": [ + "portLists" + ] + } + ], + "additionalProperties": false + }, + "Enforcement_Policy": { + "title": "Enforcement_Policy", + "description": "Configures policies for the Policy Enforcement Manager (PEM)", + "f5PostProcess": { + "tag": "modules", + "data": [ + "pem" + ] + }, + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Enforcement_Policy" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "enable": { + "description": "Specifies the current status of the policy", + "type": "boolean", + "default": true + }, + "allTransactions": { + "description": "Specifies, when set to true, that the system enables policy enforcement for each http transaction. When set to false, the system allows only policy enforcement of the first http transaction.", + "type": "boolean", + "default": false + }, + "rules": { + "description": "Enforcement policy rules", + "type": "array", + "items": { + "$ref": "#/definitions/Enforcement_Rule" + } + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "Enforcement_Rule": { + "description": "A rule to match traffic flows and apply actions", + "type": "object", + "properties": { + "dscpMarkingDownlink": { + "description": "Specifies whether to set DSCP bits in the IP header of outgoing traffic to the subscriber", + "if": { + "type": "string" + }, + "then": { + "const": "pass-through" + }, + "else": { + "type": "integer", + "minimum": 0, + "maximum": 63 + }, + "default": "pass-through" + }, + "dscpMarkingUplink": { + "description": "Specifies whether to set DSCP bits in the IP header of outgoing traffic to the network", + "if": { + "type": "string" + }, + "then": { + "const": "pass-through" + }, + "else": { + "type": "integer", + "minimum": 0, + "maximum": 63 + }, + "default": "pass-through" + }, + "gateStatusEnabled": { + "description": "Specifies, when set to true, that the traffic can pass through the system without being changed. Select false to drop traffic that this rule applies to.", + "type": "boolean", + "default": true + }, + "interceptionEndpoint": { + "$ref": "#/definitions/Pointer_Enforcement_Interception_Endpoint" + }, + "iRule": { + "$ref": "#/definitions/Pointer_Enforcement_iRule" + }, + "l2MarkingDownlink": { + "description": "Set Layer-2 Quality of Service Marking in downlink traffic that matches a rule. Setting a L2 QoS Marking affects the packet delivery priority. The range is 0 to 7, or pass-through. The default value is pass-through, indicating the L2 QoS Marking of the packet will not be changed when the packet matches the rule.", + "if": { + "type": "string" + }, + "then": { + "const": "pass-through" + }, + "else": { + "type": "integer", + "minimum": 0, + "maximum": 7 + }, + "default": "pass-through" + }, + "l2MarkingUplink": { + "description": "Set Layer-2 Quality of Service Marking in uplink traffic that matches a rule. Setting a L2 QoS marking affects the packet delivery priority. The range is 0 to 7, or pass-through. The default value is pass-through, indicating the L2 QoS Marking of the packet will not be changed when the packet matches the rule.", + "if": { + "type": "string" + }, + "then": { + "const": "pass-through" + }, + "else": { + "type": "integer", + "minimum": 0, + "maximum": 7 + }, + "default": "pass-through" + }, + "name": { + "description": "The name of the policy rule.", + "type": "string" + }, + "precedence": { + "description": "Specifies an integer that indicates the precedence for the rule in relation to the other rules. Number 1 has the highest precedence. Rules with higher precedence (lower numbers) are evaluated before other rules with lower precedence (higher numbers).", + "type": "integer", + "minimum": 1, + "maximum": 4294967295 + }, + "qosBandwidthControllerUplink": { + "$ref": "#/definitions/Enforcement_Rule_QOS" + }, + "qosBandwidthControllerDownlink": { + "$ref": "#/definitions/Enforcement_Rule_QOS" + }, + "serviceChain": { + "$ref": "#/definitions/Pointer_Enforcement_Service_Chain_Endpoint" + }, + "tclFilter": { + "description": "Specifies the tcl expression which uses iRule commands to filter the packet. It is a match if tclFilter returns TRUE/1 or nomatch if FALSE/0.", + "type": "string" + }, + "tcpAnalyticsEnabled": { + "description": "Specifies the action to enable tcp analytics when the traffic flow matches the rule matching criteria", + "type": "boolean", + "default": false + }, + "tcpOptimizationDownlink": { + "$ref": "#/definitions/Pointer_TCP_Profile" + }, + "tcpOptimizationUplink": { + "$ref": "#/definitions/Pointer_TCP_Profile" + }, + "classificationFilters": { + "description": "Classification filters to apply to the traffic", + "type": "array", + "items": { + "$ref": "#/definitions/Enforcement_Rule_Classification_Filter" + } + }, + "DTOSTethering": { + "allOf": [ + { + "$ref": "#/definitions/Enforcement_Rule_DTOS_Tethering" + } + ], + "default": {} + }, + "flowInfoFilters": { + "description": "Flow information filters to apply to the traffic", + "type": "array", + "items": { + "$ref": "#/definitions/Enforcement_Rule_Flow_Filter" + } + }, + "forwarding": { + "$ref": "#/definitions/Enforcement_Rule_Forwarding" + }, + "insertContent": { + "$ref": "#/definitions/Enforcement_Rule_Insert_Content" + }, + "modifyHttpHeader": { + "$ref": "#/definitions/Enforcement_Rule_Modify_HTTP_Header" + }, + "qoeReporting": { + "$ref": "#/definitions/Enforcement_Rule_Report_Destination_HSL" + }, + "quota": { + "$ref": "#/definitions/Enforcement_Rule_Quota" + }, + "ranCongestion": { + "$ref": "#/definitions/Enforcement_Rule_Ran_Congestion" + }, + "usageReporting": { + "$ref": "#/definitions/Enforcement_Rule_Usage_Reporting" + }, + "urlCategorizationFilters": { + "description": "URL categorization filters to apply to the traffic", + "type": "array", + "items": { + "$ref": "#/definitions/Enforcement_Rule_URL_Categorization_Filter" + } + } + }, + "required": [ + "name", + "precedence" + ], + "additionalProperties": false + }, + "Enforcement_Rule_QOS": { + "description": "Specifies a previously configured bandwidth control policy to apply to traffic that matches this rule", + "type": "object", + "properties": { + "policy": { + "$ref": "#/definitions/Pointer_Bandwidth_Control_Policy" + }, + "category": { + "description": "Specifies a category of traffic within the bandwidth control policy to which to apply the rule. This option provides more specific rate control to a certain type of traffic. The category must be defined in the selected bandwidth control policy.", + "type": "string" + } + }, + "required": [ + "policy" + ], + "additionalProperties": false + }, + "Enforcement_Rule_DTOS_Tethering": { + "description": "Specifies options for device type, operating system, and tethering detection", + "type": "object", + "properties": { + "detectDtos": { + "description": "Specifies the detection of the subscriber's device and the operating system", + "type": "boolean", + "default": false + }, + "detectTethering": { + "description": "Specifies if you want to enable detection of tethering", + "type": "boolean", + "default": false + }, + "reportDestinationHsl": { + "$ref": "#/definitions/Enforcement_Rule_Report_Destination_HSL" + } + }, + "required": [], + "additionalProperties": false + }, + "Enforcement_Rule_Report_Destination_HSL": { + "description": "Specifies report destination and format", + "type": "object", + "properties": { + "highSpeedLogPublisher": { + "$ref": "#/definitions/Pointer_Log_Publisher" + }, + "formatScript": { + "$ref": "#/definitions/Pointer_Enforcement_Format_Script" + } + }, + "required": [], + "additionalProperties": false + }, + "Enforcement_Rule_Forwarding_ICAP": { + "description": "Specifies that the flow forwards to the ICAP virtual server", + "type": "object", + "properties": { + "icapType": { + "description": "Specifies the ICAP adaptation type", + "type": "string", + "enum": [ + "request", + "response", + "both" + ] + }, + "icapService": { + "description": "ICAP service to route to", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Service" + } + ] + } + }, + "required": [ + "icapType", + "icapService" + ] + }, + "Enforcement_Rule_Forwarding_Endpoint": { + "description": "Specifies that the flow steers to a different destination", + "type": "object", + "properties": { + "endpoint": { + "$ref": "#/definitions/Pointer_Enforcement_Forwarding_Endpoint" + } + }, + "required": [ + "endpoint" + ] + }, + "Enforcement_Rule_Forwarding_Route_To_Network": { + "description": "Specifies that the system forwards the flow to the default destination", + "type": "object", + "properties": {}, + "required": [] + }, + "Enforcement_Rule_Forwarding_HTTP": { + "description": "Specifies that traffic affected by this rule should be redirected to the specified URL", + "type": "object", + "properties": { + "redirectUrl": { + "description": "Specifies that traffic affected by this rule should be redirected to the specified URL", + "type": "string" + } + }, + "required": [ + "redirectUrl" + ] + }, + "Enforcement_Rule_Forwarding": { + "description": "Manages the forwarding action and its attributes", + "type": "object", + "properties": { + "type": { + "description": "Specifies the type of forwarding action", + "type": "string", + "enum": [ + "icap", + "endpoint", + "route-to-network", + "http" + ] + }, + "fallbackAction": { + "description": "Specifies if the connection can remain unchanged or should be dropped if the forwarding action fails for any reason", + "type": "string", + "enum": [ + "continue", + "drop" + ], + "default": "drop" + } + }, + "allOf": [ + { + "if": { + "properties": { + "type": { + "const": "icap" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Rule_Forwarding_ICAP" + } + }, + { + "if": { + "properties": { + "type": { + "const": "endpoint" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Rule_Forwarding_Endpoint" + } + }, + { + "if": { + "properties": { + "type": { + "const": "route-to-network" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Rule_Forwarding_Route_To_Network" + } + }, + { + "if": { + "properties": { + "type": { + "const": "http" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Rule_Forwarding_HTTP" + } + } + ], + "required": [ + "type" + ] + }, + "Enforcement_Rule_Insert_Content": { + "description": "Specifies the action to insert content into the webpage", + "type": "object", + "properties": { + "duration": { + "description": "Specifies the periodicity of the insert action in seconds", + "type": "integer", + "minimum": 1, + "maximum": 4294967295 + }, + "frequency": { + "description": "Specifies the number of content insertion actions per transaction", + "type": "string", + "enum": [ + "always", + "once", + "once-every" + ], + "default": "always" + }, + "position": { + "description": "Specifies position with respect to the configured tagName", + "type": "string", + "enum": [ + "append", + "prepend" + ], + "default": "append" + }, + "tagName": { + "description": "Specifies the tag name to which the content is either appended or prepended", + "type": "string" + }, + "valueContent": { + "description": "Specifies the value content to be inserted into the webpage", + "type": "string" + }, + "valueType": { + "description": "Specifies the type of content format used in the valueContent option", + "type": "string", + "enum": [ + "string", + "tcl-snippet" + ], + "default": "string" + } + }, + "dependencies": { + "duration": { + "properties": { + "frequency": { + "const": "once-every" + } + } + }, + "tagName": { + "required": [ + "valueContent" + ] + }, + "valueContent": { + "required": [ + "tagName" + ] + }, + "frequency": { + "if": { + "properties": { + "frequency": { + "const": "once-every" + } + } + }, + "then": { + "required": [ + "duration" + ] + } + } + }, + "required": [], + "additionalProperties": false + }, + "Enforcement_Rule_Modify_HTTP_Header": { + "description": "Specifies the action to modify the HTTP header when the traffic flow matches the rule matching criteria", + "type": "object", + "properties": { + "headerName": { + "description": "Specifies the HTTP header name used by the operation option to modify the HTTP header", + "type": "string" + }, + "operation": { + "description": "Specifies the operation used to modify the HTTP header", + "type": "string", + "enum": [ + "insert", + "remove" + ] + }, + "valueContent": { + "description": "Specifies the HTTP header value content used by the insert operation to modify the HTTP header", + "type": "string" + }, + "valueType": { + "description": "Specifies the type of content format used in the valueContent option", + "type": "string", + "enum": [ + "string", + "tcl-snippet" + ], + "default": "string" + } + }, + "dependencies": { + "valueContent": { + "properties": { + "operation": { + "const": "insert" + } + } + }, + "valueType": { + "properties": { + "operation": { + "const": "insert" + } + } + } + }, + "if": { + "properties": { + "operation": { + "const": "insert" + } + } + }, + "then": { + "required": [ + "valueContent" + ] + }, + "required": [ + "headerName", + "operation" + ], + "additionalProperties": false + }, + "Enforcement_Rule_Quota": { + "description": "Specify quota management options", + "type": "object", + "properties": { + "ratingGroup": { + "$ref": "#/definitions/Pointer_Enforcement_Rating_Group" + }, + "reportingLevel": { + "description": "Specifies the quota reporting level", + "type": "string", + "enum": [ + "rating-group", + "service-id" + ], + "default": "rating-group" + } + }, + "dependencies": { + "ratingGroup": { + "properties": { + "reportingLevel": { + "const": "rating-group" + } + } + } + }, + "required": [], + "additionalProperties": false + }, + "Enforcement_Rule_Ran_Congestion": { + "description": "Detect congestion in the Radio Access Network", + "type": "object", + "properties": { + "threshold": { + "description": "Specifies lower threshold bandwidth (in kbps) for a session to be marked as congested", + "type": "integer", + "minimum": 0, + "maximum": 2147483647, + "default": 1000 + }, + "reportDestinationHsl": { + "$ref": "#/definitions/Enforcement_Rule_Report_Destination_HSL" + } + }, + "required": [], + "additionalProperties": false + }, + "Enforcement_Rule_Usage_Reporting": { + "description": "Send reporting data concerning traffic affected by this rule to either an external analytics system or to a PCRF over a Gx interface", + "type": "object", + "properties": { + "destination": { + "description": "Specifies where to send the usage monitoring data", + "type": "string", + "enum": [ + "gx", + "sd", + "hsl", + "radius-accounting" + ] + }, + "granularity": { + "description": "Specifies the type of reporting that will be generated when the policy applies", + "type": "string", + "enum": [ + "flow", + "session", + "transaction" + ], + "default": "session" + }, + "interval": { + "description": "Specifies the time interval when the report will be generated, in seconds. A value of 0 indicates this feature is disabled.", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "volume": { + "$ref": "#/definitions/Enforcement_Rule_Usage_Reporting_Volume" + }, + "transaction": { + "$ref": "#/definitions/Enforcement_Rule_Usage_Reporting_Transaction" + } + }, + "allOf": [ + { + "if": { + "properties": { + "destination": { + "const": "gx" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Rule_Usage_Gx" + } + }, + { + "if": { + "properties": { + "destination": { + "const": "sd" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Rule_Usage_Sd" + } + }, + { + "if": { + "properties": { + "destination": { + "const": "hsl" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Rule_Usage_Hsl" + } + }, + { + "if": { + "properties": { + "destination": { + "const": "radius-accounting" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Rule_Usage_Radius" + } + }, + { + "if": { + "properties": { + "destination": { + "enum": [ + "gx", + "sd", + "radius-accounting" + ] + } + } + }, + "then": { + "properties": { + "granularity": { + "const": "session" + } + } + } + }, + { + "if": { + "properties": { + "destination": { + "enum": [ + "gx", + "sd" + ] + } + } + }, + "then": { + "properties": { + "interval": { + "const": 0 + } + } + } + }, + { + "if": { + "properties": { + "destination": { + "enum": [ + "hsl", + "radius-accounting" + ] + }, + "granularity": { + "enum": [ + "flow", + "session" + ] + } + } + }, + "then": { + "anyOf": [ + { + "properties": { + "interval": { + "minimum": 1 + } + }, + "required": [ + "interval" + ] + }, + { + "required": [ + "volume" + ] + } + ] + } + }, + { + "if": { + "properties": { + "destination": { + "const": "hsl" + }, + "granularity": { + "const": "transaction" + } + } + }, + "then": { + "properties": { + "interval": { + "const": 0 + } + } + } + } + ], + "dependencies": { + "transaction": { + "properties": { + "granularity": { + "const": "transaction" + } + } + } + }, + "required": [ + "destination" + ] + }, + "Enforcement_Rule_Usage_Reporting_Volume": { + "description": "Configures volume threshold settings", + "type": "object", + "properties": { + "downlink": { + "description": "Send reporting data if the number of octets to the client exceeds the threshold. A value of 0 indicates this feature is disabled.", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "total": { + "description": "Send reporting data if the total number of octets both to and from the client exceeds the threshold. A value of 0 indicates this feature is disabled.", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "uplink": { + "description": "Send reporting data if the number of octets from the client exceeds the threshold. A value of 0 indicates this feature is disabled.", + "type": "integer", + "minimum": 0, + "default": 0 + } + }, + "required": [], + "additionalProperties": false + }, + "Enforcement_Rule_Usage_Reporting_Transaction": { + "description": "Specifies policy enforcement configuration on transaction report for each HTTP transaction", + "type": "object", + "properties": { + "hostname": { + "description": "Specifies the maximum HTTP hostname string length option to include in the HTTP transaction report", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 0 + }, + "uri": { + "description": "Specifies the maximum HTTP URI string length option to include in the HTTP transaction report", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 256 + }, + "userAgent": { + "description": "Specifies the maximum HTTP user agent string length to include in the HTTP transaction report", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 0 + } + }, + "required": [], + "additionalProperties": false + }, + "Enforcement_Rule_Usage_Gx": { + "description": "Sends usage monitoring data to a PCRF over a Gx interface", + "type": "object", + "properties": { + "applicationReportingEnabled": { + "description": "Report APPLICATION_START and APPLICATION_END Event-Triggers when the application start/stop is detected", + "type": "boolean", + "default": false + }, + "monitoringKey": { + "description": "Specifies a string to use for usage monitoring indicating the portion of traffic that is accounted for in this dynamic policy and charging control (PCC) rule", + "type": "string" + } + }, + "required": [] + }, + "Enforcement_Rule_Usage_Sd": { + "description": "Sends usage monitoring data to a PCRF over a Sd interface", + "type": "object", + "properties": { + "applicationReportingEnabled": { + "description": "Report APPLICATION_START and APPLICATION_END Event-Triggers when the application start/stop is detected", + "type": "boolean", + "default": false + }, + "monitoringKey": { + "description": "Specifies a string to use for usage monitoring indicating the portion of traffic that is accounted for in this dynamic policy and charging control (PCC) rule", + "type": "string" + } + }, + "required": [ + "monitoringKey" + ] + }, + "Enforcement_Rule_Usage_Hsl": { + "description": "Sends reporting data to remote HSL servers", + "type": "object", + "properties": { + "publisher": { + "$ref": "#/definitions/Pointer_Log_Publisher" + }, + "formatScript": { + "$ref": "#/definitions/Pointer_Enforcement_Format_Script" + }, + "sessionReportingFields": { + "description": "Specifies the session fields and their order based on which messages should be published", + "type": "array", + "items": { + "type": "string", + "enum": [ + "3gpp-parameters", + "application-id", + "called-station-id", + "calling-station-id", + "concurrent-flows", + "downlink-volume", + "duration-seconds", + "last-record-sent", + "new-flows", + "observation-time-seconds", + "record-reason", + "record-type", + "report-id", + "report-version", + "subscriber-id", + "subscriber-id-type", + "successful-transactions", + "terminated-flows", + "timestamp-msec", + "total-transactions", + "uplink-volume" + ] + } + }, + "flowReportingFields": { + "description": "Specifies the flow fields and their order based on which messages should be published", + "type": "array", + "items": { + "type": "string", + "enum": [ + "application-id", + "destination-ip", + "destination-transport-port", + "downlink-volume", + "flow-end-milli-seconds", + "flow-end-seconds", + "flow-start-milli-seconds", + "flow-start-seconds", + "observation-time-seconds", + "protocol-identifier", + "record-type", + "report-id", + "report-version", + "route-domain", + "source-ip", + "source-transport-port", + "subscriber-id", + "subscriber-id-type", + "timestamp-msec", + "total-transactions", + "uplink-volume", + "url-category-id", + "vlan-id" + ] + } + }, + "transactionReportingFields": { + "description": "Specifies the transaction fields and their order based on which messages should be published", + "type": "array", + "items": { + "type": "string", + "enum": [ + "application-id", + "destination-ip", + "destination-transport-port", + "downlink-volume", + "http-hostname", + "http-hostname-truncated", + "http-response-code", + "http-url", + "http-url-truncated", + "http-user-agent", + "http-user-agent-truncated", + "protocol-identifier", + "record-type", + "report-id", + "report-version", + "route-domain", + "skipped-transactions", + "source-ip", + "source-transport-port", + "subscriber-id", + "subscriber-id-type", + "transaction-classification-result", + "transaction-end-milli-seconds", + "transaction-end-seconds", + "transaction-number", + "transaction-start-milli-seconds", + "transaction-start-seconds", + "uplink-volume", + "url-category-id", + "vlan-id" + ] + } + } + }, + "required": [ + "publisher" + ] + }, + "Enforcement_Rule_Usage_Radius": { + "description": "Specifies a RADIUS internal virtual server as a reporting destination", + "type": "object", + "properties": { + "radiusAAAService": { + "$ref": "#/definitions/Pointer_Service" + } + }, + "required": [ + "radiusAAAService" + ] + }, + "Enforcement_Rule_Classification_Filter": { + "description": "Defines the category or application (Layer 7) conditions that the traffic must meet (or not meet) for this enforcement policy rule to apply", + "type": "object", + "properties": { + "application": { + "$ref": "#/definitions/Pointer_Classification_Application" + }, + "category": { + "$ref": "#/definitions/Pointer_Classification_Category" + }, + "invertMatch": { + "description": "Specifies that a traffic flow should not match the condition", + "type": "boolean", + "default": false + }, + "name": { + "description": "The name of the classification filter.", + "type": "string" + } + }, + "required": [ + "name" + ], + "oneOf": [ + { + "required": [ + "application" + ] + }, + { + "required": [ + "category" + ] + } + ], + "additionalProperties": false + }, + "Enforcement_Rule_URL_Categorization_Filter": { + "description": "Defines the category of URL, which provides information about the content type requested by the subscriber", + "type": "object", + "properties": { + "category": { + "description": "Specifies which type of URL category you want the rule to affect", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Classification_Category" + } + ] + }, + "invertMatch": { + "description": "Specifies that a traffic flow should not match the condition", + "type": "boolean", + "default": false + }, + "name": { + "description": "The name of the URL categorization filter.", + "type": "string" + } + }, + "required": [ + "name", + "category" + ], + "additionalProperties": false + }, + "Enforcement_Rule_Flow_Filter": { + "description": "Defines the flow conditions (Layer 4) that the traffic must meet (or not meet) for this enforcement policy rule to apply", + "type": "object", + "properties": { + "name": { + "description": "The name of the flow filter.", + "type": "string" + }, + "invertMatch": { + "description": "Specifies that a traffic flow should not match the condition", + "type": "boolean", + "default": false + }, + "dscpMarking": { + "description": "Matches incoming traffic based on a value in the DSCP field in the IP header", + "oneOf": [ + { + "type": "integer", + "minimum": 0, + "maximum": 63 + }, + { + "type": "string", + "const": "disabled" + } + ], + "default": "disabled" + }, + "destinationAddress": { + "description": "Matches traffic going to a destination address or network", + "type": "string", + "default": "0.0.0.0/0" + }, + "destinationPort": { + "description": "Matches traffic headed to a destination port", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 0 + }, + "sourceVlan": { + "description": "Matches incoming traffic from a VLAN", + "allOf": [ + { + "$ref": "#/definitions/Pointer_VLAN" + } + ] + }, + "sourceAddress": { + "description": "Matches traffic coming from a source address or network", + "type": "string", + "default": "0.0.0.0/32" + }, + "sourcePort": { + "description": "Matches traffic coming from a source port", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 0 + }, + "protocol": { + "description": "Specifies the protocol of the traffic to which the rule applies", + "type": "string", + "enum": [ + "any", + "tcp", + "udp" + ], + "default": "any" + }, + "ipAddressType": { + "description": "Specifies the IP address type that this rule applies to", + "type": "string", + "enum": [ + "any", + "ipv4", + "ipv6" + ], + "default": "any" + } + }, + "required": [ + "name" + ], + "additionalProperties": false + }, + "Enforcement_Diameter_Endpoint_Profile": { + "title": "Enforcement_Diameter_Endpoint_Profile", + "description": "Create a listener to specify how to handle traffic for policy enforcement", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "pem" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Enforcement_Diameter_Endpoint_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "parentProfile": { + "description": "Specifies the name of the object to inherit the settings from", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Enforcement_Diameter_Endpoint_Profile" + } + ], + "default": { + "bigip": "/Common/diameter-endpoint" + } + }, + "destinationHost": { + "description": "Specifies the destination host name of the PCRF or external policy server, for example, pcrfdest.net.com", + "type": "string" + }, + "destinationRealm": { + "description": "Specifies the realm name or network of the PCRF, for example, net.com", + "type": "string" + }, + "fatalGraceTime": { + "description": "Specifies the time period in seconds that a diameter (PCRF) connection can be disconnected before the system clears all subscriber session information associated with that diameter endpoint. If the connection is re-established within the fatal grace time period, session information is not cleared. A value of 0 means if the PCRF is disconnected, session information is cleared immediately.", + "type": "integer", + "minimum": 0, + "default": 500 + }, + "messageMaxRetransmits": { + "description": "Specifies the maximum number of times that messages can be retransmitted from the BIG-IP system to the PCRF", + "type": "integer", + "minimum": 0, + "default": 2 + }, + "messageRetransmitDelay": { + "description": "Specifies the number of milliseconds to wait before retransmitting unanswered messages in case of failure from the BIG-IP system to the PCRF over the Gx interface", + "type": "integer", + "minimum": 0, + "default": 1500 + }, + "originHost": { + "description": "Specifies the host name of the PCRF or external policy server, for example, pcrf.xnet.com", + "type": "string" + }, + "originRealm": { + "description": "Specifies the realm name or network in which the PCRF resides, for example, xnet.com", + "type": "string" + }, + "protocolProfileGx": { + "description": "Specifies the protocol profile to be used when you enable subscriber discovery. The PEM protocol profile defines mapping of Diameter Gx AVPs to subscriber ID and other PEM subscriber session attributes. The default BIG-IP reference values vary between versions. BIGIP versions 14.1 and above begin with 'sys_diam' (e.g. _sys_diam_proto_default).", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Enforcement_Profile_Gx" + } + ] + }, + "productName": { + "description": "Specifies the value of the string used in the product name attribute value pair (AVP), in capabilities exchange message in the diameter when communicating with the PCRF", + "type": "string", + "default": "BIG-IP" + }, + "supportedApps": { + "description": "Specifies the diameter endpoint you would like to provision. You can select Gx, Gy or SD. Gx and SD are mutually exclusive.", + "type": "array", + "items": { + "type": "string", + "enum": [ + "Gx", + "Gy", + "Sd" + ] + }, + "minItems": 1, + "uniqueItems": true + } + }, + "required": [ + "class", + "supportedApps" + ], + "additionalProperties": false + }, + "Enforcement_iRule": { + "title": "Enforcement_iRule", + "description": "Specifies or configures an iRule for use in Enforcement Policies", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Enforcement_iRule" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "expand": { + "title": "Expand", + "description": "If true (default), expand backquoted variables in iRule", + "type": "boolean", + "default": true + }, + "iRule": { + "$ref": "#/definitions/IRule_Core" + } + }, + "additionalProperties": false, + "required": [ + "class", + "iRule" + ] + }, + "Enforcement_Radius_AAA_Profile": { + "title": "Enforcement_Radius_AAA_Profile", + "description": "Configures a radius AAA profile", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "pem" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Enforcement_Radius_AAA_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "parentProfile": { + "description": "Specifies the name of the object to inherit the settings from", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Enforcement_Radius_AAA_Profile" + } + ], + "default": { + "bigip": "/Common/radiusaaa" + } + }, + "retransmissionTimeout": { + "description": "The number of seconds to wait before resending authentication or accounting transaction messages to the RADIUS server", + "type": "integer", + "minimum": 0, + "maximum": 60, + "default": 5 + }, + "sharedSecret": { + "description": "Specifies the shared secret of the RADIUS server used for authentication or accounting", + "type": "object", + "properties": { + "allowReuse": { + "description": "If true, other declaration objects may reuse this value", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Secret" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "object" + } + }, + { + "f5PostProcess": { + "tag": "secret" + } + } + ] + }, + "password": { + "description": "The password of the RADIUS AAA profile for RADIUS server authentication", + "type": "object", + "properties": { + "allowReuse": { + "description": "If true, other declaration objects may reuse this value", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Secret" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "object" + } + }, + { + "f5PostProcess": { + "tag": "secret" + } + } + ] + }, + "transactionTimeout": { + "description": "The number of seconds to wait before resending authentication or accounting transaction messages to the RADIUS server", + "type": "integer", + "minimum": 5, + "maximum": 300, + "default": 30 + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "Enforcement_Profile": { + "title": "Enforcement_Profile", + "description": "Configures a subscriber policy manager profile", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "pem" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Enforcement_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "parentProfile": { + "description": "Specifies the name of the object to inherit the settings from", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Enforcement_Profile" + } + ], + "default": { + "bigip": "/Common/spm" + } + }, + "policiesGlobalHighPrecedence": { + "description": "Adds, deletes, or replaces a set of the policies", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Enforcement_Policy" + } + }, + "policiesGlobalLowPrecedence": { + "description": "Adds, deletes, or replaces a set of the policies", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Enforcement_Policy" + } + }, + "policiesUnknownSubscribers": { + "description": "Adds, deletes, or replaces a set of the policies", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Enforcement_Policy" + } + }, + "connectionOptimizationEnabled": { + "description": "Specifies whether connection optimization is enabled or not", + "type": "boolean", + "default": true + }, + "connectionOptimizationService": { + "$ref": "#/definitions/Pointer_Service" + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "Enforcement_Subscriber_Management_Profile": { + "title": "Enforcement_Subscriber_Management_Profile", + "description": "Configures a subscriber management profile", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "pem" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Enforcement_Subscriber_Management_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "parentProfile": { + "description": "Specifies the name of the object to inherit the settings from", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Enforcement_Subscriber_Management_Profile" + } + ], + "default": { + "bigip": "/Common/subscriber-mgmt" + } + }, + "dhcpLeaseQuery": { + "$ref": "#/definitions/Enforcement_Subscriber_Management_Profile_DHCP" + }, + "serverSideSessionsEnabled": { + "description": "Specifies the session is created based on server side IP when the server side traffic comes and is enabled", + "type": "boolean", + "default": true + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "Enforcement_Subscriber_Management_Profile_DHCP": { + "description": "Configures DHCP lease query settings for a subscriber management profile", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "pem" + ] + }, + "properties": { + "enabled": { + "description": "Specifies the subscriber management settings use DHCP lease query to communicate with DHCP servers to obtain DHCP lease information for the unknown IP address and creates a new policy enforcement session using the lease information received", + "type": "boolean", + "default": true + }, + "service": { + "$ref": "#/definitions/Pointer_Service" + } + }, + "required": [ + "service" + ], + "additionalProperties": false + }, + "Enforcement_Listener": { + "title": "Enforcement_Listener", + "description": "Configures an enforcement data plane listener", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "pem" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Enforcement_Listener" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "enforcementProfile": { + "$ref": "#/definitions/Pointer_Enforcement_Profile" + }, + "subscriberManagementProfile": { + "$ref": "#/definitions/Pointer_Enforcement_Subscriber_Management_Profile" + }, + "services": { + "description": "A set of virtual servers", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Service" + }, + "minItems": 1 + } + }, + "required": [ + "class", + "enforcementProfile", + "services" + ], + "additionalProperties": false + }, + "Enforcement_Interception_Endpoint": { + "title": "Enforcement_Interception_Endpoint", + "description": "Configures an interception endpoint to clone all traffic", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "pem" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Enforcement_Interception_Endpoint" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "persistence": { + "description": "Specifies the persistence that is based on either the source or destination IP addresses only", + "type": "string", + "enum": [ + "destination-ip", + "source-ip", + "disabled" + ], + "default": "disabled" + }, + "pool": { + "$ref": "#/definitions/Pointer_Pool" + } + }, + "required": [ + "class", + "pool" + ], + "additionalProperties": false + }, + "Enforcement_Format_Script": { + "title": "Enforcement_Format_Script", + "description": "Specifies a script using TCL syntax that defines a custom format for HSL reporting applied in an enforcement policy rule. The format and fields available differ depending on whether you are using session-based or flow-based reporting in the rule.", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "pem" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Enforcement_Format_Script" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "definition": { + "description": "TCL script text", + "type": "string" + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "Enforcement_Forwarding_Endpoint": { + "title": "Enforcement_Forwarding_Endpoint", + "description": "Configures an forwarding endpoint to specify PEM policy forwarding actions", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "pem" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Enforcement_Forwarding_Endpoint" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "pool": { + "$ref": "#/definitions/Pointer_Pool" + }, + "SNATPool": { + "$ref": "#/definitions/Pointer_SNAT_Pool" + }, + "sourcePortAction": { + "description": "Specifies whether the system preserves the source port of the connection", + "type": "string", + "enum": [ + "change", + "preserve", + "preserve-strict" + ], + "default": "preserve" + }, + "addressTranslationEnabled": { + "description": "Specifies, when enabled, the system translates the original destination address of the virtual server. When disabled, specifies the system uses the address without translation.", + "type": "boolean", + "default": false + }, + "portTranslationEnabled": { + "description": "Specifies, when enabled, the system translates the original destination port. When disabled, specifies the system uses the original destination port without translation.", + "type": "boolean", + "default": false + }, + "defaultPersistenceType": { + "description": "Specifies a persistence method for the pool member selection. If you have multiple pool members and want specific traffic to go to the same pool member, select the appropriate IP address type.", + "type": "string", + "enum": [ + "destination-ip", + "disabled", + "hash", + "source-ip" + ], + "default": "disabled" + }, + "fallbackPersistenceType": { + "description": "Specifies the fallback persistence method that is applied when default persistence fails. If you have multiple pool members and want specific traffic to go to the same pool member, select the appropriate IP address type.", + "type": "string", + "enum": [ + "destination-ip", + "disabled", + "source-ip" + ], + "default": "disabled" + }, + "persistenceHashSettings": { + "allOf": [ + { + "$ref": "#/definitions/Enforcement_Forwarding_Endpoint_Hash_Settings" + } + ], + "default": {} + } + }, + "required": [ + "class", + "pool" + ], + "additionalProperties": false + }, + "Enforcement_Forwarding_Endpoint_Hash_Settings": { + "description": "Specifies the settings for the hash persistence method", + "type": "object", + "properties": { + "length": { + "description": "Specifies the length of the source string used to calculate the hash value", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 1024 + }, + "offset": { + "description": "Specifies the offset, in bytes, from start of the source string to calculate the hash value", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 0 + }, + "tclScript": { + "description": "The results from this TCL script are used to calculate the hash value. If no script is specified, the URI is used instead.", + "type": "string" + } + }, + "required": [], + "additionalProperties": false + }, + "Enforcement_Service_Chain_Endpoint": { + "title": "Enforcement_Service_Chain_Endpoint", + "description": "Configures service chain endpoint definitions for the Policy Enforcement Manager (PEM)", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Enforcement_Service_Chain_Endpoint" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "serviceEndpoints": { + "description": "Specifies a list of forwarding endpoints that define where to send traffic on the way to its final destination. This way, the system can route traffic to other servers that can provide value-added services. Traffic goes to the endpoints in the order in which they are listed.", + "type": "array", + "items": { + "$ref": "#/definitions/Enforcement_Service_Chain_Endpoint_Service_Endpoint" + } + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "Enforcement_Service_Chain_Endpoint_Service_Endpoint": { + "description": "Configures an individual service chain endpoint", + "type": "object", + "properties": { + "name": { + "description": "Specify the name of the service endpoint where the traffic is going to", + "type": "string" + }, + "forwardingEndpoint": { + "$ref": "#/definitions/Pointer_Enforcement_Forwarding_Endpoint" + }, + "sourceVLAN": { + "$ref": "#/definitions/Pointer_VLAN" + }, + "serviceOption": { + "description": "Specifies the service option in case the service endpoint is not accessible through the network, for forwarding endpoint. For ICAP service endpoint, the service endpoint works as a fallback action for non-HTTP traffic. Select \"optional\" if you want to skip the service endpoint. Select \"mandatory\" if you want all traffic flows dropped.", + "type": "string", + "enum": [ + "mandatory", + "optional" + ], + "default": "mandatory" + }, + "internalService": { + "description": "Specifies the internal ICAP virtual server", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Service" + } + ] + }, + "internalServiceICAPType": { + "description": "Specifies the ICAP adaptation type. Select \"request\" to send only HTTP requests to ICAP server. Select \"response\" to send only HTTP responses to ICAP server. Select \"both\" to have both requests and responses.", + "type": "string", + "enum": [ + "request", + "response", + "both", + "none" + ] + }, + "steeringPolicy": { + "$ref": "#/definitions/Pointer_Enforcement_Policy" + } + }, + "dependencies": { + "internalServiceICAPType": [ + "internalService" + ] + }, + "required": [ + "sourceVLAN" + ], + "additionalProperties": false + }, + "Pointer_Address_List": { + "description": "Reference to a firewall address list or net address list", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to firewall address list or net address list declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Firewall_Address_List", + "Net_Address_List" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP firewall address list or net address list", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security firewall address-list", + "query net address-list" + ] + } + } + ] + }, + "Pointer_Address_Discovery": { + "description": "Reference to a Address Discovery", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to Address Discovery declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Address_Discovery" + ] + } + }, + "required": [ + "class" + ] + } + } + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1 + }, + "Pointer_ALG_Log_Profile": { + "description": "Reference to a application layer gateway log profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to application layer gateway log profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "ALG_Log_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP application layer gateway log profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm alg-log-profile" + ] + } + } + ] + }, + "Pointer_API_Protection_Profile": { + "description": "Reference to a API_Protection_Profile", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP API_Protection_Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query api-protection profile apiprotection" + ] + } + } + ] + }, + "Pointer_Bandwidth_Control_Policy": { + "description": "Reference to a bandwidth control policy", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to bandwidth control policy declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Bandwidth_Control_Policy" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP bandwidth control policy", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query net bwc policy" + ] + } + } + ] + }, + "Pointer_Idle_Timeout_Policy": { + "description": "Reference to a idle timeout policy", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to idle timeout policy declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Idle_Timeout_Policy" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP idle timeout policy", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query net timer-policy" + ] + } + } + ] + }, + "Pointer_Denylist_Category": { + "description": "Reference to a denylist category", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP denylist category", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security ip-intelligence blacklist-category" + ] + } + } + ] + }, + "Pointer_Bot_Defense_Profile": { + "description": "Reference to a bot defense profile", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP bot defense profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security bot-defense profile" + ] + } + } + ] + }, + "Pointer_Bot_Signature": { + "description": "Reference to a bot signature", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP bot signature", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security dos bot-signature", + "query security bot-defense signature" + ] + } + } + ] + }, + "Pointer_Bot_Signature_Category": { + "description": "Reference to a bot signature category", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP bot signature category", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security dos bot-signature-category", + "query security bot-defense signature-category" + ] + } + } + ] + }, + "Pointer_Cipher_Group": { + "description": "Reference to a cipher group", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to cipher group declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Cipher_Group" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP cipher group", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm cipher group" + ] + } + } + ] + }, + "Pointer_Cipher_Rule": { + "description": "Reference to a cipher rule", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to cipher rule declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Cipher_Rule" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP cipher rule", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm cipher rule" + ] + } + } + ] + }, + "Pointer_Classification_Application": { + "description": "Reference to a application classification", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP application classification", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm classification application" + ] + } + } + ] + }, + "Pointer_Classification_Category": { + "description": "Reference to a category classification", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP category classification", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm classification category" + ] + } + } + ] + }, + "Pointer_Classification_Preset": { + "description": "Reference to a classification preset", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP classification preset", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm classification ce" + ] + } + } + ] + }, + "Pointer_Classification_Profile": { + "description": "Reference to a classification profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to classification profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Classification_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP classification profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile classification" + ] + } + } + ] + }, + "Pointer_DNS_Cache": { + "description": "Reference to a DNS cache", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to DNS cache declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "DNS_Cache" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP DNS cache", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm dns cache resolver", + "query ltm dns cache transparent", + "query ltm dns cache validating-resolver" + ] + } + } + ] + }, + "Pointer_Data_Group_File": { + "description": "Reference to a Data Group File", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP Data Group File", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys file data-group" + ] + } + } + ] + }, + "Pointer_Data_Group": { + "description": "Reference to a Data Group", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to Data Group declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Data_Group" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP Data Group", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm data-group internal", + "query ltm data-group external" + ] + } + } + ] + }, + "Pointer_DNS_Listener": { + "description": "Reference to a DNS Listener", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to DNS Listener declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "DNS_Listener" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP DNS Listener", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query gtm listener" + ] + } + } + ] + }, + "Pointer_DNS_Logging_Profile": { + "description": "Reference to a DNS logging profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to DNS logging profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "DNS_Logging_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP DNS logging profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile dns-logging" + ] + } + } + ] + }, + "Pointer_DNS_Nameserver": { + "description": "Reference to a DNS nameserver", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to DNS nameserver declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "DNS_Nameserver" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP DNS nameserver", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm dns nameserver" + ] + } + } + ] + }, + "Pointer_DNS_Profile": { + "description": "Reference to a DNS profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to DNS profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "DNS_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP DNS profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile dns" + ] + } + } + ] + }, + "Pointer_DNS_Security_Profile": { + "description": "Reference to a DNS security profile", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP DNS security profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security dns profile" + ] + } + } + ] + }, + "Pointer_DNS_TSIG_Key": { + "description": "Reference to a DNS TSIG key", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to DNS TSIG key declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "DNS_TSIG_Key" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP DNS TSIG key", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm dns tsig-key" + ] + } + } + ] + }, + "Pointer_DNS_Zone": { + "description": "Reference to a DNS zone", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to DNS zone declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "DNS_Zone" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP DNS zone", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm dns zone" + ] + } + } + ] + }, + "Pointer_DOS_Profile": { + "description": "Reference to a DOS Profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to DOS Profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "DOS_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP DOS Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security dos profile" + ] + } + } + ] + }, + "Pointer_Endpoint_Policy": { + "oneOf": [ + { + "description": "AS3 pointer to endpoint policy declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Endpoint_Policy" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + { + "description": "Reference to a endpoint policy", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to endpoint policy declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Endpoint_Policy" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP endpoint policy", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm policy" + ] + } + } + ] + } + ] + }, + "Pointer_Enforcement_Format_Script": { + "description": "Reference to a format script", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to format script declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Enforcement_Format_Script" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP format script", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query pem reporting format-script" + ] + } + } + ] + }, + "Pointer_Enforcement_Forwarding_Endpoint": { + "description": "Reference to a forwarding endpoint", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to forwarding endpoint declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Enforcement_Forwarding_Endpoint" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP forwarding endpoint", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query pem forwarding-endpoint" + ] + } + } + ] + }, + "Pointer_Enforcement_Interception_Endpoint": { + "description": "Reference to a interception endpoint", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to interception endpoint declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Enforcement_Interception_Endpoint" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP interception endpoint", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query pem interception-endpoint" + ] + } + } + ] + }, + "Pointer_Enforcement_iRule": { + "description": "Reference to a enforcement iRule", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to enforcement iRule declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Enforcement_iRule" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP PEM iRule", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query pem irule" + ] + } + } + ] + }, + "Pointer_Enforcement_Policy": { + "description": "Reference to a enforcement policy", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to enforcement policy declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Enforcement_Policy" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP PEM policy", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query pem policy" + ] + } + } + ] + }, + "Pointer_Enforcement_Diameter_Endpoint_Profile": { + "description": "Reference to a enforcement profile diameter endpoint", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to enforcement profile diameter endpoint declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Enforcement_Diameter_Endpoint_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP enforcement profile diameter endpoint", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query pem profile diameter-endpoint" + ] + } + } + ] + }, + "Pointer_Enforcement_Profile_Gx": { + "description": "Reference to a enforcement profile gx", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP enforcement profile gx", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query pem protocol profile gx" + ] + } + } + ] + }, + "Pointer_Enforcement_Radius_AAA_Profile": { + "description": "Reference to a enforcement profile radius aaa", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to enforcement profile radius aaa declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Enforcement_Radius_AAA_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP enforcement profile radius aaa", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query pem profile radius-aaa" + ] + } + } + ] + }, + "Pointer_Enforcement_Profile": { + "description": "Reference to a enforcement profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to enforcement profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Enforcement_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP PEM spm policy", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query pem profile spm" + ] + } + } + ] + }, + "Pointer_Enforcement_Rating_Group": { + "description": "Reference to a quota rating group", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP quota rating group", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query pem quota-mgmt rating-group" + ] + } + } + ] + }, + "Pointer_Enforcement_Service_Chain_Endpoint": { + "description": "Reference to a service chain endpoint", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to service chain endpoint declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Enforcement_Service_Chain_Endpoint" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP service chain endpoint", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query pem service-chain-endpoint" + ] + } + } + ] + }, + "Pointer_Enforcement_Subscriber_Management_Profile": { + "description": "Reference to a enforcement subscriber management profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to enforcement subscriber management profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Enforcement_Subscriber_Management_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP PEM subscriber-mgmt policy", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query pem profile subscriber-mgmt" + ] + } + } + ] + }, + "Pointer_Enforcement_Protocol_Profile_Radius": { + "description": "Reference to a radius protocol profile", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP radius protocol profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query pem protocol profile radius" + ] + } + } + ] + }, + "Pointer_Existing_TLS_Server_Profile": { + "description": "Reference to a TLS Server profile", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP TLS Server profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile client-ssl" + ] + } + } + ] + }, + "Pointer_Existing_TLS_Client_Profile": { + "description": "Reference to a TLS Client profile", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP TLS Client profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile server-ssl" + ] + } + } + ] + }, + "Pointer_Firewall_Address_List": { + "description": "Reference to a firewall address list", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to firewall address list declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Firewall_Address_List" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP firewall address list", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security firewall address-list" + ] + } + } + ] + }, + "Pointer_Firewall_Policy": { + "description": "Reference to a firewall (AFM) policy", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to firewall (AFM) policy declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Firewall_Policy" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP firewall (AFM) policy", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security firewall policy" + ] + } + } + ] + }, + "Pointer_Firewall_Port_List": { + "description": "Reference to a firewall port list", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to firewall port list declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Firewall_Port_List" + ] + } + }, + "required": [ + "class" + ] + } + } + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1 + }, + "Pointer_Firewall_Rule_List": { + "description": "Reference to a firewall rule list", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to firewall rule list declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Firewall_Rule_List" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP firewall rule list", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security firewall rule-list" + ] + } + } + ] + }, + "Pointer_FPS_Profile": { + "description": "Reference to a FPS Profile", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP FPS Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security anti-fraud profile" + ] + } + } + ] + }, + "Pointer_FTP_Profile": { + "description": "Reference to a FTP protocol profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to FTP protocol profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "FTP_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP FTP protocol profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile ftp" + ] + } + } + ] + }, + "Pointer_GSLB_Data_Center": { + "description": "Reference to a GSLB data center", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to GSLB data center declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "GSLB_Data_Center" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP GSLB data center", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query gtm datacenter" + ] + } + } + ] + }, + "Pointer_GSLB_Domain_A": { + "description": "Reference to a GSLB domain", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to GSLB domain declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "GSLB_Domain" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP GSLB domain", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query gtm wideip a" + ] + } + } + ] + }, + "Pointer_GSLB_Domain_AAAA": { + "description": "Reference to a GSLB domain", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to GSLB domain declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "GSLB_Domain" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP GSLB domain", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query gtm wideip aaaa" + ] + } + } + ] + }, + "Pointer_GSLB_Domain_CNAME": { + "description": "Reference to a GSLB domain", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to GSLB domain declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "GSLB_Domain" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP GSLB domain", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query gtm wideip cname" + ] + } + } + ] + }, + "Pointer_GSLB_Domain_MX": { + "description": "Reference to a GSLB domain", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to GSLB domain declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "GSLB_Domain" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP GSLB domain", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query gtm wideip mx" + ] + } + } + ] + }, + "Pointer_GSLB_Monitor": { + "description": "Reference to a GSLB monitor", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to GSLB monitor declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "GSLB_Monitor" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP GSLB monitor", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query gtm monitor bigip", + "query gtm monitor bigip-link", + "query gtm monitor external", + "query gtm monitor firepass", + "query gtm monitor ftp", + "query gtm monitor gateway-icmp", + "query gtm monitor gtp", + "query gtm monitor http", + "query gtm monitor https", + "query gtm monitor http2", + "query gtm monitor imap", + "query gtm monitor ldap", + "query gtm monitor mssql", + "query gtm monitor mysql", + "query gtm monitor nntp", + "query gtm monitor none", + "query gtm monitor oracle", + "query gtm monitor pop3", + "query gtm monitor postgresql", + "query gtm monitor radius", + "query gtm monitor radius-accounting", + "query gtm monitor real-server", + "query gtm monitor scripted", + "query gtm monitor sip", + "query gtm monitor smtp", + "query gtm monitor snmp", + "query gtm monitor snmp-link", + "query gtm monitor soap", + "query gtm monitor tcp", + "query gtm monitor tcp-half-open", + "query gtm monitor udp", + "query gtm monitor wap", + "query gtm monitor wmi" + ] + } + } + ] + }, + "Pointer_GSLB_Pool": { + "description": "Reference to a GSLB pool", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to GSLB pool declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "GSLB_Pool" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP GSLB pool", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query gtm pool a", + "query gtm pool aaaa", + "query gtm pool cname", + "query gtm pool mx" + ] + } + } + ] + }, + "Pointer_GSLB_Prober_Pool": { + "description": "Reference to a GSLB pool", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to GSLB pool declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "GSLB_Prober_Pool" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP GSLB pool", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query gtm prober-pool" + ] + } + } + ] + }, + "Pointer_GSLB_Server": { + "description": "Reference to a GSLB server", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to GSLB server declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "GSLB_Server" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP GSLB server", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query gtm server" + ] + } + } + ] + }, + "Pointer_GSLB_Server_Device": { + "description": "Reference to a GSLB server device", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to GSLB server device declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "GSLB_Server_Device" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP GSLB server device", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query gtm server devices" + ] + } + } + ] + }, + "Pointer_GSLB_Topology_Region": { + "description": "Reference to a GSLB Topology Region", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to GSLB Topology Region declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "GSLB_Topology_Region" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP GSLB Topology Region", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query gtm region" + ] + } + } + ] + }, + "Pointer_GSLB_Virtual_Server": { + "description": "Reference to a GSLB virtual server", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to GSLB virtual server declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "GSLB_Virtual_Server" + ] + } + }, + "required": [ + "class" + ] + } + } + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1 + }, + "Pointer_HTML_Profile": { + "description": "Reference to a HTML_Profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to HTML_Profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "HTML_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP HTML_Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile html" + ] + } + } + ] + }, + "Pointer_HTML_Rule": { + "description": "Reference to a HTML_Rule", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to HTML_Rule declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "HTML_Rule" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP HTML_Rule", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm html-rule comment-raise-event", + "query ltm html-rule comment-remove", + "query ltm html-rule tag-append-html", + "query ltm html-rule tag-prepend-html", + "query ltm html-rule tag-raise-event", + "query ltm html-rule tag-remove", + "query ltm html-rule tag-remove-attribute" + ] + } + } + ] + }, + "Pointer_HTTP2_Profile": { + "description": "Reference to a HTTP/2 Profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to HTTP/2 Profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "HTTP2_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP HTTP/2 Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile http2" + ] + } + } + ] + }, + "Pointer_ILX_Profile": { + "description": "Reference to a iRules LX Profile", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP iRules LX Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile ilx" + ] + } + } + ] + }, + "Pointer_Integrated_Bot_Defense_Profile": { + "description": "Reference to a Integrated Bot Defense Profile", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP Integrated Bot Defense Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query saas bd profile" + ] + } + } + ] + }, + "Pointer_IP_Intelligence_Policy": { + "description": "Reference to a IP Intelligence Policy", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP IP Intelligence Policy", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security ip-intelligence policy" + ] + } + } + ] + }, + "Pointer_NAT_Source_Translation": { + "description": "Reference to a NAT Source Translation", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to NAT Source Translation declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "NAT_Source_Translation" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP NAT Source Translation", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security nat source-translation" + ] + } + } + ] + }, + "Pointer_Net_Address_List": { + "description": "Reference to a net address list", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to net address list declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Net_Address_List" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP net address list", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query net address-list" + ] + } + } + ] + }, + "Pointer_Net_Port_List": { + "description": "Reference to a net port list", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to net port list declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Net_Port_List" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP net port list", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query net port-list" + ] + } + } + ] + }, + "Pointer_Persist_Profile": { + "description": "Reference to a Persist Profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to Persist Profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Persist" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP Persist Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm persistence cookie", + "query ltm persistence dest-addr", + "query ltm persistence hash", + "query ltm persistence host", + "query ltm persistence msrdp", + "query ltm persistence sip", + "query ltm persistence source-addr", + "query ltm persistence ssl", + "query ltm persistence universal" + ] + } + } + ] + }, + "Pointer_RTSP_Profile": { + "description": "Reference to a Real Time Streaming Protocol Profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to Real Time Streaming Protocol Profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "RTSP_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP Real Time Streaming Protocol Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile rtsp" + ] + } + } + ] + }, + "Pointer_Access_Profile": { + "description": "Reference to a Access Profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to Access Profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Access_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP Access Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query apm profile access" + ] + } + } + ] + }, + "Pointer_Per_Request_Access_Policy": { + "description": "Reference to a Per Request Access Policy", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to Per Request Access Policy declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Per_Request_Access_Policy" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP Per Request Access Policy", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query apm policy access-policy" + ] + } + } + ] + }, + "Pointer_Connectivity_Profile": { + "description": "Reference to a Connectivity Profile", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP Connectivity Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query apm profile connectivity" + ] + } + } + ] + }, + "Pointer_IP_Other_Profile": { + "description": "Reference to a ipother profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to ipother profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "IP_Other_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP ipother profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile ipother" + ] + } + } + ] + }, + "Pointer_Radius_Profile": { + "description": "Reference to a radius profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to radius profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Radius_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP radius profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile radius" + ] + } + } + ] + }, + "Pointer_Persist": { + "description": "Reference to a persistence profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to persistence profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Persist" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP persistence profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm persistence" + ] + } + } + ] + }, + "Pointer_Analytics_Profile": { + "description": "Reference to a Analytics_Profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to Analytics_Profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Analytics_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP Analytics_Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile analytics" + ] + } + } + ] + }, + "Pointer_Analytics_TCP_Profile": { + "description": "Reference to a Analytics_TCP_Profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to Analytics_TCP_Profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Analytics_TCP_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP Analytics_TCP_Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile tcp-analytics" + ] + } + } + ] + }, + "Pointer_FIX_Profile": { + "description": "Reference to a FIX profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to FIX profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "FIX_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP FIX profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile fix" + ] + } + } + ] + }, + "Pointer_ICAP_Profile": { + "description": "Reference to a ICAP Profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to ICAP Profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "ICAP_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP ICAP Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile icap" + ] + } + } + ] + }, + "Pointer_Multiplex_Profile": { + "description": "Reference to a Multiplex profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to Multiplex profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Multiplex_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP Multiplex profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile one-connect" + ] + } + } + ] + }, + "Pointer_NTLM_Profile": { + "description": "Reference to a NT LAN Manager profile", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP NT LAN Manager profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile ntlm" + ] + } + } + ] + }, + "Pointer_PPTP_Profile": { + "description": "Reference to a PPTP_Profile", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP PPTP_Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile pptp" + ] + } + } + ] + }, + "Pointer_Rewrite_Profile": { + "description": "Reference to a Rewrite Profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to Rewrite Profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Rewrite_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP Rewrite Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile rewrite" + ] + } + } + ] + }, + "Pointer_Protocol_Inspection_Profile": { + "description": "Reference to a Protocol Inspection Profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to Protocol Inspection Profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Protocol_Inspection_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP Protocol Inspection Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security protocol-inspection profile" + ] + } + } + ] + }, + "Pointer_Statistics_Profile": { + "description": "Reference to a Statistics Profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to Statistics Profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Statistics_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP Statistics Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile statistics" + ] + } + } + ] + }, + "Pointer_TCP_Profile": { + "description": "Reference to a TCP profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to TCP profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "TCP_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP TCP profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile tcp" + ] + } + } + ] + }, + "Pointer_TLS_Client": { + "description": "Reference to a TLS Client", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to TLS Client declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "TLS_Client" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP TLS Client", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile server-ssl" + ] + } + } + ] + }, + "Pointer_Port_List": { + "description": "Reference to a firewall port list or net port list", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to firewall port list or net port list declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Firewall_Port_List", + "Net_Port_List" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP firewall port list or net port list", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security firewall port-list", + "query net port-list" + ] + } + } + ] + }, + "Pointer_Request_Adapt_Profile": { + "description": "Reference to a Request Adapt Profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to Request Adapt Profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Adapt_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP Request Adapt Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile request-adapt" + ] + } + } + ] + }, + "Pointer_Response_Adapt_Profile": { + "description": "Reference to a Response Adapt Profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to Response Adapt Profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Adapt_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP Response Adapt Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile response-adapt" + ] + } + } + ] + }, + "Pointer_Route_Domain": { + "description": "Reference to a route domain", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP route domain", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query net route-domain" + ] + } + } + ] + }, + "Pointer_SCTP_Profile": { + "description": "Reference to a SCTP Profile", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP SCTP Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile sctp" + ] + } + } + ] + }, + "Pointer_Security_Log_Profile": { + "description": "Reference to a Security Log Profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to Security Log Profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Security_Log_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP Security Log Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security log profile" + ] + } + } + ] + }, + "Pointer_Service": { + "description": "Reference to a service", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to service declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Service_Forwarding", + "Service_HTTPS", + "Service_HTTP", + "Service_TCP", + "Service_UDP", + "Service_L4", + "Service_Generic" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP virtual server", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm virtual" + ] + } + } + ] + }, + "Pointer_SNAT_Pool": { + "description": "Reference to a snat pool", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to snat pool declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "SNAT_Pool" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP snat pool", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm snatpool" + ] + } + } + ] + }, + "Pointer_SNAT_Translation": { + "description": "Reference to a snat translation", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to snat translation declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "SNAT_Translation" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP snat translation", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm snat-translation" + ] + } + } + ] + }, + "Pointer_SOCKS_Profile": { + "description": "Reference to a SOCKS profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to SOCKS profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "SOCKS_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP SOCKS profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile socks" + ] + } + } + ] + }, + "Pointer_SSL_CRL_File": { + "description": "Reference to a SSL CRL file", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP SSL CRL file", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys file ssl-crl" + ] + } + } + ] + }, + "Pointer_Stream_Profile": { + "description": "Reference to a stream profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to stream profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Stream_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP stream profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile stream" + ] + } + } + ] + }, + "Pointer_TFTP_Profile": { + "description": "Reference to a TFTP profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to TFTP profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "TFTP_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP TFTP profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile tftp" + ] + } + } + ] + }, + "Pointer_Traffic_Log_Profile": { + "description": "Reference to a traffic log profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to traffic log profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Traffic_Log_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP Request Logging Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile request-log" + ] + } + } + ] + }, + "Pointer_Tunnel": { + "description": "Reference to a network tunnel", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP network tunnel", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query net tunnels endpoint", + "query net tunnels etherip", + "query net tunnels fec", + "query net tunnels fec-stat", + "query net tunnels geneve", + "query net tunnels gre", + "query net tunnels ipip", + "query net tunnels ipsec", + "query net tunnels lw4o6", + "query net tunnels map", + "query net tunnels ppp", + "query net tunnels tcp-forward", + "query net tunnels tunnel", + "query net tunnels v6rd", + "query net tunnels vxlan", + "query net tunnels wccp", + "query net vlan" + ] + } + } + ] + }, + "Pointer_Service_Address": { + "description": "Reference to a Service Address", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to Service Address declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Service_Address" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP Service Address", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm virtual-address" + ] + } + } + ] + }, + "Pointer_SSH_Proxy_Profile": { + "description": "Reference to a SSH proxy profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to SSH proxy profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "SSH_Proxy_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP SSH proxy profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security ssh profile" + ] + } + } + ] + }, + "Pointer_SIP_Profile": { + "description": "Reference to a SIP profile", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP SIP profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile sip" + ] + } + } + ] + }, + "Pointer_UDP_Profile": { + "description": "Reference to a UDP profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to UDP profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "UDP_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP UDP profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile udp" + ] + } + } + ] + }, + "Pointer_VDI_Profile": { + "description": "Reference to a VDI profile", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP VDI profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query apm profile vdi" + ] + } + } + ] + }, + "Pointer_VLAN": { + "description": "Reference to a VLAN", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP VLAN", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query net vlan" + ] + } + } + ] + }, + "Pointer_WAF_Policy": { + "description": "Reference to a WAF policy", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to WAF policy declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "WAF_Policy" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP WAF policy", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query asm policy" + ] + } + } + ] + }, + "Analytics_Profile": { + "title": "Analytics Profile", + "type": "object", + "description": "HTTP Analytics profile with configurable options", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Analytics_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "captureFilter": { + "allOf": [ + { + "$ref": "#/definitions/Capture_Filter" + } + ], + "default": {} + }, + "collectGeo": { + "title": "Collect Countries", + "description": "Specifies that the system collects statistics of the names of the countries from which that traffic was sent", + "type": "boolean", + "default": false + }, + "collectClientSideStatistics": { + "title": "Collect Client-Side Statistics", + "description": "Specifies that the system collects statistics regarding the HTTP request and response times", + "type": "boolean", + "default": false + }, + "collectUrl": { + "title": "Collect URL", + "description": "Specifies that the system collects statistics of requested URLs", + "type": "boolean", + "default": false + }, + "collectIp": { + "title": "Collect Client IP Addresses", + "description": "Specifies that the system collects statistics of the IP addresses of where the traffic came from", + "type": "boolean", + "default": false + }, + "collectSubnet": { + "title": "Collect Client Subnet", + "description": "Specifies that the system collects statistics of client subnets", + "type": "boolean", + "default": false + }, + "collectUserAgent": { + "title": "Collect User Agent", + "description": "Specifies that the system collects statistics about browsers used to send traffic", + "type": "boolean", + "default": false + }, + "collectOsAndBrowser": { + "title": "Collect Operating System and Browser", + "description": "Specifies that the system collect statistics about the OSs and Browsers used to send requests", + "type": "boolean", + "default": true + }, + "collectResponseCode": { + "title": "Collect Response Code", + "description": "Specifies that the system collects statistics about the distribution of HTTP response codes returned by the servers", + "type": "boolean", + "default": true + }, + "collectMethod": { + "title": "Collect Method", + "description": "Specifies that the system collects statistics about the distribution of HTTP methods found in requests", + "type": "boolean", + "default": true + }, + "collectMaxTpsAndThroughput": { + "title": "Collect Max TPS and Throughput", + "description": "Specifies that the system collects statistics for the maximum number of transactions per second, and the maximum amount of traffic moving through the system, both request and response throughput values", + "type": "boolean", + "default": false + }, + "collectPageLoadTime": { + "title": "Collect Page Load Time", + "description": "Specifies that the system collects statistics of the round-trip latency between client end-users and the servers", + "type": "boolean", + "default": false + }, + "collectUserSession": { + "title": "Collect User Sessions", + "description": "Specifies that the system collects statistics of the number of unique user sessions in the application traffic, as determined by the value of the configured HTTP cookies found in the requests", + "type": "boolean", + "default": false + }, + "collectedStatsInternalLogging": { + "title": "Collected Statistics Internal Logging", + "description": "Specifies that statistics logs are stored in the system", + "type": "boolean", + "default": true + }, + "collectedStatsExternalLogging": { + "title": "Collected Statistics External Logging", + "description": "Specifies that statistics logs are stored on a remote server", + "type": "boolean", + "default": false + }, + "capturedTrafficInternalLogging": { + "title": "Captured Traffic Internal Logging", + "description": "Specifies that the system captures a portion of the application traffic and sends it to a remote server", + "type": "boolean", + "default": false + }, + "capturedTrafficExternalLogging": { + "title": "Captured Traffic External Logging", + "description": "Specifies that the system captures a portion of the application traffic which can then be viewed on the System >> Logs >> Captured Transactions screen", + "type": "boolean", + "default": false + }, + "sessionCookieSecurity": { + "title": "Session Cookie Security", + "description": "Specify whether to secure session cookies", + "type": "string", + "enum": [ + "ssl-only", + "always-secure", + "never-secure" + ], + "default": "ssl-only" + }, + "sessionTimeoutMinutes": { + "title": "Session Timeout in Minutes", + "description": "The number of minutes of user non-activity ot allow before the system considers the session to be over", + "type": "integer", + "minimum": 5, + "maximum": 60, + "default": 5, + "multipleOf": 5 + }, + "externalLoggingPublisher": { + "$ref": "#/definitions/Pointer_Log_Publisher" + }, + "notificationBySyslog": { + "title": "Notification by syslog", + "description": "Specifies that the system sends notifications to the syslog", + "type": "boolean", + "default": false + }, + "notificationBySnmp": { + "title": "Notification by SNMP", + "description": "Specifies that the system sends notifications as SNMP traps", + "type": "boolean", + "default": false + }, + "notificationByEmail": { + "title": "Notification by Email", + "description": "Specifies that the system sends notifications by e-mail", + "type": "boolean", + "default": false + }, + "notificationEmailAddresses": { + "title": "E-mail Notification Recipients", + "description": "The e-mail addresses of a recipient to whom the system should send email notifications", + "type": "array", + "items": { + "title": "Email address", + "type": "string", + "format": "email" + }, + "uniqueItems": true + }, + "publishIruleStatistics": { + "title": "Publish iRule Statistics", + "description": "Specifies that the system collects and displays statistics according to the expressions written in an iRule", + "type": "boolean", + "default": false + }, + "urlsForStatCollection": { + "title": "URLs for Statistics Collection", + "description": "Specifies the requested URLs for collecting statistics", + "type": "array", + "items": { + "title": "URL", + "type": "string", + "f5PostProcess": { + "tag": "expand" + } + }, + "uniqueItems": true + }, + "countriesForStatCollection": { + "title": "Countries for Statistics Collection", + "description": "Specifies the countries for collecting statistics", + "type": "array", + "items": { + "$ref": "#/definitions/Enum_Country_Analytics" + } + }, + "subnetsForStatCollection": { + "title": "Subnets for Statistics Collection", + "description": "Specifies the requested subnets for collecting statistics", + "type": "array", + "items": { + "title": "Subnet", + "type": "string", + "format": "f5ip" + }, + "uniqueItems": true + } + }, + "dependencies": { + "urlsForStatCollection": { + "properties": { + "collectUrl": { + "const": true + } + } + }, + "countriesForStatCollection": { + "properties": { + "collectGeo": { + "const": true + } + } + }, + "subnetsForStatCollection": { + "properties": { + "collectSubnet": { + "const": true + } + } + } + }, + "required": [ + "class" + ], + "additionalProperties": false, + "f5PostProcess": { + "tag": "modules", + "data": [ + "avr" + ] + } + }, + "Analytics_TCP_Profile": { + "title": "Analytics TCP Profile", + "type": "object", + "description": "TCP Analytics profile with configurable options", + "properties": { + "class": { + "type": "string", + "const": "Analytics_TCP_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "collectCity": { + "title": "Collect City", + "description": "Specifies that the system saves the name of the city with which traffic was exchanged", + "type": "boolean", + "default": false + }, + "collectContinent": { + "title": "Collect Continent", + "description": "Specifies that the system saves the name of the continent with which traffic was exchanged", + "type": "boolean", + "default": true + }, + "collectCountry": { + "title": "Collect Country", + "description": "Specifies that the system saves the name of the country with which traffic was exchanged", + "type": "boolean", + "default": true + }, + "collectedByClientSide": { + "title": "Collected By Client Side", + "description": "Specifies that system collects statistics on the client side", + "type": "boolean", + "default": true + }, + "collectedByServerSide": { + "title": "Collected By Server Side", + "description": "Specifies that system collects statistics on the server side", + "type": "boolean", + "default": true + }, + "collectedStatsExternalLogging": { + "title": "Collected Statistics External Logging", + "description": "Specifies that statistics logs are stored on a remote server", + "type": "boolean", + "default": false + }, + "collectedStatsInternalLogging": { + "title": "Collected Statistics Internal Logging", + "description": "Specifies that statistics logs are stored in the system", + "type": "boolean", + "default": true + }, + "collectNexthop": { + "title": "Collect Next Hop Ethernet Address", + "description": "Specifies that the system saves the address to which the traffic is being routed", + "type": "boolean", + "default": false + }, + "collectPostCode": { + "title": "Collect Post Code", + "description": "Specifies that the system saves the name of the postcode with which traffic was exchanged", + "type": "boolean", + "default": false + }, + "collectRegion": { + "title": "Collect Region", + "description": "Specifies that the system saves the name of the region with which traffic was exchanged", + "type": "boolean", + "default": true + }, + "collectRemoteHostIp": { + "title": "Collect Remote Host IP", + "description": "Specifies that the system collects IP addresses with which traffic was exchanged", + "type": "boolean", + "default": false + }, + "collectRemoteHostSubnet": { + "title": "Collect Remote Host Subnet", + "description": "Specifies that the system saves the address of the subnet with which traffic was exchanged", + "type": "boolean", + "default": true + }, + "externalLoggingPublisher": { + "$ref": "#/definitions/Pointer_Log_Publisher" + } + }, + "required": [ + "class" + ], + "additionalProperties": false, + "f5PostProcess": { + "tag": "modules", + "data": [ + "avr" + ] + } + }, + "Basic_Auth": { + "title": "Basic Authentication", + "type": "object", + "description": "Describes the basic authentication to access a resource", + "properties": { + "method": { + "type": "string", + "description": "Specifies the authentication method", + "enum": [ + "basic" + ] + }, + "username": { + "description": "Specifies the user name for authentication", + "type": "string" + }, + "passphrase": { + "description": "Specifies the password for authentication", + "properties": { + "allowReuse": { + "type": "boolean", + "description": "If true, other declaration objects may reuse this value", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Property_Passphrase" + }, + { + "f5PostProcess": { + "data": "object", + "tag": "fetch" + } + } + ] + } + }, + "required": [ + "method", + "username", + "passphrase" + ], + "additionalProperties": false + }, + "Bearer_Token": { + "title": "Bearer Token Authorization", + "description": "Describes using a bearer token to access a resource", + "type": "object", + "properties": { + "method": { + "description": "Specifies the authentication method", + "type": "string", + "const": "bearer-token" + }, + "token": { + "description": "Specifies the bearer token", + "oneOf": [ + { + "type": "string", + "description": "plain text bearer token", + "minLength": 1 + }, + { + "type": "object", + "allOf": [ + { + "required": [ + "ciphertext" + ] + }, + { + "$ref": "#/definitions/Secret" + } + ] + } + ], + "f5PostProcess": { + "tag": "longSecret" + } + } + }, + "required": [ + "method", + "token" + ], + "additionalProperties": false + }, + "CA_Bundle": { + "title": "CA Bundle", + "description": "Bundle of one or more PKI Certificate-Authority certificates", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "CA_Bundle" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "bundle": { + "description": "Reference to a CA bundle or string of PEM encoded certificates", + "allOf": [ + { + "$ref": "#/definitions/Pointer_F5_String_Or_BIGIP" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "pki-cert" + } + }, + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys file ssl-cert" + ] + } + } + ] + } + }, + "additionalProperties": false, + "required": [ + "class", + "bundle" + ] + }, + "Capture_Filter": { + "title": "Capture Filter", + "description": "Criteria determining when the system captures a portion of the application traffic", + "type": "object", + "properties": { + "requestCapturedParts": { + "title": "Request Captured Parts", + "description": "Specifies which parts of the request data the system captures", + "type": "string", + "enum": [ + "all", + "body", + "headers", + "none" + ], + "default": "none" + }, + "responseCapturedParts": { + "title": "Response Captured Parts", + "description": "Specifies which parts of the response data the system captures", + "type": "string", + "enum": [ + "all", + "body", + "headers", + "none" + ], + "default": "none" + }, + "dosActivity": { + "title": "DoS Activity", + "description": "Specifies whether the system captures traffic data mitigated by the DoS Layer 7 Enforcer, or traffic regardless of DoS activity", + "type": "string", + "enum": [ + "any", + "mitigated-by-dosl7" + ], + "default": "any" + }, + "capturedProtocols": { + "title": "Captured Protocols", + "description": "Specifies whether the system captures traffic data that is sent using any protocol, or a specific type of protocol", + "type": "string", + "enum": [ + "all", + "http", + "https" + ], + "default": "all" + }, + "capturedReadyForJsInjection": { + "title": "Qualified for JavaScript Injection", + "description": "Specifies whether the system captures all traffic data from all transactions or only from transactions that qualify for JavaScript injection", + "type": "string", + "enum": [ + "disabled", + "enabled" + ], + "default": "disabled" + }, + "virtualServers": { + "title": "Virtual Servers", + "description": "Specifies whether the system captures traffic data sent from/to all virtual servers, or only from/to specific virtual servers. If none are specified then all will be collected", + "type": "array", + "items": { + "title": "Virtual Server", + "type": "string" + }, + "uniqueItems": true, + "default": [] + }, + "nodeAddresses": { + "title": "Node Addresses", + "description": "Specifies whether the system captures traffic data sent from/to all nodes, or only from/to specific nodes. If none are specified then all will be collected", + "type": "array", + "items": { + "type": "string" + }, + "uniqueItems": true, + "default": [] + }, + "responseCodes": { + "title": "Response Status Codes", + "description": "Specifies whether the system captures traffic data based on the HTTP response status codes that the requests return. If none are specified then all will be collected", + "type": "array", + "items": { + "title": "Response Status Code", + "type": "integer", + "minimum": 100, + "maximum": 999 + }, + "maxItems": 10, + "uniqueItems": true, + "default": [] + }, + "methods": { + "title": "HTTP Methods", + "description": "Specifies whether the system captures traffic data based on the HTTP method that was requested. If none are specified then all will be collected", + "type": "array", + "items": { + "title": "HTTP Method", + "type": "string" + }, + "maxItems": 10, + "uniqueItems": true, + "default": [] + }, + "urlFilterType": { + "title": "URL Filter Type", + "description": "Specifies how the URL path prefixes are interpreted", + "type": "string", + "enum": [ + "all", + "black-list", + "white-list" + ], + "default": "all" + }, + "urlPathPrefixes": { + "title": "URL Path Prefixes", + "description": "Specifies URLs the filter type is to be applied to. If none are specified then all will be collected", + "type": "array", + "items": { + "title": "URL", + "type": "string", + "f5PostProcess": { + "tag": "expand" + } + }, + "maxItems": 10, + "uniqueItems": true, + "default": [] + }, + "userAgentSubstrings": { + "title": "User Agent Substrings", + "description": "Specifies whether the system captures traffic sent from all browsers, or only traffic sent from a specific browser", + "type": "array", + "items": { + "title": "User Agent Substring", + "type": "string", + "f5PostProcess": { + "tag": "expand" + } + }, + "maxItems": 10, + "uniqueItems": true, + "default": [] + }, + "clientIps": { + "title": "Client IP Addresses", + "description": "Specifies the client IP addresses to collect stats for. If none are specified, then all will be collected", + "type": "array", + "items": { + "title": "Client IP Address", + "type": "string", + "format": "f5ip" + }, + "maxItems": 10, + "uniqueItems": true, + "default": [] + }, + "requestContentFilterSearchPart": { + "title": "Request Content Filter Search Part", + "description": "Specifies the part of the request that should be filtered by the search string", + "type": "string", + "enum": [ + "all", + "headers", + "body", + "none", + "uri" + ], + "default": "none" + }, + "requestContentFilterSearchString": { + "title": "Request Content Filter Search String", + "description": "Specifies the string the request should be searched for", + "type": "string" + }, + "responseContentFilterSearchPart": { + "title": "Response Content Filter Search Part", + "description": "Specifies the part of the response that should be filtered by the search string", + "type": "string", + "enum": [ + "all", + "body", + "headers", + "none" + ], + "default": "none" + }, + "responseContentFilterSearchString": { + "title": "Response Content Filter Search String", + "description": "Specifies the string the response should be searched for", + "type": "string" + } + }, + "dependencies": { + "requestContentFilterSearchString": { + "properties": { + "requestContentFilterSearchPart": { + "not": { + "const": "none" + } + } + } + }, + "responseContentFilterSearchString": { + "properties": { + "responseContentFilterSearchPart": { + "not": { + "const": "none" + } + } + } + } + } + }, + "Certificate": { + "title": "Certificate", + "description": "Configures a Certificate", + "type": "object", + "properties": { + "class": { + "type": "string", + "const": "Certificate" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "certificate": { + "title": "Certificate", + "description": "X.509 public-key certificate", + "allOf": [ + { + "$ref": "#/definitions/Pointer_F5_String_Or_BIGIP" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "pki-cert" + } + }, + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys file ssl-cert" + ] + } + } + ] + }, + "privateKey": { + "title": "Private Key", + "description": "Private key matching certificate's public key (optional)", + "allOf": [ + { + "$ref": "#/definitions/Pointer_F5_String_Or_BIGIP" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "pki-key" + } + }, + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys file ssl-key" + ] + } + } + ] + }, + "chainCA": { + "title": "CA chain", + "description": "Bundle of one or more CA certificates in trust-chain from root CA to certificate (optional)", + "type": [ + "object", + "string" + ], + "anyOf": [ + { + "$ref": "#/definitions/Pointer_F5_String_Or_BIGIP" + }, + { + "$ref": "#/definitions/Pointer_CA_Bundle" + } + ], + "allOf": [ + { + "f5PostProcess": { + "tag": "fetch", + "data": "pki-bundle" + } + }, + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys file ssl-cert" + ] + } + } + ] + }, + "passphrase": { + "title": "Passphrase", + "description": "If supplied, used to decrypt privateKey at runtime (optional)", + "properties": { + "allowReuse": { + "description": "If true, other declaration objects may reuse this value", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Property_Passphrase" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "object" + } + } + ], + "type": "object" + }, + "pkcs12": { + "title": "PKCS#12 certificate+key", + "description": "The pkcs12 value which may be a url to fetch the binary file from or base64 encoded string", + "allOf": [ + { + "$ref": "#/definitions/Pointer_F5_String_Or_BIGIP" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "pkcs12" + } + }, + { + "f5PostProcess": { + "tag": "certExtract" + } + } + ] + }, + "pkcs12Options": { + "title": "PKCS#12 certificate+key Options", + "description": "Options for importing PKCS12 file", + "type": "object", + "properties": { + "keyImportFormat": { + "title": "PKCS#12 Private Key Format", + "description": "Determines the format in which the private key is saved. Default is PKCS#8.", + "type": "string", + "enum": [ + "pkcs8", + "openssl-legacy" + ], + "default": "pkcs8" + }, + "ignoreChanges": { + "title": "Ignore changes", + "description": "Key has to be decrypted and re-encrypted as part of extraction, resulting in a diff. Set to true to exclude the pkcs12 object for subsequent deployments.", + "type": "boolean", + "default": false + }, + "internalOnly": { + "title": "BIG-IP AS3 internal use only", + "description": "BIG-IP AS3 uses this property internally. Any values supplied here will be ignored", + "type": "array", + "items": { + "type": [ + "string", + "number", + "boolean", + "object", + "array" + ] + }, + "readOnly": true + } + } + }, + "staplerOCSP": { + "title": "OCSP Stapler", + "description": "BIG-IP AS3 pointer to OCSP Stapler declaration (optional)", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Certificate_Validator_OCSP" + } + ] + }, + "issuerCertificate": { + "type": "object", + "description": "Specifies the name of the issuer certificate for this certificate", + "allOf": [ + { + "$ref": "#/definitions/Pointer_SSL_Certificate" + } + ] + } + }, + "required": [ + "class" + ], + "additionalProperties": false, + "dependencies": { + "staplerOCSP": { + "required": [ + "issuerCertificate" + ] + } + }, + "if": { + "required": [ + "pkcs12" + ] + }, + "then": { + "dependencies": { + "certificate": { + "not": {} + }, + "privateKey": { + "not": {} + } + } + }, + "else": { + "required": [ + "certificate" + ], + "not": { + "required": [ + "pkcs12" + ] + } + } + }, + "Certificate_Validator_OCSP": { + "title": "Certificate_Validator_OCSP", + "description": "OCSP validator for certificates", + "type": "object", + "properties": { + "class": { + "const": "Certificate_Validator_OCSP", + "title": "Class", + "type": "string" + }, + "dnsResolver": { + "allOf": [ + { + "$ref": "#/definitions/Pointer_DNS_Resolver" + } + ], + "description": "BIG-IP AS3 pointer to DNS resolver used to resolve hostnames in client requests", + "title": "DNS resolver" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "responderUrl": { + "description": "Specifies the absolute URL that overrides the OCSP responder URL obtained from the certificate's AIA extension(s). This should be a HTTP based URL.", + "minLength": 3, + "title": "Responder URL", + "type": "string" + }, + "signingCertificate": { + "allOf": [ + { + "$ref": "#/definitions/Pointer_SSL_Certificate" + } + ], + "description": "Specifies the certificate object to use for OCSP responders that require the request to be signed", + "title": "Request Signing Certificate Object" + }, + "signingHashAlgorithm": { + "default": "sha256", + "description": "Specifies a hash algorithm used to sign an OCSP request", + "enum": [ + "sha1", + "sha256" + ], + "title": "Request Signing Hash Algorithm", + "type": "string" + }, + "timeout": { + "default": 8, + "description": "Specifies the time interval (in seconds) that the BIG-IP waits for before ending the connection to the OCSP responder. The default value is 8", + "maximum": 300, + "minimum": 1, + "title": "Timeout", + "type": "integer" + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "Constants": { + "title": "Constants", + "description": "Named values for (re-)use by declaration objects", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Constants" + } + }, + "propertyNames": { + "maxLength": 64, + "pattern": "^[A-Za-z][0-9A-Za-z_]*$" + }, + "additionalProperties": { + "if": { + "required": [ + "protected", + "ciphertext" + ], + "type": "object" + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/JWE" + } + ], + "properties": { + "allowReuse": { + "default": true, + "description": "If true (default), cryptogram may be reused by different declaration objects, WHICH MAY POSE A SECURITY RISK!", + "title": "Allow reuse", + "type": "boolean" + } + } + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object" + ] + }, + "required": [ + "class" + ] + }, + "Controls": { + "title": "Controls", + "type": "object", + "description": "Optional controls configuration", + "properties": { + "archiveId": { + "description": "Read-only property present when you GET a declaration from configuration system. Archived versions of declaration are identified by a combination of 'id' and 'archiveId'", + "readOnly": true, + "title": "Archive ID", + "type": [ + "number", + "string" + ] + }, + "archiveTimestamp": { + "description": "Read-only property present when you GET a declaration from configuration system. Indicates when this version (see archiveId) of declaration was archived", + "format": "date-time", + "readOnly": true, + "title": "Archive timestamp", + "type": "string" + }, + "class": { + "title": "Class", + "type": "string", + "const": "Controls", + "default": "Controls" + }, + "dryRun": { + "default": false, + "description": "Boolean that indicates if this declaration will be run as a dry-run. If true, the declaration will NOT make any changes to the system, but will respond with whether or not it would.", + "title": "Dry-Run Option", + "type": "boolean" + }, + "fortune": { + "description": "If true, BIG-IP AS3 will activate Zoltar mode and read you your fortune", + "title": "Fortune", + "type": "boolean" + }, + "logLevel": { + "title": "Log level", + "description": "Controls the amount of detail in logs produced while configuring this Tenant (default is whole-declaration Controls/logLevel value)", + "type": "string", + "enum": [ + "emergency", + "alert", + "critical", + "error", + "warning", + "notice", + "info", + "debug" + ], + "default": "error" + }, + "trace": { + "default": false, + "description": "If true, BIG-IP AS3 creates a detailed trace of the configuration process for this Tenant for subsequent analysis (default is whole-declaration Controls/trace value). Warning: trace files may contain sensitive configuration data", + "title": "Trace", + "type": "boolean" + }, + "traceResponse": { + "title": "Trace Response", + "description": "If true, the response will contain the trace files", + "type": "boolean", + "default": false + }, + "userAgent": { + "title": "User Agent", + "description": "User Agent information to include in TEEM report", + "type": "string" + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "DNS_Logging_Profile": { + "title": "DNS Logging Profile", + "type": "object", + "description": "Configures a Domain Name System (DNS) logging profile", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "DNS_Logging_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "includeCompleteAnswer": { + "description": "Specifies whether the system logs the complete answer from the query", + "type": "boolean", + "default": true + }, + "includeQueryId": { + "description": "Specifies whether the system logs the ID of the query", + "type": "boolean", + "default": false + }, + "includeSource": { + "description": "Specifies whether the system logs the source (the BIG-IP system that receives the packet)", + "type": "boolean", + "default": true + }, + "includeTimestamp": { + "description": "Specifies whether the system logs the timestamp of when the query was created", + "type": "boolean", + "default": true + }, + "includeView": { + "description": "Specifies whether the system includes the view in the log", + "type": "boolean", + "default": true + }, + "logPublisher": { + "$ref": "#/definitions/Pointer_Log_Publisher" + }, + "logQueriesEnabled": { + "description": "Specifies whether the system logs queries", + "type": "boolean", + "default": true + }, + "logResponsesEnabled": { + "description": "Specifies whether the systems logs responses", + "type": "boolean", + "default": false + } + }, + "required": [ + "class", + "logPublisher" + ], + "additionalProperties": false + }, + "Enum_Country_Analytics": { + "title": "Enum values for Analytics_Profile", + "description": "Enum values for Analytics_Profile", + "type": "string", + "enum": [ + "Afghanistan", + "Aland Islands", + "Albania", + "Algeria", + "American Samoa", + "Andorra", + "Angola", + "Anguilla", + "Anonymous Proxy", + "Antarctica", + "Antigua and Barbuda", + "Argentina", + "Armenia", + "Aruba", + "Asia/Pacific Region", + "Australia", + "Austria", + "Azerbaijan", + "Bahamas", + "Bahrain", + "Bangladesh", + "Barbados", + "Belarus", + "Belgium", + "Belize", + "Benin", + "Bermuda", + "Bhutan", + "Bolivia", + "Bonaire, Saint Eustatius and Saba", + "Bosnia and Herzegovina", + "Botswana", + "Bouvet Island", + "Brazil", + "British Indian Ocean Territory", + "Brunei Darussalam", + "Bulgaria", + "Burkina Faso", + "Burundi", + "Cambodia", + "Cameroon", + "Canada", + "Cape Verde", + "Cayman Islands", + "Central African Republic", + "Chad", + "Chile", + "China", + "Christmas Island", + "Cocos (Keeling) Islands", + "Colombia", + "Comoros", + "Congo", + "Congo, The Democratic Republic of the", + "Cook Islands", + "Costa Rica", + "Cote D'Ivoire", + "Croatia", + "Cuba", + "Cyprus", + "Czech Republic", + "Denmark", + "Djibouti", + "Dominica", + "Dominican Republic", + "Ecuador", + "Egypt", + "El Salvador", + "Equatorial Guinea", + "Eritrea", + "Estonia", + "Ethiopia", + "Europe", + "Falkland Islands (Malvinas)", + "Faroe Islands", + "Fiji", + "Finland", + "France", + "France, Metropolitan", + "French Guiana", + "French Polynesia", + "French Southern Territories", + "Gabon", + "Gambia", + "Georgia", + "Germany", + "Ghana", + "Gibraltar", + "Greece", + "Greenland", + "Grenada", + "Guadeloupe", + "Guam", + "Guatemala", + "Guernsey", + "Guinea", + "Guinea-Bissau", + "Guyana", + "Haiti", + "Heard Island and McDonald Islands", + "Holy See (Vatican City State)", + "Honduras", + "Hong Kong", + "Hungary", + "Iceland", + "India", + "Indonesia", + "Iran, Islamic Republic of", + "Iraq", + "Ireland", + "Isle of Man", + "Israel", + "Italy", + "Jamaica", + "Japan", + "Jersey", + "Jordan", + "Kazakhstan", + "Kenya", + "Kiribati", + "Korea, Democratic People's Republic of", + "Korea, Republic of", + "Kuwait", + "Kyrgyzstan", + "Lao People's Democratic Republic", + "Latvia", + "Lebanon", + "Lesotho", + "Liberia", + "Libyan Arab Jamahiriya", + "Liechtenstein", + "Lithuania", + "Luxembourg", + "Macau", + "Macedonia", + "Madagascar", + "Malawi", + "Malaysia", + "Maldives", + "Mali", + "Malta", + "Marshall Islands", + "Martinique", + "Mauritania", + "Mauritius", + "Mayotte", + "Mexico", + "Micronesia, Federated States of", + "Moldova, Republic of", + "Monaco", + "Mongolia", + "Montenegro", + "Montserrat", + "Morocco", + "Mozambique", + "Myanmar", + "Namibia", + "Nauru", + "Nepal", + "Netherlands", + "Netherlands Antilles", + "New Caledonia", + "New Zealand", + "Nicaragua", + "Niger", + "Nigeria", + "Niue", + "Norfolk Island", + "Northern Mariana Islands", + "Norway", + "Oman", + "Other", + "Pakistan", + "Palau", + "Palestinian Territory", + "Panama", + "Papua New Guinea", + "Paraguay", + "Peru", + "Philippines", + "Pitcairn Islands", + "Poland", + "Portugal", + "Puerto Rico", + "Qatar", + "Reunion", + "Romania", + "Russian Federation", + "Rwanda", + "Saint Barthelemy", + "Saint Helena", + "Saint Kitts and Nevis", + "Saint Lucia", + "Saint Martin", + "Saint Pierre and Miquelon", + "Saint Vincent and the Grenadines", + "Samoa", + "San Marino", + "Sao Tome and Principe", + "Satellite Provider", + "Saudi Arabia", + "Senegal", + "Serbia", + "Seychelles", + "Sierra Leone", + "Singapore", + "Slovakia", + "Slovenia", + "Solomon Islands", + "Somalia", + "South Africa", + "South Georgia and the South Sandwich Islands", + "Spain", + "Sri Lanka", + "Sudan", + "Suriname", + "Svalbard and Jan Mayen", + "Swaziland", + "Sweden", + "Switzerland", + "Syrian Arab Republic", + "Taiwan", + "Tajikistan", + "Tanzania, United Republic of", + "Thailand", + "Timor-Leste", + "Togo", + "Tokelau", + "Tonga", + "Trinidad and Tobago", + "Tunisia", + "Turkey", + "Turkmenistan", + "Turks and Caicos Islands", + "Tuvalu", + "Uganda", + "Ukraine", + "United Arab Emirates", + "United Kingdom", + "United States", + "United States Minor Outlying Islands", + "Unknown", + "Uruguay", + "Uzbekistan", + "Vanuatu", + "Venezuela", + "Vietnam", + "Virgin Islands, British", + "Virgin Islands, U.S.", + "Wallis and Futuna", + "Western Sahara", + "Yemen", + "Zambia", + "Zimbabwe" + ] + }, + "F5_String": { + "title": "Common definition for ways to define a value that needs to be resolved", + "description": "The value can be either a string, text property, base64 property, url property, etc.", + "oneOf": [ + { + "type": "string" + }, + { + "type": "object", + "properties": { + "text": { + "$ref": "#/definitions/Property_Text" + }, + "base64": { + "$ref": "#/definitions/Property_Base64" + }, + "url": { + "$ref": "#/definitions/Resource_URL" + }, + "copyFrom": { + "$ref": "#/definitions/Pointer_Copy_From" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1 + } + ] + }, + "HTTP_Acceleration_Profile": { + "title": "HTTP acceleration profile", + "type": "object", + "description": "HTTP acceleration profile with configurable options", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "HTTP_Acceleration_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "agingRate": { + "description": "Rate at which a cache entry ages", + "type": "integer", + "minimum": 0, + "maximum": 10, + "default": 9 + }, + "cacheSize": { + "description": "The maximum size (in megabytes) for the cache.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 100 + }, + "ignoreHeaders": { + "description": "Which cache disabling headers will be ignored by the system", + "type": "string", + "enum": [ + "none", + "max-age", + "all" + ], + "default": "all" + }, + "insertAgeHeaderEnabled": { + "description": "Age and date headers are inserted into the response when enabled", + "type": "boolean", + "default": true + }, + "maximumAge": { + "description": "How long the system will consider the cached content will be valid", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 3600 + }, + "maximumEntries": { + "description": "The maximum number of entries that can reside in the cache", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 10000 + }, + "maximumObjectSize": { + "description": "The largest object that the system will cache", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 50000 + }, + "metadataMaxSize": { + "default": 25, + "description": "The maximum size of the metadata cache", + "maximum": 4294967295, + "minimum": 0, + "type": "integer" + }, + "minimumObjectSize": { + "description": "The smallest object that the system will cache", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 500 + }, + "parentProfile": { + "allOf": [ + { + "$ref": "#/definitions/Pointer_HTTP_Acceleration_Profile" + } + ], + "default": { + "bigip": "/Common/webacceleration" + }, + "description": "The profile that this profile inherits values from" + }, + "uriExcludeList": { + "description": "A list of URIs that will be excluded from the cache", + "type": "array", + "items": { + "type": "string", + "minLength": 1 + }, + "uniqueItems": true + }, + "uriIncludeList": { + "description": "A list of URIs that will be cacheable", + "type": "array", + "items": { + "type": "string", + "minLength": 1 + }, + "uniqueItems": true + }, + "uriIncludeOverrideList": { + "description": "A list of URIs that should be cached even though they may normally not be due to existing constraints", + "type": "array", + "items": { + "type": "string", + "minLength": 1 + }, + "uniqueItems": true + }, + "uriPinnedList": { + "description": "A list of URIs that are kept in the cache regardless of maxAge or expiry settings", + "type": "array", + "items": { + "type": "string", + "minLength": 1 + }, + "uniqueItems": true + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "HTTP_Compress": { + "title": "HTTP Compression profile", + "type": "object", + "description": "HTTP Compression profile with configurable options", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "HTTP_Compress" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "allowHTTP10": { + "description": "Specifies whether to forward HTTP 1.0 requests/responses (default false)", + "type": "boolean", + "default": false + }, + "bufferSize": { + "title": "Buffer size", + "description": "Maximum number of response octets to buffer before deciding whether to apply compression (default 4096)", + "type": "integer", + "minimum": 256, + "maximum": 4294967295, + "default": 4096 + }, + "contentTypeExcludes": { + "title": "Content-Type exclude list", + "description": "List of response Content-Type values which BIG-IP AS3 should not compress. Values are regular expressions that match Content-Type strings", + "type": "array", + "items": { + "type": "string", + "pattern": "^[^\\x00-\\x1f\\x22\\x7f-\\xff]+$" + }, + "uniqueItems": true + }, + "contentTypeIncludes": { + "title": "Content-Type include list", + "description": "List of response Content-Type values which BIG-IP AS3 should compress. Values are regular expressions that match Content-Type strings", + "type": "array", + "items": { + "type": "string", + "pattern": "^[^\\x00-\\x1f\\x22\\x7f-\\xff]+$" + }, + "uniqueItems": true, + "default": [ + "text/", + "application/(xml|x-javascript)" + ] + }, + "cpuSaver": { + "default": true, + "description": "If true (default), system will reduce compression rate when CPU utilization exceeds cpuSaverHigh threshold and increase it when CPU utilization falls below cpuSaverLow threshold", + "title": "CPU saver", + "type": "boolean" + }, + "cpuSaverHigh": { + "default": 90, + "description": "CPU utilization percentage (default 90) above which BIG-IP AS3 should moderate compression", + "maximum": 99, + "minimum": 15, + "title": "CPU-saver %high", + "type": "integer" + }, + "cpuSaverLow": { + "default": 75, + "description": "CPU utilization percentage (default 75) below which the system returns compression to normal", + "maximum": 95, + "minimum": 10, + "title": "CPU-saver %low", + "type": "integer" + }, + "gzipLevel": { + "title": "GZIP level", + "description": "Compression level (default 1); higher values produce greater compression but use more CPU cycles", + "type": "integer", + "minimum": 1, + "maximum": 9, + "default": 1 + }, + "gzipMemory": { + "title": "GZIP memory level", + "description": "Compression memory allocation in kilobytes (default 8), should be a power of two", + "type": "integer", + "minimum": 1, + "maximum": 256, + "default": 8 + }, + "gzipWindowSize": { + "title": "GZIP window size", + "description": "Compression window size in kilobytes (default 16), should be a power of two", + "type": "integer", + "minimum": 1, + "maximum": 128, + "default": 16 + }, + "keepAcceptEncoding": { + "title": "Keep Accept-Encoding header", + "description": "Specifies that the system does not remove the Accept-Encoding header from an HTTP request (default false)", + "type": "boolean", + "default": false + }, + "minimumSize": { + "default": 1024, + "description": "BIG-IP AS3 will not compress responses of fewer octets than this (default 1024)", + "maximum": 131072, + "minimum": 128, + "title": "Minimum size to compress", + "type": "integer" + }, + "preferMethod": { + "default": "gzip", + "description": "Select preferred compression method (default gzip, strongly recommended)", + "enum": [ + "gzip", + "deflate" + ], + "title": "Prefer method", + "type": "string" + }, + "selective": { + "default": false, + "description": "If true, BIG-IP AS3 will only compress a response when an iRule attached to the virtual server requests it (default is false, meaning BIG-IP AS3 will compress responses which meet the criteria in this profile)", + "title": "Selective mode", + "type": "boolean" + }, + "uriExcludes": { + "title": "URI exclude list", + "description": "List of request URI's for which BIG-IP AS3 should not compress responses. Values are regular expressions that match request URI strings", + "type": "array", + "items": { + "type": "string", + "pattern": "^[^\\x00-\\x1f\\x7f-\\xff]+$" + }, + "uniqueItems": true + }, + "uriIncludes": { + "title": "URI include list", + "description": "List of request URI's for which BIG-IP AS3 should compress responses. Values are regular expressions that match URI strings", + "type": "array", + "items": { + "type": "string", + "pattern": "^[^\\x00-\\x1f\\x7f-\\xff]+$" + }, + "uniqueItems": true + }, + "varyHeader": { + "default": true, + "description": "If true (default), a Vary header will appear in compressed responses", + "title": "Vary header", + "type": "boolean" + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "HTTP_Profile": { + "title": "HTTP profile", + "type": "object", + "description": "HTTP profile with configurable options", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "HTTP_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "allowBlankSpaceAfterHeaderName": { + "default": false, + "description": "Specifies whether to allow blank space in an HTTP header between the header name and the separator colon in an HTTP request or response. Requires TMOS version 16.1 or newer.", + "title": "Allow Blank Space After Header Name", + "type": "boolean" + }, + "allowedResponseHeaders": { + "description": "By default BIG-IP AS3 passes HTTP headers in responses from pool members to clients unaltered. You may list names of allowed response headers here and BIG-IP AS3 removes any you do not list from responses.", + "items": { + "maxLength": 128, + "minLength": 1, + "pattern": "^[^\\x00-\\x20\\x22:\\x5c\\x7f-\\xff]+$", + "title": "Allowed header", + "type": "string" + }, + "title": "Allow response headers", + "type": "array", + "uniqueItems": true + }, + "cookiePassphrase": { + "title": "Cookie encryption passphrase", + "description": "Used to create secret key for cookie encryption (when missing, BIG-IP AS3 uses a system-generated key)", + "properties": { + "allowReuse": { + "description": "If true, other declaration objects may reuse this value", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Property_Passphrase" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "object" + } + } + ], + "type": "object" + }, + "encryptCookies": { + "title": "Encrypt cookies", + "description": "List cookies to encrypt en-route to the client and decrypt en-route to a pool member", + "type": "array", + "items": { + "title": "Cookie name", + "type": "string", + "pattern": "^[^\\x00-\\x20\\x22=\\x5c\\x7f-\\xff]+$" + }, + "uniqueItems": true + }, + "enforceRFCCompliance": { + "default": false, + "description": "BIG-IP LTM performs basic RFC compliance checks as described in the latest RFC for the HTTP protocol. If a client request fails these checks, then the connection is reset. Requires TMOS version 15.0 or newer.", + "title": "Enforce RFC Compliance", + "type": "boolean" + }, + "fallbackRedirect": { + "title": "Fallback Redirect", + "description": "Domain name (or IP address) of service (if any) to which BIG-IP AS3 should redirect a request when no pool member is responsive or selected pool member returns a fallbackStatusCode", + "type": "string", + "minLength": 1, + "anyOf": [ + { + "format": "uri" + }, + { + "format": "f5ip" + } + ] + }, + "fallbackStatusCodes": { + "description": "When a pool member responds to a request with one of these HTTP status codes (for example, 500), redirect the client to the fallbackRedirect", + "items": { + "maximum": 999, + "minimum": 100, + "title": "Status code", + "type": "integer" + }, + "title": "Fallback status codes", + "type": "array", + "uniqueItems": true + }, + "hstsIncludeSubdomains": { + "default": true, + "description": "If true then HSTS headers (see hstsInsert) will tell clients to apply HSTS settings to the hostnames of this service and all their possible subdomains. Warning: an incorrect value here can make multiple websites unreachable, not just this service", + "title": "Include subdomains in HSTS", + "type": "boolean" + }, + "hstsInsert": { + "default": false, + "description": "If true, insert HSTS (HTTP Strict Transport Security) headers into responses sent to clients (default false). Warning: misconfiguration of HSTS can make a website unreachable", + "title": "Insert HSTS headers", + "type": "boolean" + }, + "hstsPeriod": { + "default": 7862400, + "description": "If hstsInsert is true, this value tells each client how long (in seconds; default 7862400 equals 91 days) to wait before refreshing HSTS settings for this service. Warning: once a client receives erroneous HSTS settings it will ignore any attempt to correct them until this period has expired", + "maximum": 4294967295, + "minimum": 0, + "title": "Period of HSTS", + "type": "integer" + }, + "hstsPreload": { + "default": false, + "description": "If true, include the domain for the web site associated with this HTTP profile in the browser's preload list. This forces the client to send packets over SSL/TLS.", + "title": "Include domain in preload list", + "type": "boolean" + }, + "requestChunking": { + "title": "Request chunking", + "description": "Controls handling of HTTP payload chunking in requests from clients (default is 'preserve'). Note: 'selective' and 'preserve' will be translated to 'sustain' when TMOS version is 15.0 or newer", + "type": "string", + "enum": [ + "selective", + "preserve", + "rechunk" + ], + "default": "preserve" + }, + "responseChunking": { + "title": "Response chunking", + "description": "Controls handling of HTTP payload chunking in responses from pool members (default 'selective' adapts to most situations). Note: 'selective' and 'preserve' will be translated to 'sustain' when TMOS version is 15.0 or newer", + "type": "string", + "enum": [ + "selective", + "preserve", + "unchunk", + "rechunk" + ], + "default": "selective" + }, + "rewriteRedirects": { + "title": "Rewrite redirects", + "description": "In selected Location-header values (default none) of redirect responses from pool members, change protocol HTTP to HTTPS before passing redirects to clients", + "type": "string", + "enum": [ + "none", + "all", + "matching", + "addresses" + ], + "default": "none" + }, + "insertHeader": { + "title": "Insert header", + "description": "You may insert one header into each request before BIG-IP AS3 sends it to a pool member. The header value may be a simple string or the result of an iRules TCL expression (for example, [IP::client_addr]). This is the most efficient way to insert a single header; to insert multiple headers use an iRule or an Endpoint policy", + "type": "object", + "properties": { + "name": { + "title": "Header name", + "description": "Name of the HTTP header to insert", + "type": "string", + "pattern": "^[^\\x00-\\x20\\x22:\\x5c\\x7f-\\xff]+$", + "minLength": 1, + "maxLength": 128 + }, + "value": { + "title": "Header value", + "description": "Value of the HTTP header to insert", + "type": "string", + "pattern": "^[^\\x00-\\x1f\\x7f-\\xff]*$" + } + }, + "additionalProperties": false + }, + "knownMethods": { + "title": "Known methods", + "description": "List of HTTP request methods BIG-IP AS3 should recognize as normal. Any method not in this list will provoke the 'unknownMethodAction' action", + "type": "array", + "items": { + "title": "HTTP method", + "type": "string", + "pattern": "^[A-Z0-9]+$", + "minLength": 1, + "maxLength": 32 + }, + "uniqueItems": true, + "default": [ + "CONNECT", + "DELETE", + "GET", + "HEAD", + "LOCK", + "OPTIONS", + "POST", + "PROPFIND", + "PUT", + "TRACE", + "UNLOCK" + ] + }, + "maxRequests": { + "title": "Maximum requests per connection", + "description": "When BIG-IP AS3 has processed more than this number of requests through a connection, the system closes it. Default 0 means permit unlimited requests", + "type": "integer", + "minimum": 0, + "maximum": 2147483647, + "default": 0 + }, + "multiplexTransformations": { + "title": "Multiplex transformations", + "description": "If true (default), BIG-IP AS3 adjusts request headers to work properly when the virtual server uses a Multiplex profile", + "type": "boolean", + "default": true + }, + "otherXFF": { + "title": "Other XFF headers", + "description": "Names of request headers to treat as equivalent to X-Forwarded-For (see trustXFF)", + "type": "array", + "items": { + "title": "Header name", + "type": "string", + "minLength": 1, + "maxLength": 128, + "pattern": "^[^\\x00-\\x20\\x22:\\x5c\\x7f-\\xff]+$" + }, + "uniqueItems": true + }, + "pipelineAction": { + "default": "allow", + "description": "Default 'allow' means clients may pipeline HTTP/1.1 requests to pool members which support pipelining. Otherwise, 'reject' prevents pipelining, and 'pass-through' causes the connection to switch to pass-through mode when the system detects pipelining", + "enum": [ + "allow", + "reject", + "pass-through" + ], + "title": "Pipeline action", + "type": "string" + }, + "profileWebSocket": { + "description": "Deprecated. Specifies the WebSocket profile that will be used on Services alongside this HTTP profile. When the 'profileWebSocket' property is used on a Service, it will supersede this property.", + "allOf": [ + { + "$ref": "#/definitions/Pointer_WebSocket_Profile" + } + ] + }, + "proxyConnectEnabled": { + "default": false, + "description": "Determines if a proxy connection profile will be created", + "title": "Proxy connection enabled", + "type": "boolean" + }, + "proxyType": { + "default": "reverse", + "description": "Default value 'reverse' is usually appropriate. You may use 'transparent' when virtual server will handle a mix of HTTP and non-HTTP traffic. You may use 'explicit' when clients will ask ADC to proxy connections to arbitrary remote services", + "enum": [ + "reverse", + "transparent", + "explicit" + ], + "title": "Proxy type", + "type": "string" + }, + "whiteOutHeader": { + "title": "White-out header", + "description": "You may name one request header you want whited-out of each request before BIG-IP AS3 sends it to a pool member. To remove more than a single named header, use an iRule or an Endpoint policy. (Whiting-out a header leaves its name but replaces its value in the request with space characters (ASCII 0x20) to avoid changing the length of the headers.)", + "type": "string", + "pattern": "^[^\\x00-\\x20\\x22:\\x5c\\x7f-\\xff]+$", + "minLength": 1, + "maxLength": 128 + }, + "xForwardedFor": { + "title": "Insert X-Forwarded-For", + "description": "If true, insert an X-Forwarded-For header carrying the client IP address into each HTTP request sent to a pool member (default true)", + "type": "boolean", + "default": true + }, + "serverHeaderValue": { + "title": "Server header value", + "description": "Server header value to place in responses generated by the ADC itself (not obtained from a pool member)", + "type": "string", + "default": "BigIP" + }, + "trustXFF": { + "default": false, + "description": "If true, WAF (ASM) and AVR may trust X-Forwarded-For headers found in incoming requests and report statistics using client IP addresses appearing in them (default false). Use this feature only when you control upstream gateway(s)", + "title": "Trust X-Forwarded-For", + "type": "boolean" + }, + "unknownMethodAction": { + "default": "allow", + "description": "Default 'allow' means clients may make HTTP requests using unknown methods. Otherwise, 'reject' means to discard any unknown-method request and reject the client connection, and 'pass-through' causes the connection to switch to pass-through mode upon the first unknown-method request", + "enum": [ + "allow", + "reject", + "pass-through" + ], + "title": "Unknown method action", + "type": "string" + }, + "viaHost": { + "anyOf": [ + { + "format": "hostname" + }, + { + "format": "f5ip" + } + ], + "description": "Hostname to place in Via header when viaRequest or viaResponse is 'append'", + "minLength": 1, + "title": "Via hostname", + "type": "string" + }, + "viaRequest": { + "default": "remove", + "description": "Controls treatment of Via: headers in requests from clients. When set to 'append' BIG-IP AS3 requires viaHost", + "enum": [ + "append", + "preserve", + "remove" + ], + "title": "Via request control", + "type": "string" + }, + "viaResponse": { + "default": "remove", + "description": "Controls treatment of Via: headers in responses from pool members. When set to 'append' BIG-IP AS3 requires viaHost", + "enum": [ + "append", + "preserve", + "remove" + ], + "title": "Via response control", + "type": "string" + }, + "webSocketMasking": { + "default": "unmask", + "description": "Deprecated. WebSocket stream data is always masked from client to ADC and from ADC to server. Default value 'unmask' makes stream data passing through visible to ADC security policy and/or iRules attached to the service. 'selective' unmasks stream data only when a security policy is attached. 'preserve' passes data through masked (unreadable by security policy). 'remask' causes different masking keys to be used on client and server sides. When specified the property 'profileWebSocket' supersedes this property.", + "enum": [ + "preserve", + "remask", + "selective", + "unmask" + ], + "title": "WebSocket masking", + "type": "string" + }, + "webSocketsEnabled": { + "default": false, + "description": "Deprecated. When true, allow clients to initiate WebSocket connections (default false). When specified the property 'profileWebSocket' supersedes this property.", + "title": "WebSockets Enabled", + "type": "boolean" + } + }, + "required": [ + "class" + ], + "dependencies": { + "cookiePassphrase": { + "required": [ + "encryptCookies" + ] + }, + "fallbackStatusCodes": { + "required": [ + "fallbackRedirect" + ] + }, + "proxyType": { + "else": { + "if": { + "properties": { + "proxyType": { + "not": { + "const": "explicit" + } + } + } + }, + "then": { + "not": { + "anyOf": [ + { + "required": [ + "resolver" + ] + }, + { + "required": [ + "doNotProxyHosts" + ] + }, + { + "required": [ + "tunnelName" + ] + }, + { + "required": [ + "defaultConnectAction" + ] + }, + { + "required": [ + "routeDomain" + ] + }, + { + "required": [ + "connectErrorMessage" + ] + }, + { + "required": [ + "dnsErrorMessage" + ] + }, + { + "required": [ + "badRequestMessage" + ] + }, + { + "required": [ + "badResponseMessage" + ] + }, + { + "required": [ + "ipv6" + ] + } + ] + } + } + }, + "if": { + "properties": { + "proxyType": { + "not": { + "const": "transparent" + } + } + } + }, + "then": { + "not": { + "anyOf": [ + { + "required": [ + "excessClientHeaders" + ] + }, + { + "required": [ + "excessServerHeaders" + ] + }, + { + "required": [ + "oversizeClientHeaders" + ] + }, + { + "required": [ + "oversizeServerHeaders" + ] + } + ] + } + } + }, + "viaRequest": { + "if": { + "properties": { + "viaRequest": { + "const": "append" + } + } + }, + "then": { + "required": [ + "viaHost" + ] + } + }, + "viaResponse": { + "if": { + "properties": { + "viaResponse": { + "const": "append" + } + } + }, + "then": { + "required": [ + "viaHost" + ] + } + } + }, + "if": { + "properties": { + "proxyType": { + "const": "reverse" + } + } + }, + "then": { + "$ref": "#/definitions/HTTP_Profile_Reverse" + }, + "else": { + "if": { + "properties": { + "proxyType": { + "const": "transparent" + } + } + }, + "then": { + "$ref": "#/definitions/HTTP_Profile_Transparent" + }, + "else": { + "if": { + "properties": { + "proxyType": { + "const": "explicit" + } + } + }, + "then": { + "$ref": "#/definitions/HTTP_Profile_Explicit" + } + } + } + }, + "HTTP_Profile_Explicit": { + "title": "HTTP Profile Explicit", + "type": "object", + "description": "Extra HTTP profile configurable options when proxyType is 'explicit'", + "properties": { + "maxHeaderCount": { + "title": "Maximum header count", + "description": "When the number of headers in an incoming HTTP request exceeds this value, discard the request and reset the client connection", + "type": "integer", + "minimum": 1, + "maximum": 1024, + "default": 64 + }, + "maxHeaderSize": { + "title": "Maximum header size", + "description": "When the total size in octets of the headers of an incoming HTTP request exceeds this value, discard the request and reset the client connection", + "type": "integer", + "minimum": 9, + "maximum": 262144, + "default": 32768 + }, + "truncatedRedirects": { + "title": "Truncated redirects", + "description": "If false (default) elide malformed redirects from pool members, otherwise pass them to client", + "type": "boolean", + "default": false + }, + "resolver": { + "title": "DNS resolver", + "description": "BIG-IP AS3 pointer to DNS resolver used to resolve hostnames in client requests", + "type": "object", + "properties": { + "bigip": { + "title": "BIG-IP resolver", + "description": "Pathname of existing BIG-IP net DNS resolver", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "required": [ + "bigip" + ], + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query net dns-resolver" + ] + } + }, + "doNotProxyHosts": { + "title": "Do-not-proxy hosts", + "description": "When a client makes a (proxy-type) request to some host on this list, that request will simply be load-balanced to a pool member (without DNS resolution). This is ineffective for HTTPS requests", + "type": "array", + "items": { + "title": "host", + "type": "string", + "anyOf": [ + { + "format": "hostname" + }, + { + "format": "f5ip" + } + ] + }, + "default": [ + "none" + ], + "uniqueItems": true + }, + "tunnelName": { + "title": "Tunnel name", + "description": "Name of tunnel used for outbound CONNECT requests (default 'http-tunnel')", + "type": "string", + "minLength": 1, + "maxLength": 63, + "default": "http-tunnel", + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query net tunnels tunnel" + ] + } + }, + "defaultConnectAction": { + "title": "Default CONNECT action", + "description": "By default (value 'deny') the system refuses CONNECT requests from clients except when there is a virtual server listening to the tunnelName tunnel to accept and process them (typically to authorize and/or intercept outbound TLS connections). Value 'allow' will let clients CONNECT to arbitrary remote services", + "type": "string", + "enum": [ + "deny", + "allow" + ], + "default": "deny" + }, + "routeDomain": { + "title": "Exit route domain", + "description": "Proxy requests will leave the ADC from a Self IP in this route domain (default 0)", + "oneOf": [ + { + "type": "integer", + "minimum": 0, + "maximum": 65535 + }, + { + "type": "string" + } + ], + "default": 0, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query net route-domain" + ] + } + }, + "connectErrorMessage": { + "title": "Connect-error message", + "description": "Message returned to client when the system cannot establish a proxy connection. May include iRules TCL expressions", + "type": "string", + "maxLength": 65279, + "default": "Connection Error

Unable to connect to host in proxy request

" + }, + "dnsErrorMessage": { + "title": "DNS-error message", + "description": "Message returned to the client when the system cannot resolve the hostname in the request. May include iRules TCL expressions", + "type": "string", + "maxLength": 65279, + "default": "DNS Resolution Error

Cannot resolve hostname in proxy request

" + }, + "badRequestMessage": { + "title": "Bad-request message", + "description": "Message returned to client when proxy request is erroneous. May include iRules TCL expressions", + "type": "string", + "maxLength": 65279, + "default": "Bad Request

Invalid proxy request

" + }, + "badResponseMessage": { + "title": "Bad-response message", + "description": "Message returned to client when response to proxy request is erroneous. May include iRules TCL expressions", + "type": "string", + "maxLength": 65279, + "default": "Bad Response

Proxy request provoked invalid response

" + }, + "ipv6": { + "title": "IPv6 first priority", + "description": "Specifies the relative order of IPv4 and IPv6 DNS resolutions for URIs. If false (default), then the system performs IPv4 lookup before IPv6.", + "type": "boolean", + "default": false + } + } + }, + "HTTP_Profile_Reverse": { + "title": "HTTP Profile Reverse", + "type": "object", + "description": "Extra HTTP profile configurable options when proxyType is 'reverse'", + "properties": { + "maxHeaderCount": { + "title": "Maximum header count", + "description": "When the number of headers in an incoming HTTP request exceeds this value, discard the request and reset the client connection", + "type": "integer", + "minimum": 1, + "maximum": 1024, + "default": 64 + }, + "maxHeaderSize": { + "title": "Maximum header size", + "description": "When the total size in octets of the headers of an incoming HTTP request exceeds this value, discard the request and reset the client connection", + "type": "integer", + "minimum": 9, + "maximum": 262144, + "default": 32768 + }, + "truncatedRedirects": { + "title": "Truncated redirects", + "description": "If false (default) elide malformed redirects from pool members, otherwise pass them to client", + "type": "boolean", + "default": false + } + } + }, + "HTTP_Profile_Transparent": { + "title": "HTTP Profile Transparent", + "type": "object", + "description": "Extra HTTP profile configurable options when proxyType is 'transparent'", + "properties": { + "maxHeaderCount": { + "title": "Maximum header count", + "description": "When the number of headers in a request or response exceeds this value (default 32), take the excessX...Headers action", + "type": "integer", + "minimum": 1, + "maximum": 1024, + "default": 32 + }, + "maxHeaderSize": { + "title": "Maximum header size", + "description": "When the total size in octets of the headers of request or response exceeds this value (default 16384), take the oversizeX...Headers action", + "type": "integer", + "minimum": 9, + "maximum": 262144, + "default": 16384 + }, + "excessClientHeaders": { + "title": "Excess client headers action", + "description": "When a client request violates maxHeaderCount, either switch to pass-through mode (default) or reject the connection", + "type": "string", + "enum": [ + "pass-through", + "reject" + ], + "default": "pass-through" + }, + "excessServerHeaders": { + "title": "Excess server headers action", + "description": "When a pool member response violates maxHeaderCount, either switch to pass-through mode (default) or reject the connection", + "type": "string", + "enum": [ + "pass-through", + "reject" + ], + "default": "pass-through" + }, + "oversizeClientHeaders": { + "title": "Oversize client headers action", + "description": "When a client request violates maxHeaderSize, either switch to pass-through mode (default) or reject the connection", + "type": "string", + "enum": [ + "pass-through", + "reject" + ], + "default": "pass-through" + }, + "oversizeServerHeaders": { + "title": "Oversize server headers action", + "description": "When a pool member response violates maxHeaderSize, either switch to pass-through mode (default) or reject the connection", + "type": "string", + "enum": [ + "pass-through", + "reject" + ], + "default": "pass-through" + }, + "truncatedRedirects": { + "title": "Truncated redirects", + "description": "If true (default) pass malformed redirects to client", + "type": "boolean", + "default": true + } + } + }, + "HTTP2_Profile": { + "title": "HTTP2 profile", + "type": "object", + "description": "Profile to enable HTTP2", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "HTTP2_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "activationMode": { + "title": "Activation Mode", + "description": "This setting specifies the condition that will cause the BIG-IP system to handle an incoming connection as an HTTP/2 connection.", + "type": "string", + "enum": [ + "alpn", + "always" + ], + "default": "alpn" + }, + "concurrentStreamsPerConnection": { + "title": "Concurrent streams per connection", + "description": "The number of concurrent connections to allow on a single HTTP/2 connection.", + "type": "integer", + "minimum": 1, + "maximum": 256, + "default": 10 + }, + "connectionIdleTimeout": { + "title": "Connection idle timeout", + "description": "The number of seconds that a HTTP/2 connection is left open idly before it is closed.", + "type": "integer", + "minimum": 1, + "maximum": 4294967295, + "default": 300 + }, + "enforceTlsRequirements": { + "title": "Enforce TLS requirements", + "description": "Enable or disable enforcement of TLS requirements.", + "type": "boolean", + "default": true + }, + "frameSize": { + "title": "Frame size", + "type": "integer", + "default": 2048, + "description": "The size of the data frames, in bytes, that the HTTP/2 protocol sends to the client.", + "maximum": 16384, + "minimum": 1024 + }, + "headerTableSize": { + "title": "Header table size", + "type": "integer", + "default": 4096, + "description": "The size of the header table, in KB, for the HTTP headers that the HTTP/2 protocol compresses to save bandwidth.", + "maximum": 65535, + "minimum": 0 + }, + "includeContentLength": { + "title": "Include content length", + "type": "boolean", + "default": false, + "description": "Enable to include content-length in HTTP/2 headers." + }, + "insertHeader": { + "title": "Insert header", + "description": "This setting specifies whether the BIG-IP system should add an HTTP header to the HTTP request to show that the request was received over HTTP/2.", + "type": "boolean", + "default": false + }, + "insertHeaderName": { + "title": "Insert header name", + "description": "This setting specifies the name of the header that the BIG-IP system will add to the HTTP request when the Insert Header is enabled.", + "type": "string", + "default": "X-HTTP2" + }, + "receiveWindow": { + "title": "Receive window", + "type": "integer", + "default": 32, + "description": "The flow-control size for upload streams, in KB.", + "maximum": 128, + "minimum": 16 + }, + "writeSize": { + "title": "Write size", + "type": "integer", + "default": 16384, + "description": "The total size of combined data frames, in bytes, that the HTTP/2 protocol sends in a single write function.", + "maximum": 32768, + "minimum": 2048 + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "IRule": { + "title": "iRule", + "type": "object", + "description": "iRule definition with configurable options", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "iRule" + }, + "expand": { + "title": "Expand", + "description": "If true (default), expand backquoted variables in iRule", + "type": "boolean", + "default": true + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "iRule": { + "$ref": "#/definitions/IRule_Core" + } + }, + "required": [ + "class", + "iRule" + ], + "additionalProperties": false + }, + "IRule_Core": { + "title": "iRule Core definition", + "description": "Reference to an iRule or text of an iRule", + "allOf": [ + { + "$ref": "#/definitions/F5_String" + }, + { + "f5PostProcess": { + "tag": "expand", + "data": { + "when": "1/expand" + } + } + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "string" + } + } + ] + }, + "JWE": { + "title": "JWE cryptogram", + "description": "A value in a cryptogram which is a Flattened JWE JSON Serialization object. If 'miniJWE' is true then enc=(none|f5sv) only (in JOSE header)", + "type": "object", + "properties": { + "ciphertext": { + "title": "Ciphertext", + "description": "Put base64url(data_value) here", + "type": "string", + "minLength": 2, + "allOf": [ + { + "$ref": "#/definitions/Resource_Base64" + } + ] + }, + "ignoreChanges": { + "title": "Ignore changes", + "description": "If false (default), the system updates the ciphertext in every BIG-IP AS3 declaration deployment. If true, BIG-IP AS3 creates the ciphertext on first deployment, and leaves it untouched afterwards", + "type": "boolean", + "default": false + }, + "miniJWE": { + "title": "Mini JWE", + "description": "If true (default), object is an f5 mini-JWE", + "type": "boolean", + "default": true + }, + "protected": { + "title": "JOSE header", + "description": "JOSE header: alg=dir, enc=(none|f5sv); default enc=none (encoded default is 'protected'='eyJhbGciOiJkaXIiLCJlbmMiOiJub25lIn0', use with secret simply base64 url-encoded into 'ciphertext'). If you see 'protected'='eyJhbGciOiJkaXIiLCJlbmMiOiJmNXN2In0', 'ciphertext' contains base64url-encoded SecureVault cryptogram", + "type": "string", + "minLength": 2, + "allOf": [ + { + "$ref": "#/definitions/Resource_Base64" + } + ], + "default": "eyJhbGciOiJkaXIiLCJlbmMiOiJub25lIn0" + } + }, + "required": [ + "protected" + ] + }, + "L4_Profile": { + "title": "L4 Profile", + "description": "Configures a Fast Layer 4 profile", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "L4_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "clientTimeout": { + "title": "Client timeout", + "description": "Number of seconds allowed for a client to transmit enough data to select a server when you have late binding enabled. Value -1 means indefinite (not recommended)", + "type": "integer", + "maximum": 86400, + "minimum": -1, + "default": 30 + }, + "idleTimeout": { + "title": "Idle timeout", + "description": "Number of seconds (default 300; may not be 0) connection may remain idle before it becomes eligible for deletion. Value -1 (not recommended) means infinite", + "type": "integer", + "default": 300, + "anyOf": [ + { + "maximum": 86400, + "minimum": 1 + }, + { + "const": -1 + } + ] + }, + "keepAliveInterval": { + "title": "Keep-alive interval", + "description": "Number of seconds between keep-alive probes. A value of 0 seconds disables the feature.", + "type": "integer", + "default": 0, + "maximum": 4294967295, + "minimum": 0 + }, + "looseClose": { + "title": "Loose close", + "description": "When true, system closes a loosely-initiated connection when the system receives the first FIN packet from either the client or the server (default false).", + "type": "boolean", + "default": false + }, + "looseInitialization": { + "title": "Loose initialization", + "description": "When true, system initializes a connection when it receives any TCP packet, rather than requiring a SYN packet for connection initiation (default false).", + "type": "boolean", + "default": false + }, + "maxSegmentSize": { + "title": "MSS", + "description": "Sets MSS advertised to peer. Value 0 (default) will set MSS automatically in proportion to interface MTU. Default 0 is usually the best choice", + "type": "integer", + "default": 0, + "anyOf": [ + { + "maximum": 9162, + "minimum": 256 + }, + { + "const": 0 + } + ] + }, + "resetOnTimeout": { + "title": "Reset on timeout", + "description": "If true (default), connections which time out will be reset (that is, the system sends an RST packet to the peer) before the system expunges them", + "type": "boolean", + "default": true + }, + "synCookieAllowlist": { + "title": "Syn Cookie Allowlist", + "description": "Specifies whether or not to use a SYN Cookie Allowlist when doing software SYN Cookies. This means not doing a SYN Cookie for the same src IP address if it has been done already in the previous tm.flowstate.timeout (30) seconds. The default value is disabled.", + "type": "boolean", + "default": false + }, + "synCookieEnable": { + "title": "SYN cookie enable", + "description": "Enables syn-cookies capability on this virtual server. If true (default), the system may use SYN cookies to avert connection-table overflow (for example, from DoS attacks)", + "type": "boolean", + "default": true + }, + "tcpCloseTimeout": { + "title": "TCP Close timeout", + "description": "Specifies an TCP close timeout in seconds. Value -1 means indefinite (not recommended)", + "type": "integer", + "default": 5, + "maximum": 86400, + "minimum": -1 + }, + "tcpHandshakeTimeout": { + "title": "TCP Handshake timeout", + "description": "Specifies a TCP handshake timeout in seconds. The default value is 5 seconds. Value -1 means indefinite (not recommended)", + "type": "integer", + "maximum": 86400, + "default": 5, + "minimum": -1 + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "Log_Destination": { + "title": "Log Destination", + "description": "Configures a log destination", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Log_Destination" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "type": { + "description": "The type of the log destination", + "type": "string", + "enum": [ + "management-port", + "remote-high-speed-log", + "remote-syslog", + "splunk" + ] + } + }, + "required": [ + "class", + "type" + ], + "allOf": [ + { + "if": { + "properties": { + "type": { + "const": "management-port" + } + } + }, + "then": { + "$ref": "#/definitions/Log_Destination_Management_Port" + } + }, + { + "if": { + "properties": { + "type": { + "const": "remote-syslog" + } + } + }, + "then": { + "$ref": "#/definitions/Log_Destination_Remote_Syslog" + } + }, + { + "if": { + "properties": { + "type": { + "const": "remote-high-speed-log" + } + } + }, + "then": { + "$ref": "#/definitions/Log_Destination_Remote_High_Speed_Log" + } + }, + { + "if": { + "properties": { + "type": { + "const": "splunk" + } + } + }, + "then": { + "$ref": "#/definitions/Log_Destination_Splunk" + } + } + ] + }, + "Log_Destination_Management_Port": { + "title": "Log Destination Management Port", + "description": "Sends received messages to a specified IP address and port through the management interface", + "type": "object", + "properties": { + "address": { + "description": "Specifies the IP address that will receive messages from the specified local Log Destination", + "type": "string", + "format": "f5ip" + }, + "port": { + "description": "Specifies the port of the IP address that will receive messages from the specified local Log Destination", + "type": "integer", + "minimum": 0, + "maximum": 65535 + }, + "protocol": { + "description": "Specifies the protocol for the system to use to send logs to the specified location", + "type": "string", + "enum": [ + "tcp", + "udp" + ], + "default": "tcp" + } + }, + "required": [ + "address", + "port" + ] + }, + "Log_Destination_Remote_High_Speed_Log": { + "title": "Log Destination Remote High Speed Log", + "description": "Sends received messages to a specified pool", + "type": "object", + "properties": { + "distribution": { + "description": "Specifies the distribution method used to send messages to pool members", + "type": "string", + "enum": [ + "adaptive", + "balanced", + "replicated" + ], + "default": "adaptive" + }, + "protocol": { + "description": "Specifies the protocol for the system to use to send logs to the pool", + "type": "string", + "enum": [ + "tcp", + "udp" + ], + "default": "tcp" + }, + "pool": { + "$ref": "#/definitions/Pointer_Pool" + } + }, + "required": [ + "pool" + ] + }, + "Log_Destination_Remote_Syslog": { + "title": "Log Destination Remote Syslog", + "description": "Configures Remote Syslog destinations to format log messages into Syslog format and forward them to a Remote High-Speed Log destination", + "type": "object", + "properties": { + "format": { + "description": "Specifies the method to use to format the logs", + "type": "string", + "enum": [ + "legacy-bigip", + "rfc3164", + "rfc5424" + ], + "default": "rfc3164" + }, + "defaultFacility": { + "description": "Specifies the facility given to log messages received that do not already have a facility listed", + "type": "string", + "enum": [ + "local0", + "local1", + "local2", + "local3", + "local4", + "local5", + "local6", + "local7" + ], + "default": "local0" + }, + "defaultSeverity": { + "description": "Specifies the severity given to log messages received that do not already have a severity listed", + "type": "string", + "enum": [ + "alert", + "crit", + "debug", + "emerg", + "err", + "info", + "notice", + "warn" + ], + "default": "info" + }, + "remoteHighSpeedLog": { + "description": "Specifies a remote high-speed log destination, which the system uses to forward the logs to a pool of remote log servers", + "allOf": [ + { + "$ref": "#/definitions/Pointer_BIGIP_Or_Use" + }, + { + "type": "object", + "properties": { + "use": { + "description": "BIG-IP AS3 pointer to remote high speed log declaration", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Log_Destination" + }, + "type": { + "const": "remote-high-speed-log" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP remote high speed log", + "format": "f5bigip" + } + }, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys log-config destination remote-high-speed-log" + ] + } + } + ], + "minProperties": 1, + "maxProperties": 1 + } + }, + "required": [ + "remoteHighSpeedLog" + ] + }, + "Log_Destination_Splunk": { + "title": "Log Destination Splunk", + "description": "Configures Splunk formatting destinations to format incoming log messages into Splunk format", + "type": "object", + "properties": { + "forwardTo": { + "description": "Specifies the log destination to which logs are forwarded", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Log_Destination" + } + ] + } + }, + "required": [ + "forwardTo" + ] + }, + "Log_Publisher": { + "title": "Log_Publisher", + "description": "Configures lists of destinations for the common logging interface", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Log_Publisher" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "destinations": { + "description": "specify log destinations for this log publisher to use", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Log_Destination" + } + } + }, + "required": [ + "class", + "destinations" + ] + }, + "Pointer_BIGIP": { + "title": "Pointer BIG-IP", + "description": "Reference for a BIG-IP object", + "type": "object", + "properties": { + "bigip": { + "description": "Path to BIG-IP object", + "type": "string" + } + }, + "required": [ + "bigip" + ], + "additionalProperties": false + }, + "Pointer_BIGIP_Or_Use": { + "title": "Pointer BIG-IP or Use", + "description": "Reference for a BIG-IP or Use object", + "if": { + "type": "object", + "required": [ + "bigip" + ] + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/Pointer_BIGIP" + } + ] + }, + "else": { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Use" + } + ] + } + }, + "Pointer_CA_Bundle": { + "title": "Pointer CA Bundle", + "description": "Reference to a Ca Bundle", + "additionalProperties": false, + "maxProperties": 1, + "minProperties": 1, + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP Ca Bundle", + "format": "f5bigip", + "type": "string" + }, + "use": { + "description": "BIG-IP AS3 pointer to Ca Bundle declaration", + "minLength": 1, + "type": "string", + "f5PostProcess": { + "data": { + "properties": { + "class": { + "enum": [ + "CA_Bundle" + ] + } + }, + "required": [ + "class" + ] + }, + "tag": "pointer" + } + } + }, + "type": "object", + "allOf": [ + { + "f5PostProcess": { + "data": [ + "query sys file ssl-cert" + ], + "tag": "bigComponent" + } + } + ] + }, + "Pointer_Certificate_Validator_OCSP": { + "title": "Pointer Certificate Validator OCSP", + "description": "Reference to a OCSP Cert Validator", + "additionalProperties": false, + "allOf": [ + { + "f5PostProcess": { + "data": [ + "query sys crypto cert-validator ocsp" + ], + "tag": "bigComponent" + } + } + ], + "maxProperties": 1, + "minProperties": 1, + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP OCSP Cert Validator", + "format": "f5bigip", + "type": "string" + }, + "use": { + "description": "BIG-IP AS3 pointer to OCSP Cert Validator declaration", + "f5PostProcess": { + "data": { + "properties": { + "class": { + "enum": [ + "Certificate_Validator_OCSP" + ] + } + }, + "required": [ + "class" + ] + }, + "tag": "pointer" + }, + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "Pointer_Copy_From": { + "title": "Copy from pointer", + "description": "pointer to declaration object/property from which to copy value", + "type": "string" + }, + "Pointer_DNS_Resolver": { + "title": "Pointer DNS Resolver", + "description": "Reference to a DNS resolver", + "type": "object", + "allOf": [ + { + "f5PostProcess": { + "data": [ + "query net dns-resolver" + ], + "tag": "bigComponent" + } + } + ], + "maxProperties": 1, + "minProperties": 1, + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP DNS resolver", + "format": "f5bigip", + "type": "string" + } + }, + "additionalProperties": false + }, + "Pointer_F5_String_Or_BIGIP": { + "title": "Pointer F5 String or BIG-IP", + "description": "Reference for a property or BIG-IP object", + "if": { + "type": "object", + "required": [ + "bigip" + ] + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/Pointer_BIGIP" + } + ] + }, + "else": { + "allOf": [ + { + "$ref": "#/definitions/F5_String" + } + ] + } + }, + "Pointer_HTTP_Acceleration_Profile": { + "title": "Pointer HTTP Acceleration Profile", + "additionalProperties": false, + "allOf": [ + { + "f5PostProcess": { + "data": [ + "query ltm profile web-acceleration" + ], + "tag": "bigComponent" + } + } + ], + "description": "Reference to a HTTP Acceleration Profile", + "maxProperties": 1, + "minProperties": 1, + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP HTTP Acceleration Profile", + "format": "f5bigip", + "type": "string" + }, + "use": { + "description": "AS3 pointer to HTTP Acceleration Profile declaration", + "f5PostProcess": { + "data": { + "properties": { + "class": { + "enum": [ + "HTTP_Acceleration_Profile" + ] + } + }, + "required": [ + "class" + ] + }, + "tag": "pointer" + }, + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "Pointer_HTTP_Profile": { + "title": "Pointer HTTP Profile", + "allOf": [ + { + "$ref": "#/definitions/Pointer_BIGIP_Or_Use" + }, + { + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP HTTP Profile", + "format": "f5bigip" + }, + "use": { + "description": "AS3 pointer to HTTP Profile declaration", + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "HTTP_Profile" + ] + } + }, + "required": [ + "class" + ] + } + }, + "minLength": 1 + } + }, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile http" + ] + } + } + ], + "description": "Reference to a HTTP Profile", + "maxProperties": 1, + "minProperties": 1 + }, + "Pointer_L4_Profile": { + "title": "Pointer L4 Profile", + "description": "Reference to a fast L4 profile", + "maxProperties": 1, + "minProperties": 1, + "allOf": [ + { + "$ref": "#/definitions/Pointer_BIGIP_Or_Use" + }, + { + "type": "object", + "properties": { + "use": { + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "L4_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "format": "f5bigip" + } + }, + "f5PostProcess": { + "data": [ + "query ltm profile fastl4" + ], + "tag": "bigComponent" + } + } + ] + }, + "Pointer_Log_Destination": { + "title": "Pointer Log Destination", + "description": "Reference to a log destination", + "allOf": [ + { + "$ref": "#/definitions/Pointer_BIGIP_Or_Use" + }, + { + "type": "object", + "properties": { + "use": { + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Log_Destination" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "format": "f5bigip" + } + }, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys log-config destination alertd", + "query sys log-config destination arcsight", + "query sys log-config destination ipfix", + "query sys log-config destination local-database", + "query sys log-config destination local-syslog", + "query sys log-config destination management-port", + "query sys log-config destination remote-high-speed-log", + "query sys log-config destination remote-syslog", + "query sys log-config destination splunk" + ] + } + } + ] + }, + "Pointer_Log_Publisher": { + "title": "Pointer Log Publisher", + "description": "Reference to a log publisher", + "allOf": [ + { + "$ref": "#/definitions/Pointer_BIGIP_Or_Use" + }, + { + "type": "object", + "properties": { + "use": { + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Log_Publisher" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "format": "f5bigip" + } + }, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys log-config publisher" + ] + } + } + ] + }, + "Pointer_Pool": { + "title": "Pointer Pool", + "description": "Reference to a pool", + "allOf": [ + { + "$ref": "#/definitions/Pointer_BIGIP_Or_Use" + }, + { + "type": "object", + "properties": { + "use": { + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Pool" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP pool", + "format": "f5bigip" + } + }, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm pool" + ] + } + } + ], + "minProperties": 1, + "maxProperties": 1 + }, + "Pointer_SSL_Certificate": { + "title": "Pointer SSL Certificate", + "description": "Reference to a SSL certificate", + "type": "object", + "allOf": [ + { + "f5PostProcess": { + "data": [ + "query sys file ssl-cert" + ], + "tag": "bigComponent" + } + } + ], + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP SSL certificate", + "format": "f5bigip", + "type": "string" + }, + "use": { + "description": "BIG-IP AS3 pointer to SSL certificate declaration", + "f5PostProcess": { + "data": { + "properties": { + "class": { + "enum": [ + "Certificate" + ] + } + }, + "required": [ + "class" + ] + }, + "tag": "pointer" + }, + "minLength": 1, + "type": "string" + } + }, + "maxProperties": 1, + "minProperties": 1, + "additionalProperties": false + }, + "Pointer_String": { + "title": "Pointer String", + "description": "Reference that is a string", + "type": "string" + }, + "Pointer_Use": { + "title": "Pointer Use", + "description": "Reference for use property", + "type": "object", + "properties": { + "use": { + "description": "Path to object in declaration", + "type": "string" + } + }, + "required": [ + "use" + ], + "additionalProperties": false + }, + "Pointer_WebSocket_Profile": { + "title": "Pointer WebSocket Profile", + "additionalProperties": false, + "allOf": [ + { + "f5PostProcess": { + "data": [ + "query ltm profile websocket" + ], + "tag": "bigComponent" + } + } + ], + "description": "Reference to a WebSocket Profile", + "maxProperties": 1, + "minProperties": 1, + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP WebSocket Profile", + "format": "f5bigip", + "type": "string" + }, + "use": { + "description": "AS3 pointer to WebSocket Profile declaration", + "f5PostProcess": { + "data": { + "properties": { + "class": { + "enum": [ + "WebSocket_Profile" + ] + } + }, + "required": [ + "class" + ] + }, + "tag": "pointer" + }, + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "Property_Base64": { + "title": "Property Base64", + "description": "A Base64-encoded value (base64 property)", + "allOf": [ + { + "$ref": "#/definitions/Resource_Base64" + } + ] + }, + "Property_Passphrase": { + "title": "Property Passphrase", + "description": "A passphrase (passphrase property)", + "allOf": [ + { + "$ref": "#/definitions/Secret" + } + ], + "f5PostProcess": { + "tag": "secret" + } + }, + "Property_Text": { + "title": "Property Text", + "description": "A text value (text property)", + "allOf": [ + { + "$ref": "#/definitions/Resource_Text" + } + ] + }, + "Resource_Base64": { + "title": "Resource Base64", + "description": "A Base64-encoded value", + "type": "string", + "pattern": "^([0-9A-Za-z/+_-]*|[0-9A-Za-z/+_-]+={1,2})$" + }, + "Resource_Text": { + "title": "Resource Text", + "description": "UTF-8 text (in JSON string)", + "type": "string" + }, + "Resource_URL": { + "title": "Resource URL", + "description": "The URL for a required resource", + "oneOf": [ + { + "type": "string", + "f5PostProcess": { + "tag": "expand" + }, + "format": "uri" + }, + { + "type": "object", + "properties": { + "authentication": { + "description": "Authentication to the remote source", + "oneOf": [ + { + "$ref": "#/definitions/Basic_Auth" + }, + { + "$ref": "#/definitions/Bearer_Token" + } + ] + }, + "ignoreChanges": { + "type": "boolean", + "description": "If false (default), the URL will be fetched in each BIG-IP AS3 declaration deployment. If true, the resource will be created on the first deployment, but not on additional deployments", + "default": false + }, + "skipCertificateCheck": { + "type": "boolean", + "description": "Skip verification of SSL certificates (default false)", + "default": false + }, + "url": { + "type": "string", + "description": "URL from which to retrieve value", + "f5PostProcess": { + "tag": "expand" + }, + "format": "uri" + } + }, + "required": [ + "url" + ], + "additionalProperties": false + } + ] + }, + "Secret": { + "title": "Secret value", + "description": "A value: (a) in a cryptogram in this object; (b) in a cryptogram elsewhere in this declaration; or (c) available from a URL", + "oneOf": [ + { + "type": "object", + "properties": { + "allowReuse": { + "title": "Allow reuse", + "description": "If true, other declaration objects may reuse this value", + "type": "boolean" + }, + "reuseFrom": { + "title": "Reuse from", + "description": "BIG-IP AS3 pointer to another JWE cryptogram in this declaration to copy", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "type": "object", + "required": [ + "ciphertext" + ] + } + } + }, + "url": { + "title": "URL", + "description": "URL from which secret should be fetched", + "allOf": [ + { + "$ref": "#/definitions/Secret_Resource_URL" + } + ] + } + }, + "oneOf": [ + { + "required": [ + "ciphertext" + ] + }, + { + "required": [ + "reuseFrom" + ] + }, + { + "required": [ + "url" + ] + } + ], + "if": { + "required": [ + "ciphertext" + ] + }, + "then": { + "$ref": "#/definitions/JWE" + } + } + ] + }, + "Secret_Resource_URL": { + "title": "Secret Resource URL", + "description": "Describes the URL to remote resource and optional parameters", + "oneOf": [ + { + "type": "string", + "format": "uri", + "f5PostProcess": { + "tag": "expand" + } + }, + { + "type": "object", + "properties": { + "url": { + "description": "URL from which to retrieve value", + "type": "string", + "format": "uri", + "f5PostProcess": { + "tag": "expand" + } + }, + "skipCertificateCheck": { + "description": "Skip verification of SSL certificates (default false)", + "type": "boolean", + "default": false + } + }, + "required": [ + "url" + ] + } + ] + }, + "UDP_Profile": { + "title": "UDP Profile", + "description": "Configures a User Datagram Protocol (UDP) profile", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "UDP_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "allowNoPayload": { + "title": "Allow empty payload", + "description": "When true, forward UDP datagrams with empty payloads (default false)", + "type": "boolean", + "default": false + }, + "bufferMaxBytes": { + "title": "Buffer maximum-bytes", + "description": "Limit to number of octets which the system may buffer for a UDP flow (default 655350)", + "type": "integer", + "minimum": 65535, + "maximum": 16777215, + "default": 655350 + }, + "bufferMaxPackets": { + "title": "Buffer maximum-packets", + "description": "Limit to number of packets which the system may buffer for a UDP flow (default 0)", + "type": "integer", + "minimum": 0, + "maximum": 255, + "default": 0 + }, + "datagramLoadBalancing": { + "title": "Datagram load-balancing", + "description": "When true, process UDP datagrams independently, without recognizing flows (default false)", + "type": "boolean", + "default": false + }, + "idleTimeout": { + "title": "Idle timeout", + "description": "Number of seconds (default 60) flow may remain idle before it becomes eligible for deletion. Value 0 allows system to recover per-flow resources whenever convenient (always safe with UDP). Value -1 means indefinite (not recommended)", + "type": "integer", + "minimum": -1, + "maximum": 86400, + "default": 60 + }, + "ipDfMode": { + "title": "IP DF mode", + "description": "Controls DF (Don't Fragment) flag in outgoing datagrams. Value 'pmtu' (default) sets DF based on IP PMTU value. Value 'preserve' copies DF from received datagram. Value 'set' forces DF true in all outgoing datagrams. Value 'clear' forces DF false in all outgoing datagrams", + "type": "string", + "enum": [ + "clear", + "pmtu", + "preserve", + "set" + ], + "default": "pmtu" + }, + "ipTosToClient": { + "title": "IP TOS/DSCP to client", + "description": "Specifies the IP TOS/DSCP value in packets sent to clients (default 0). Numeric values in this property are decimal representations of eight-bit numbers, of which the leftmost six bits are the DSCP code per rfc2474 (and the rightmost two bits reserved). You may have to calculate the value of this property by multiplying a DSCP code, such as CS5+EF = 46, by four, to obtain the 'ipTosToClient' value, such as 184. Value 'pass-through' sets DSCP from the initial server-side value. Value 'mimic' copies DSCP from the most-recently received server-side packet (allowing DSCP to vary during the life of a connection)", + "oneOf": [ + { + "type": "integer", + "minimum": 0, + "maximum": 252, + "multipleOf": 4 + }, + { + "type": "string", + "enum": [ + "pass-through", + "mimic" + ] + } + ], + "default": 0 + }, + "linkQosToClient": { + "title": "Link QOS to client", + "description": "Specifies the Layer-2 QOS value in packets sent to clients (default 0). Ethernet-type networks recognize numeric codes from 0 to 7. Value 'pass-through' sets QOS from the initial server-side value", + "oneOf": [ + { + "type": "integer", + "minimum": 0, + "maximum": 7 + }, + { + "type": "string", + "const": "pass-through" + } + ], + "default": 0 + }, + "proxyMSS": { + "title": "Proxy MSS", + "description": "When true, MSS advertised on the server side will match that negotiated with the client, if permitted by MTU and other constraints (default false)", + "type": "boolean", + "default": false + }, + "ttlIPv4": { + "title": "TTL for IPv4", + "description": "TTL the system sets in outgoing IPv4 datagrams", + "type": "integer", + "minimum": 1, + "maximum": 255, + "default": 255 + }, + "ttlIPv6": { + "title": "TTL for IPv6", + "description": "TTL the system sets in outgoing IPv6 datagrams", + "type": "integer", + "minimum": 1, + "maximum": 255, + "default": 64 + }, + "ttlMode": { + "title": "TTL mode", + "description": "Controls IP TTL in outgoing datagrams. Value 'set' forces TTL to value of property 'ttlIPv4' or 'ttlIPv6' as appropriate. Value 'proxy' forces TTL to the default value for IPv4 or IPv6 as appropriate. Value 'preserve' copies TTL from received datagram. Value 'decrement' sets TTL to one less than received datagram's TTL", + "type": "string", + "enum": [ + "decrement", + "preserve", + "proxy", + "set" + ], + "default": "proxy" + }, + "useChecksum": { + "title": "Use checksum", + "description": "When true, system will validate UDP checksums for IPv4 datagrams (default false). Checksums are always validated for IPv6", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false, + "required": [ + "class" + ] + } + } +} \ No newline at end of file diff --git a/schema/3.46.0/as3-schema.json b/schema/3.46.0/as3-schema.json new file mode 100644 index 00000000..0148cb6d --- /dev/null +++ b/schema/3.46.0/as3-schema.json @@ -0,0 +1,35462 @@ +{ + "$id": "urn:uuid:85626792-9ee7-46bb-8fc8-4ba708cfdc1d", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "AS3 API Request", + "description": "BIG-IP AS3 API request body", + "oneOf": [ + { + "$ref": "#/definitions/AS3" + }, + { + "$ref": "#/definitions/ADC" + }, + { + "$ref": "#/definitions/AS3_Patch_Body" + }, + { + "$ref": "#/definitions/AS3_Array" + }, + { + "$ref": "#/definitions/ADC_Array" + } + ], + "definitions": { + "ADC": { + "title": "ADC", + "description": "A declarative configuration for an ADC such as F5 BIG-IP", + "type": "object", + "properties": { + "class": { + "title": "Class", + "description": "Indicates this JSON document is an ADC declaration", + "type": "string", + "const": "ADC" + }, + "$schema": { + "description": "URL of schema against which to validate. Used by validation in your local environment only (via Visual Studio Code, for example)", + "type": "string", + "format": "uri" + }, + "updateMode": { + "title": "Update mode", + "description": "When set to 'selective' (default) BIG-IP AS3 does not modify Tenants not referenced in the declaration. Otherwise ('complete') BIG-IP AS3 removes unreferenced Tenants.", + "type": "string", + "enum": [ + "complete", + "selective" + ], + "default": "selective" + }, + "schemaVersion": { + "title": "Schema version", + "description": "Version of ADC Declaration schema this declaration uses", + "type": "string", + "$comment": "IMPORTANT: In enum array, please put current schema version first, oldest-supported version last. Keep enum array sorted most-recent-first.", + "enum": [ + "3.46.0", + "3.45.0", + "3.44.0", + "3.43.0", + "3.42.0", + "3.41.0", + "3.40.0", + "3.39.0", + "3.38.0", + "3.37.0", + "3.36.0", + "3.35.0", + "3.34.0", + "3.33.0", + "3.32.0", + "3.31.0", + "3.30.0", + "3.29.0", + "3.28.0", + "3.27.0", + "3.26.0", + "3.25.0", + "3.24.0", + "3.23.0", + "3.22.0", + "3.21.0", + "3.20.0", + "3.19.0", + "3.18.0", + "3.17.0", + "3.16.0", + "3.15.0", + "3.14.0", + "3.13.0", + "3.12.0", + "3.11.0", + "3.10.0", + "3.9.0", + "3.8.0", + "3.7.0", + "3.6.0", + "3.5.0", + "3.4.0", + "3.3.0", + "3.2.0", + "3.1.0", + "3.0.0" + ] + }, + "id": { + "title": "Declaration ID", + "description": "Unique identifier for this declaration (max 255 printable chars with no spaces, quotation marks, angle brackets, nor backslashes)", + "type": "string", + "pattern": "^[^\\x00-\\x20\\x22'<>\\x5c^`|\\x7f]*$", + "minLength": 0, + "maxLength": 255 + }, + "target": { + "title": "Target Device", + "description": "Trusted target for config when configuring with BIG-IQ", + "type": "object", + "properties": { + "hostname": { + "title": "Host Name", + "description": "Host name of managed device to be configured", + "type": "string" + }, + "address": { + "title": "IP Address", + "description": "IP address of managed device to be configured", + "type": "string", + "format": "f5ip" + } + }, + "maxProperties": 1 + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "constants": { + "title": "Constants", + "description": "Declaration metadata and/or named values for (re-)use by declaration objects", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Constants", + "default": "Constants" + }, + "version": { + "title": "Declaration version", + "description": "Version number of declaration; update when you change contents but not ID (optional but recommended)", + "type": [ + "number", + "string" + ] + }, + "timestamp": { + "title": "Declaration timestamp", + "description": "Date+time (this version of) declaration was created (optional but recommended)", + "type": "string", + "format": "date-time" + } + }, + "additionalProperties": { + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object" + ], + "if": { + "type": "object", + "required": [ + "protected", + "ciphertext" + ] + }, + "then": { + "properties": { + "allowReuse": { + "title": "Allow reuse", + "description": "If true (default), different declaration objects may reuse a cryptogram, WHICH MAY POSE A SECURITY RISK!", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false, + "allOf": [ + { + "$ref": "#/definitions/JWE" + } + ] + } + }, + "propertyNames": { + "pattern": "^[A-Za-z][0-9A-Za-z_]*$", + "maxLength": 64 + } + }, + "Common": { + "title": "Common tenant", + "description": "Special tenant Common holds objects other tenants can share", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Tenant", + "default": "Tenant" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "verifiers": { + "title": "Verifiers", + "description": "Data (in 'key':'value' properties) used to verify automated tests. Ordinary declarations do not need this", + "type": "object" + }, + "enable": { + "title": "Enable", + "description": "If declared, you must enable the Common tenant", + "type": "boolean", + "const": true + }, + "Shared": { + "$ref": "#/definitions/Application_Shared" + }, + "constants": { + "$ref": "#/definitions/Constants" + }, + "controls": { + "$ref": "#/definitions/Controls" + }, + "optimisticLockKey": { + "title": "Optimistic lock key", + "description": "When you deploy a declaration with a non-empty 'key' value here, that activates an optimistic lock on changes to this Tenant. If the key in your declaration does not match the key BIG-IP AS3 computes for the most-recent previous declaration, then BIG-IP AS3 will NOT update this Tenant and will return an error code. To use optimistic locking, first retrieve a declaration using option 'showHash=true' to get the current per-Tenant keys. Make any changes you desire, then deploy your updated declaration. Deployment of each Tenant with a key will succeed only if that Tenant has not been modified since the time you retrieved the declaration. (To overwrite all previous changes to a Tenant simply do NOT include any opportunistic-lock key for that Tenant when you deploy a declaration. That is the default.) Note that only keys computed by BIG-IP AS3 may be used here-- you cannot generate your own. If 'showHash=true' is used on a POST then the optimisticLockKey will be shown as a part of the output (This helps to avoid the need to do a GET request).", + "type": "string", + "maxLength": 128, + "default": "" + } + }, + "additionalProperties": false + }, + "controls": { + "$ref": "#/definitions/Controls" + }, + "scratch": { + "title": "f5 scratch", + "description": "Holds some system data during declaration processing", + "type": "string", + "readOnly": true + } + }, + "additionalProperties": { + "$ref": "#/definitions/Tenant" + }, + "propertyNames": { + "oneOf": [ + { + "pattern": "^[A-Za-z][0-9A-Za-z_.-]*$", + "maxLength": 190 + }, + { + "enum": [ + "$schema" + ] + } + ] + }, + "required": [ + "class", + "schemaVersion" + ] + }, + "ADC_Array": { + "title": "Declaration Array", + "description": "An array of declarations (ADC) to process", + "type": "array", + "items": { + "$ref": "#/definitions/ADC" + }, + "minItems": 1 + }, + "AS3_Patch_Item": { + "type": "object", + "title": "AS3 PATCH item", + "description": "Defines a PATCH operation to perform", + "properties": { + "op": { + "title": "Op", + "description": "Operation to perform", + "type": "string" + }, + "path": { + "title": "Path", + "description": "Declaration Object Path relative to URI on which the operation is to be performed", + "type": "string" + }, + "value": { + "title": "Value", + "description": "Value to use for the operation", + "type": [ + "string", + "number", + "boolean", + "object", + "array" + ] + }, + "target": { + "title": "Optional Target Device", + "description": "Optional target device (only applies when configuring with certain hosts such as BIG-IQ)", + "type": "object", + "properties": { + "hostname": { + "title": "Host Name", + "description": "Host name of managed device to be configured", + "type": "string" + }, + "address": { + "title": "IP Address", + "description": "IP address of managed device to be configured", + "type": "string", + "format": "f5ip" + } + }, + "maxProperties": 1 + } + }, + "required": [ + "op", + "path" + ] + }, + "AS3_Patch_Body": { + "title": "AS3 PATCH Body", + "description": "An array containing the patch operations to apply on the declaration", + "type": "array", + "items": { + "$ref": "#/definitions/AS3_Patch_Item" + }, + "$comment": "Refer to docs for additional information on patch request syntax", + "minItems": 1 + }, + "AS3": { + "title": "AS3 Request", + "description": "A body with AS3 Class", + "type": "object", + "properties": { + "class": { + "title": "Class", + "description": "Indicates a BIG-IP AS3 request", + "type": "string", + "const": "AS3" + }, + "$schema": { + "description": "URL of schema against which to validate. Used by validation in your local environment only (via Visual Studio Code, for example)", + "type": "string", + "format": "uri" + }, + "action": { + "title": "Action", + "description": "Indicates desired action: 'deploy' means deploy the included declaration to targetHost; 'dry-run' does NOT deploy the declaration but does do everything short of changing targetHost's configuration; 'patch' modifies the declaration based on the provided set of commands and then deploys the updated declaration; 'redeploy' causes an old declaration from targetHost's declaration history to be re-deployed (property redeployAge (default 0) selects the old declaration, and note redeployUpdateMode as well); 'retrieve' returns a copy of a previously-deployed declaration; 'remove' deletes the declaration or declaration component.", + "type": "string", + "enum": [ + "deploy", + "dry-run", + "patch", + "redeploy", + "retrieve", + "remove" + ], + "default": "deploy" + }, + "redeployAge": { + "title": "Redeploy age", + "description": "For action=redeploy (only), chooses which old declaration to deploy again. Value 0 (default) means re-deploy the most recent declaration (the one which set the current configuration of targetHost-- useful to erase changes introduced by manual configuration). Value 1 means re-deploy the declaration prior to the most-recent one, etc. Note that whenever re-deploying an old declaration causes ADC configuration changes, that declaration becomes the current declaration (age 0) and the ages of all other declarations in the history increase (0 => 1, 1 => 2, u.s.w.)", + "type": "integer", + "minimum": 0, + "maximum": 15, + "default": 0 + }, + "redeployUpdateMode": { + "title": "Redeploy update mode", + "description": "Value 'original' (default) means re-deploy the chosen declaration using its original updateMode (which if not explicitly specified in that declaration will default to 'selective'). Otherwise, forces the updateMode for re-deployment to 'complete' or 'selective' as specified. Remember, 'selective' updates do not affect Tenants not explicitly named. To simply roll-back the targetHost configuration to the state it had immediately after deploying some earlier declaration, put 'complete' here (that will remove Tenants created later than the redeployAge declaration). To use action=redeploy as a simple roll-back facility, always deploy (updateMode=)complete declarations.", + "type": "string", + "enum": [ + "original", + "complete", + "selective" + ], + "default": "original" + }, + "persist": { + "title": "Persist on device", + "description": "When true (default) make the whole working configuration persistent on targetHost after (and only if) this request deploys any changes. If false, leave the working configuration in memory only (if targetHost restart, you may lose the configuration from memory)", + "type": "boolean", + "default": true + }, + "syncToGroup": { + "title": "Sync to device group", + "description": "Name (like /Common/my_dg) of the config-sync group TO which the system should synchronize the targetHost configuration after (and only if) this request deploys any changes. When empty (default) this request will not affect config-sync at all. Leave undefined or empty whenever you use auto-sync or manage configuration synchronization separately", + "type": "string", + "default": "" + }, + "historyLimit": { + "title": "History limit", + "description": "This value (default 4) limits the number of previously-deployed declarations saved on targetHost for review using GET and for use with POST action=redeploy and redeployAge=N. The limit includes the current and immediately-previous declarations so may not be less than two", + "type": "number", + "minimum": 2, + "maximum": 15, + "default": 4 + }, + "logLevel": { + "title": "Log level", + "description": "Controls level of detail in logs using RFC 5424 severity levels (default is 'warning'). Portions of declaration may use different logLevels", + "type": "string", + "enum": [ + "emergency", + "alert", + "critical", + "error", + "warning", + "notice", + "info", + "debug" + ], + "default": "warning" + }, + "trace": { + "title": "Trace", + "description": "If true, BIG-IP AS3 creates a detailed trace of the configuration process for subsequent analysis (default false). May be overridden on a per-Declaration and/or per-Tenant basis. Warning: trace files may contain sensitive configuration data", + "type": "boolean", + "default": false + }, + "retrieveAge": { + "title": "Retrieve age", + "description": "Use this property with action=retrieve. You can usually get a copy of the declaration most recently deployed to targetHost, and often copies of previously-deployed declarations are also available. Value 0 (default) means 'the last-deployed declaration,' value 1 means 'the declaration previous to 0' and so-forth. To get a list of available declarations, set value 'list'", + "oneOf": [ + { + "type": "integer", + "minimum": 0 + }, + { + "type": "string", + "const": "list" + } + ], + "default": 0 + }, + "targetHost": { + "title": "Target host", + "description": "Hostname or IP address of ADC to which request applies (default localhost)", + "type": "string", + "anyOf": [ + { + "format": "hostname" + }, + { + "format": "f5ip" + } + ], + "default": "localhost" + }, + "targetPort": { + "title": "Target port", + "description": "TCP port number of management service on targetHost; default 0 means auto-discover", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 0 + }, + "targetUsername": { + "title": "Target username", + "description": "Username of principal authorized to modify configuration of targetHost (may not include the character ':'). NOTE: this is generally not required to configure 'localhost' because client authentication and authorization precede invocation of BIG-IP AS3. It is also not required for any targetHost if you populate targetTokens", + "type": "string", + "pattern": "^[^:]*$", + "maxLength": 254 + }, + "targetPassphrase": { + "title": "Target passphrase", + "description": "Passphrase for targetUsername account. This is generally not required to configure 'localhost' and is not required when you populate targetTokens", + "type": "string", + "maxLength": 254 + }, + "targetTokens": { + "title": "Target tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABC123') you want to send with queries to the targetHost management service as authentication/authorization tokens", + "type": "object", + "patternProperties": { + "^[^\\x00-\\x20:\\x7f-\\xff]{1,254}$": { + "title": "HTTP header", + "type": "string", + "pattern": "^[^\\x00-\\x1f\\x7f-\\xff]*$", + "maxLength": 8192 + } + }, + "additionalProperties": false + }, + "targetTimeout": { + "title": "Target timeout", + "description": "Maximum delay allowed while communicating with targetHost device (seconds, default 150)", + "type": "integer", + "minimum": 1, + "maximum": 900, + "default": 150 + }, + "resourceTimeout": { + "title": "Resource timeout", + "description": "Maximum delay allowed while communicating with URL resources (seconds, default 5)", + "type": "integer", + "minimum": 1, + "maximum": 900, + "default": 5 + }, + "declaration": { + "$ref": "#/definitions/ADC" + }, + "patchBody": { + "$ref": "#/definitions/AS3_Patch_Body" + } + }, + "dependencies": { + "declaration": { + "not": { + "required": [ + "patchBody" + ] + } + }, + "patchBody": { + "not": { + "required": [ + "declaration" + ] + } + } + }, + "required": [ + "class" + ] + }, + "AS3_Array": { + "title": "AS3 Array", + "description": "An array of BIG-IP AS3 requests to process", + "type": "array", + "items": { + "$ref": "#/definitions/AS3" + }, + "minItems": 1 + }, + "Include": { + "title": "Include", + "description": "Defines inclusion of one part of the schema into another", + "type": "object", + "properties": { + "include": { + "description": "Keyword to allow for inclusion of one part of the declaration into another", + "oneOf": [ + { + "type": "string", + "format": "f5pointer" + }, + { + "type": "array", + "items": { + "type": "string", + "format": "f5pointer" + } + } + ], + "f5PostProcess": { + "tag": "include", + "data": "object" + } + } + } + }, + "Tenant": { + "title": "Tenant", + "description": "Declares a Tenant", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Tenant" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "verifiers": { + "title": "Verifiers", + "description": "Data (in 'key':'value' properties) used to verify automated tests. Ordinary declarations do not need this", + "type": "object" + }, + "enable": { + "title": "Enable", + "description": "Tenant handles traffic only when enabled (default)", + "type": "boolean", + "default": true + }, + "defaultRouteDomain": { + "title": "Default route domain", + "description": "Using the route-domain ID, this property selects the default route domain for IP traffic to and from this Tenant's application resources (note: affects declared IP addresses which do not include a %RD route-domain specifier). You must choose an existing route domain--this option cannot create one. Route domain 0 (default) is always available", + "$comment": "TMSH forces this value to be an integer", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 0, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query net route-domain" + ] + } + }, + "Shared": { + "$ref": "#/definitions/Application_Shared" + }, + "constants": { + "$ref": "#/definitions/Constants" + }, + "controls": { + "$ref": "#/definitions/Controls" + }, + "optimisticLockKey": { + "title": "Optimistic lock key", + "description": "When you deploy a declaration with a non-empty 'key' value here, that activates an optimistic lock on changes to this Tenant. If the key in your declaration does not match the key BIG-IP AS3 computes for the most-recent previous declaration, then BIG-IP AS3 will NOT update this Tenant and will return an error code. To use optimistic locking, first retrieve a declaration using option 'showHash=true' to get the current per-Tenant keys. Make any changes you desire, then deploy your updated declaration. Deployment of each Tenant with a key will succeed only if that Tenant has not been modified since the time you retrieved the declaration. (To overwrite all previous changes to a Tenant simply do NOT include any opportunistic-lock key for that Tenant when you deploy a declaration. That is the default.) Note that only keys computed by BIG-IP AS3 may be used here-- you cannot generate your own. If 'showHash=true' is used on a POST then the optimisticLockKey will be shown as a part of the output (This helps to avoid the need to do a GET request).", + "type": "string", + "maxLength": 128, + "default": "" + } + }, + "additionalProperties": { + "$ref": "#/definitions/Application" + }, + "propertyNames": { + "pattern": "^[A-Za-z][0-9A-Za-z_.-]*$", + "maxLength": 190 + }, + "required": [ + "class" + ] + }, + "Application_Shared": { + "title": "Shared Application", + "description": "Special application Shared holds objects other applications can share", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Application" + }, + "template": { + "title": "Template Name", + "description": "Shared Application template is always generic", + "type": "string", + "const": "shared" + }, + "enable": { + "title": "Enable", + "description": "If declared, you must enable the Shared Application", + "type": "boolean", + "const": true, + "default": true + } + }, + "allOf": [ + { + "$ref": "#/definitions/Application" + } + ], + "required": [ + "class", + "template" + ] + }, + "Application": { + "title": "Application", + "description": "Application declaration main schema", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Application" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "template": { + "title": "Template Name", + "description": "Each application type has certain required and default elements and selects appropriate setup of various ADC/Security features", + "type": "string", + "default": "generic" + }, + "schemaOverlay": { + "title": "Schema Overlay", + "description": "BIG-IQ name for a supplemental validation schema is applied to the Application class definition before the main BIG-IP AS3 schema", + "type": "string" + }, + "enable": { + "title": "Enable", + "description": "Application handles traffic only when enabled (default)", + "type": "boolean", + "default": true + }, + "constants": { + "$ref": "#/definitions/Constants" + }, + "serviceMain": { + "description": "Primary service of the application" + } + }, + "additionalProperties": { + "properties": { + "class": { + "type": "string", + "enum": [ + "Service_HTTP", + "Service_HTTPS", + "Service_TCP", + "Service_UDP", + "Service_SCTP", + "Service_L4", + "Service_Generic", + "Service_Forwarding", + "Service_Address", + "SNAT_Pool", + "SNAT_Translation", + "WAF_Policy", + "Persist", + "Pool", + "Address_Discovery", + "Monitor", + "TLS_Server", + "TLS_Client", + "FIX_Profile", + "RTSP_Profile", + "SIP_Profile", + "Statistics_Profile", + "TFTP_Profile", + "FTP_Profile", + "HTML_Rule", + "HTML_Profile", + "WebSocket_Profile", + "Multiplex_Profile", + "SOCKS_Profile", + "TCP_Profile", + "Classification_Profile", + "Radius_Profile", + "IP_Other_Profile", + "Rewrite_Profile", + "Stream_Profile", + "Access_Profile", + "Per_Request_Access_Policy", + "ICAP_Profile", + "Adapt_Profile", + "Cipher_Rule", + "Cipher_Group", + "iFile", + "Firewall_Address_List", + "Firewall_Port_List", + "Firewall_Rule_List", + "Firewall_Policy", + "NAT_Policy", + "NAT_Source_Translation", + "Protocol_Inspection_Profile", + "SSH_Proxy_Profile", + "Data_Group", + "DNS_Cache", + "DNS_Profile", + "DNS_TSIG_Key", + "DNS_Zone", + "DNS_Nameserver", + "DOS_Profile", + "GSLB_Domain", + "GSLB_iRule", + "GSLB_Monitor", + "GSLB_Pool", + "GSLB_Server", + "GSLB_Data_Center", + "GSLB_Prober_Pool", + "GSLB_Topology_Records", + "GSLB_Topology_Region", + "ALG_Log_Profile", + "Security_Log_Profile", + "Traffic_Log_Profile", + "Endpoint_Policy", + "Endpoint_Strategy", + "Bandwidth_Control_Policy", + "Idle_Timeout_Policy", + "Net_Address_List", + "Net_Port_List", + "Enforcement_Policy", + "Enforcement_Diameter_Endpoint_Profile", + "Enforcement_iRule", + "Enforcement_Radius_AAA_Profile", + "Enforcement_Profile", + "Enforcement_Subscriber_Management_Profile", + "Enforcement_Listener", + "Enforcement_Interception_Endpoint", + "Enforcement_Format_Script", + "Enforcement_Forwarding_Endpoint", + "Enforcement_Service_Chain_Endpoint", + "Analytics_Profile", + "Analytics_TCP_Profile", + "CA_Bundle", + "Certificate", + "Certificate_Validator_OCSP", + "DNS_Logging_Profile", + "HTTP_Acceleration_Profile", + "HTTP_Compress", + "HTTP_Profile", + "HTTP2_Profile", + "iRule", + "L4_Profile", + "Log_Destination", + "Log_Publisher", + "UDP_Profile" + ] + } + }, + "allOf": [ + { + "if": { + "properties": { + "class": { + "const": "Service_HTTP" + } + } + }, + "then": { + "$ref": "#/definitions/Service_HTTP" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Service_HTTPS" + } + } + }, + "then": { + "$ref": "#/definitions/Service_HTTPS" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Service_TCP" + } + } + }, + "then": { + "$ref": "#/definitions/Service_TCP" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Service_UDP" + } + } + }, + "then": { + "$ref": "#/definitions/Service_UDP" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Service_SCTP" + } + } + }, + "then": { + "$ref": "#/definitions/Service_SCTP" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Service_L4" + } + } + }, + "then": { + "$ref": "#/definitions/Service_L4" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Service_Generic" + } + } + }, + "then": { + "$ref": "#/definitions/Service_Generic" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Service_Forwarding" + } + } + }, + "then": { + "$ref": "#/definitions/Service_Forwarding" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Service_Address" + } + } + }, + "then": { + "$ref": "#/definitions/Service_Address" + } + }, + { + "if": { + "properties": { + "class": { + "const": "SNAT_Pool" + } + } + }, + "then": { + "$ref": "#/definitions/SNAT_Pool" + } + }, + { + "if": { + "properties": { + "class": { + "const": "SNAT_Translation" + } + } + }, + "then": { + "$ref": "#/definitions/SNAT_Translation" + } + }, + { + "if": { + "properties": { + "class": { + "const": "WAF_Policy" + } + } + }, + "then": { + "$ref": "#/definitions/WAF_Policy" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Persist" + } + } + }, + "then": { + "$ref": "#/definitions/Persist" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Pool" + } + } + }, + "then": { + "$ref": "#/definitions/Pool" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Address_Discovery" + } + } + }, + "then": { + "$ref": "#/definitions/Address_Discovery" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Monitor" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor" + } + }, + { + "if": { + "properties": { + "class": { + "const": "TLS_Server" + } + } + }, + "then": { + "$ref": "#/definitions/TLS_Server" + } + }, + { + "if": { + "properties": { + "class": { + "const": "TLS_Client" + } + } + }, + "then": { + "$ref": "#/definitions/TLS_Client" + } + }, + { + "if": { + "properties": { + "class": { + "const": "FIX_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/FIX_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "RTSP_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/RTSP_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "SIP_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/SIP_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Statistics_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Statistics_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "TFTP_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/TFTP_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "FTP_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/FTP_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "HTML_Rule" + } + } + }, + "then": { + "$ref": "#/definitions/HTML_Rule" + } + }, + { + "if": { + "properties": { + "class": { + "const": "HTML_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/HTML_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "WebSocket_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/WebSocket_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Multiplex_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Multiplex_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "SOCKS_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/SOCKS_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "TCP_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/TCP_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Classification_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Classification_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Radius_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Radius_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "IP_Other_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/IP_Other_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Rewrite_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Rewrite_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Stream_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Stream_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Access_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Access_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Per_Request_Access_Policy" + } + } + }, + "then": { + "$ref": "#/definitions/Per_Request_Access_Policy" + } + }, + { + "if": { + "properties": { + "class": { + "const": "ICAP_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/ICAP_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Adapt_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Adapt_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Cipher_Rule" + } + } + }, + "then": { + "$ref": "#/definitions/Cipher_Rule" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Cipher_Group" + } + } + }, + "then": { + "$ref": "#/definitions/Cipher_Group" + } + }, + { + "if": { + "properties": { + "class": { + "const": "iFile" + } + } + }, + "then": { + "$ref": "#/definitions/iFile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Firewall_Address_List" + } + } + }, + "then": { + "$ref": "#/definitions/Firewall_Address_List" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Firewall_Port_List" + } + } + }, + "then": { + "$ref": "#/definitions/Firewall_Port_List" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Firewall_Rule_List" + } + } + }, + "then": { + "$ref": "#/definitions/Firewall_Rule_List" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Firewall_Policy" + } + } + }, + "then": { + "$ref": "#/definitions/Firewall_Policy" + } + }, + { + "if": { + "properties": { + "class": { + "const": "NAT_Policy" + } + } + }, + "then": { + "$ref": "#/definitions/NAT_Policy" + } + }, + { + "if": { + "properties": { + "class": { + "const": "NAT_Source_Translation" + } + } + }, + "then": { + "$ref": "#/definitions/NAT_Source_Translation" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Protocol_Inspection_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Protocol_Inspection_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "SSH_Proxy_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/SSH_Proxy_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Data_Group" + } + } + }, + "then": { + "$ref": "#/definitions/Data_Group" + } + }, + { + "if": { + "properties": { + "class": { + "const": "DNS_Cache" + } + } + }, + "then": { + "$ref": "#/definitions/DNS_Cache" + } + }, + { + "if": { + "properties": { + "class": { + "const": "DNS_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/DNS_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "DNS_TSIG_Key" + } + } + }, + "then": { + "$ref": "#/definitions/DNS_TSIG_Key" + } + }, + { + "if": { + "properties": { + "class": { + "const": "DNS_Zone" + } + } + }, + "then": { + "$ref": "#/definitions/DNS_Zone" + } + }, + { + "if": { + "properties": { + "class": { + "const": "DNS_Nameserver" + } + } + }, + "then": { + "$ref": "#/definitions/DNS_Nameserver" + } + }, + { + "if": { + "properties": { + "class": { + "const": "DOS_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/DOS_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "GSLB_Domain" + } + } + }, + "then": { + "$ref": "#/definitions/GSLB_Domain" + } + }, + { + "if": { + "properties": { + "class": { + "const": "GSLB_iRule" + } + } + }, + "then": { + "$ref": "#/definitions/GSLB_iRule" + } + }, + { + "if": { + "properties": { + "class": { + "const": "GSLB_Monitor" + } + } + }, + "then": { + "$ref": "#/definitions/GSLB_Monitor" + } + }, + { + "if": { + "properties": { + "class": { + "const": "GSLB_Pool" + } + } + }, + "then": { + "$ref": "#/definitions/GSLB_Pool" + } + }, + { + "if": { + "properties": { + "class": { + "const": "GSLB_Server" + } + } + }, + "then": { + "$ref": "#/definitions/GSLB_Server" + } + }, + { + "if": { + "properties": { + "class": { + "const": "GSLB_Data_Center" + } + } + }, + "then": { + "$ref": "#/definitions/GSLB_Data_Center" + } + }, + { + "if": { + "properties": { + "class": { + "const": "GSLB_Prober_Pool" + } + } + }, + "then": { + "$ref": "#/definitions/GSLB_Prober_Pool" + } + }, + { + "if": { + "properties": { + "class": { + "const": "GSLB_Topology_Records" + } + } + }, + "then": { + "$ref": "#/definitions/GSLB_Topology_Records" + } + }, + { + "if": { + "properties": { + "class": { + "const": "GSLB_Topology_Region" + } + } + }, + "then": { + "$ref": "#/definitions/GSLB_Topology_Region" + } + }, + { + "if": { + "properties": { + "class": { + "const": "ALG_Log_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/ALG_Log_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Security_Log_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Security_Log_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Traffic_Log_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Traffic_Log_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Endpoint_Policy" + } + } + }, + "then": { + "$ref": "#/definitions/Endpoint_Policy" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Endpoint_Strategy" + } + } + }, + "then": { + "$ref": "#/definitions/Endpoint_Strategy" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Bandwidth_Control_Policy" + } + } + }, + "then": { + "$ref": "#/definitions/Bandwidth_Control_Policy" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Idle_Timeout_Policy" + } + } + }, + "then": { + "$ref": "#/definitions/Idle_Timeout_Policy" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Net_Address_List" + } + } + }, + "then": { + "$ref": "#/definitions/Net_Address_List" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Net_Port_List" + } + } + }, + "then": { + "$ref": "#/definitions/Net_Port_List" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Enforcement_Policy" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Policy" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Enforcement_Diameter_Endpoint_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Diameter_Endpoint_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Enforcement_iRule" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_iRule" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Enforcement_Radius_AAA_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Radius_AAA_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Enforcement_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Enforcement_Subscriber_Management_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Subscriber_Management_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Enforcement_Listener" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Listener" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Enforcement_Interception_Endpoint" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Interception_Endpoint" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Enforcement_Format_Script" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Format_Script" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Enforcement_Forwarding_Endpoint" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Forwarding_Endpoint" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Enforcement_Service_Chain_Endpoint" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Service_Chain_Endpoint" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Analytics_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Analytics_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Analytics_TCP_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Analytics_TCP_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "CA_Bundle" + } + } + }, + "then": { + "$ref": "#/definitions/CA_Bundle" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Certificate" + } + } + }, + "then": { + "$ref": "#/definitions/Certificate" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Certificate_Validator_OCSP" + } + } + }, + "then": { + "$ref": "#/definitions/Certificate_Validator_OCSP" + } + }, + { + "if": { + "properties": { + "class": { + "const": "DNS_Logging_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/DNS_Logging_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "HTTP_Acceleration_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/HTTP_Acceleration_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "HTTP_Compress" + } + } + }, + "then": { + "$ref": "#/definitions/HTTP_Compress" + } + }, + { + "if": { + "properties": { + "class": { + "const": "HTTP_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/HTTP_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "HTTP2_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/HTTP2_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "iRule" + } + } + }, + "then": { + "$ref": "#/definitions/IRule" + } + }, + { + "if": { + "properties": { + "class": { + "const": "L4_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/L4_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Log_Destination" + } + } + }, + "then": { + "$ref": "#/definitions/Log_Destination" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Log_Publisher" + } + } + }, + "then": { + "$ref": "#/definitions/Log_Publisher" + } + }, + { + "if": { + "properties": { + "class": { + "const": "UDP_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/UDP_Profile" + } + } + ] + }, + "propertyNames": { + "pattern": "^[A-Za-z]([0-9A-Za-z_.-]{0,188}[0-9A-Za-z_.])?$", + "maxLength": 190 + }, + "allOf": [ + { + "if": { + "required": [ + "template" + ], + "properties": { + "template": { + "const": "https" + } + } + }, + "then": { + "$ref": "#/definitions/Template_https" + } + }, + { + "if": { + "required": [ + "template" + ], + "properties": { + "template": { + "const": "http" + } + } + }, + "then": { + "$ref": "#/definitions/Template_http" + } + }, + { + "if": { + "required": [ + "template" + ], + "properties": { + "template": { + "const": "tcp" + } + } + }, + "then": { + "$ref": "#/definitions/Template_tcp" + } + }, + { + "if": { + "required": [ + "template" + ], + "properties": { + "template": { + "const": "udp" + } + } + }, + "then": { + "$ref": "#/definitions/Template_udp" + } + }, + { + "if": { + "required": [ + "template" + ], + "properties": { + "template": { + "const": "sctp" + } + } + }, + "then": { + "$ref": "#/definitions/Template_sctp" + } + }, + { + "if": { + "required": [ + "template" + ], + "properties": { + "template": { + "const": "l4" + } + } + }, + "then": { + "$ref": "#/definitions/Template_l4" + } + }, + { + "if": { + "required": [ + "template" + ], + "properties": { + "template": { + "const": "generic" + } + } + }, + "then": { + "$ref": "#/definitions/Template_generic" + } + } + ], + "required": [ + "class" + ] + }, + "Template_https": { + "title": "HTTPS application", + "description": "Declares an HTTPS application", + "type": "object", + "properties": { + "serviceMain": { + "$ref": "#/definitions/Service_HTTPS" + } + }, + "required": [ + "serviceMain" + ] + }, + "Template_http": { + "title": "HTTP application", + "description": "Declares an HTTP application", + "type": "object", + "properties": { + "serviceMain": { + "$ref": "#/definitions/Service_HTTP" + } + }, + "required": [ + "serviceMain" + ] + }, + "Template_tcp": { + "title": "TCP application", + "description": "Declares a TCP application", + "type": "object", + "properties": { + "serviceMain": { + "$ref": "#/definitions/Service_TCP" + } + }, + "required": [ + "serviceMain" + ] + }, + "Template_udp": { + "title": "UDP application", + "description": "Declares a UDP application", + "type": "object", + "properties": { + "serviceMain": { + "$ref": "#/definitions/Service_UDP" + } + }, + "required": [ + "serviceMain" + ] + }, + "Template_sctp": { + "title": "SCTP application", + "description": "Declares a SCTP application", + "type": "object", + "properties": { + "serviceMain": { + "$ref": "#/definitions/Service_SCTP" + } + }, + "required": [ + "serviceMain" + ] + }, + "Template_l4": { + "title": "L4 application", + "description": "Declares a L4 application", + "type": "object", + "properties": { + "serviceMain": { + "$ref": "#/definitions/Service_L4" + } + }, + "required": [ + "serviceMain" + ] + }, + "Template_generic": { + "title": "Generic application", + "description": "Declares a generic application", + "type": "object", + "properties": { + "template": { + "title": "Template Name", + "description": "In addition to 'generic' and 'shared' other values may appear here for extensibility", + "type": "string" + }, + "serviceMain": { + "$ref": "#/definitions/Service_Generic" + } + } + }, + "Service_HTTP": { + "title": "Service_HTTP", + "description": "HTTP virtual server", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Service_HTTP" + }, + "virtualPort": { + "title": "Virtual server TCP port", + "description": "Default 80 is well-known HTTP port. Accepts either an integer or a reference to a Firewall_Port_List that contains the ports on which to listen. Firewall_Port_List is only supported on BIG-IP 14.1 and later. If a Firewall_Port_List is provided, BIG-IP AS3 will create a traffic-matching-criteria for the virtual.", + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Port_List" + }, + { + "f5PostProcess": { + "tag": "minVersion", + "data": { + "version": "14.1", + "strict": true + } + } + } + ] + } + ], + "default": 80 + } + }, + "allOf": [ + { + "$ref": "#/definitions/Service_HTTP_Core" + } + ], + "dependencies": { + "serverTLS": { + "not": {} + }, + "profileConnectivity": { + "oneOf": [ + { + "required": [ + "profileAccess" + ] + }, + { + "required": [ + "policyIAM" + ] + } + ] + }, + "policyPerRequestAccess": { + "oneOf": [ + { + "required": [ + "profileAccess" + ] + }, + { + "required": [ + "policyIAM" + ] + } + ] + } + }, + "required": [ + "class" + ] + }, + "Service_HTTPS": { + "title": "Service_HTTPS", + "description": "HTTPS (HTTP+TLS) virtual server", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Service_HTTPS" + }, + "virtualPort": { + "title": "Virtual server TCP port", + "description": "Default 443 is well-known HTTPS port. Accepts either an integer or a reference to a Firewall_Port_List that contains the ports on which to listen. Firewall_Port_List is only supported on BIG-IP 14.1 and later. If a Firewall_Port_List is provided, BIG-IP AS3 will create a traffic-matching-criteria for the virtual.", + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Port_List" + }, + { + "f5PostProcess": { + "tag": "minVersion", + "data": { + "version": "14.1", + "strict": true + } + } + } + ] + } + ], + "default": 443 + }, + "redirect80": { + "title": "Redirect HTTP", + "description": "If true, BIG-IP AS3 redirects HTTP traffic to any virtualAddress on port 80 to virtualPort", + "type": "boolean", + "default": true + }, + "profileHTTP2": { + "title": "HTTP/2 profile", + "type": [ + "string", + "object" + ], + "description": "HTTP/2 profile; name of built-in or else BIG-IP AS3 pointer", + "oneOf": [ + { + "type": "string", + "enum": [ + "basic" + ] + }, + { + "$ref": "#/definitions/Pointer_HTTP2_Profile" + }, + { + "type": "object", + "properties": { + "ingress": { + "type": "object", + "description": "Ingress (client-side context) HTTP2 profile. This property is available on BIGIP 14.1 and above.", + "allOf": [ + { + "$ref": "#/definitions/Pointer_HTTP2_Profile" + } + ] + }, + "egress": { + "type": "object", + "description": "Egress (server-side context) HTTP2 profile. This property is available on BIGIP 14.1 and above.", + "allOf": [ + { + "$ref": "#/definitions/Pointer_HTTP2_Profile" + } + ] + } + }, + "minProperties": 1, + "maxProperties": 1, + "additionalProperties": false + } + ] + } + }, + "allOf": [ + { + "$ref": "#/definitions/Service_HTTP_Core" + } + ], + "dependencies": { + "serverTLS": { + "properties": { + "serverTLS": { + "minLength": 1 + } + } + } + }, + "required": [ + "class", + "serverTLS" + ] + }, + "Service_HTTP_Core": { + "title": "HTTP VS core", + "type": "object", + "description": "Core attributes of HTTP(S) virtual server", + "properties": { + "persistenceMethods": { + "title": "Persistence methods", + "description": "Default 'cookie' is generally good. Use 'persistenceMethods: []' for no persistence.", + "type": "array", + "items": { + "$ref": "#/definitions/Basic_Persist" + }, + "default": [ + "cookie" + ] + }, + "profileAnalytics": { + "$ref": "#/definitions/Pointer_Analytics_Profile" + }, + "profileAnalyticsTcp": { + "$ref": "#/definitions/Pointer_Analytics_TCP_Profile" + }, + "profileHTTP": { + "title": "HTTP profile", + "description": "HTTP profile; name of built-in or else BIG-IP AS3 pointer", + "oneOf": [ + { + "type": "string", + "enum": [ + "basic" + ] + }, + { + "$ref": "#/definitions/Pointer_HTTP_Profile" + } + ], + "default": "basic" + }, + "profileHTTPCompression": { + "title": "HTTP compression profile", + "description": "HTTP compression profile; name of built-in or else BIG-IP AS3 pointer", + "if": { + "not": { + "type": "object" + } + }, + "then": { + "type": "string", + "enum": [ + "basic", + "wan" + ] + }, + "else": { + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to HTTP compression profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "HTTP_Compress" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP HTTP compression profile", + "description": "Pathname of existing BIG-IP HTTP compression profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile http-compression" + ] + } + } + }, + "profileHTTPAcceleration": { + "title": "Web acceleration profile", + "description": "Web acceleration profile; name of built-in or else BIG-IP AS3 pointer", + "if": { + "not": { + "type": "object" + } + }, + "then": { + "type": "string", + "enum": [ + "basic" + ] + }, + "else": { + "$ref": "#/definitions/Pointer_HTTP_Acceleration_Profile" + } + }, + "profileHTML": { + "$ref": "#/definitions/Pointer_HTML_Profile" + }, + "profileMultiplex": { + "title": "Multiplex profile", + "description": "Multiplex (OneConnect) profile; name of built-in or else BIG-IP AS3 pointer", + "if": { + "not": { + "type": "object" + } + }, + "then": { + "type": "string", + "enum": [ + "basic" + ] + }, + "else": { + "$ref": "#/definitions/Pointer_Multiplex_Profile" + } + }, + "profileNTLM": { + "$ref": "#/definitions/Pointer_NTLM_Profile" + }, + "policyWAF": { + "$ref": "#/definitions/Pointer_WAF_Policy" + }, + "policyIAM": { + "title": "IAM policy", + "description": "BIG-IP AS3 pointer to IAM (APM) policy declaration", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "apm" + ] + } + }, + { + "$ref": "#/definitions/Pointer_Access_Profile" + } + ] + }, + "profileFPS": { + "description": "FPS Profile to attach to service", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "fps" + ] + } + }, + { + "$ref": "#/definitions/Pointer_FPS_Profile" + } + ] + }, + "profileRequestAdapt": { + "$ref": "#/definitions/Pointer_Request_Adapt_Profile" + }, + "profileResponseAdapt": { + "$ref": "#/definitions/Pointer_Response_Adapt_Profile" + }, + "profileAccess": { + "title": "Access profile", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "apm" + ] + } + }, + { + "$ref": "#/definitions/Pointer_Access_Profile" + } + ] + }, + "profileConnectivity": { + "title": "Connectivity profile", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "apm" + ] + } + }, + { + "$ref": "#/definitions/Pointer_Connectivity_Profile" + } + ] + }, + "policyPerRequestAccess": { + "title": "Per Request Access Policy", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "apm" + ] + } + }, + { + "$ref": "#/definitions/Pointer_Per_Request_Access_Policy" + } + ] + }, + "profileVdi": { + "title": "VDI profile", + "description": "VDI profile to attach to service.", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "apm" + ] + } + }, + { + "$ref": "#/definitions/Pointer_VDI_Profile" + } + ] + }, + "profileApiProtection": { + "title": "API Protection Profile", + "description": "API protection profile to attach to service. This property is available on BIGIP 14.1 and above.", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "apm", + "asm" + ] + } + }, + { + "$ref": "#/definitions/Pointer_API_Protection_Profile" + } + ] + }, + "profileDOS": { + "$ref": "#/definitions/Pointer_DOS_Profile" + }, + "profileBotDefense": { + "description": "Attaches a Bot Defense profile to the service. This property is available on BIGIP 14.1 and above.", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Bot_Defense_Profile" + } + ] + }, + "profileWebSocket": { + "description": "Attaches a WebSocket profile to the Service.", + "allOf": [ + { + "$ref": "#/definitions/Pointer_WebSocket_Profile" + } + ] + } + }, + "allOf": [ + { + "if": { + "properties": { + "policyIAM": {} + }, + "required": [ + "policyIAM" + ] + }, + "then": { + "not": { + "properties": { + "profileAccess": {} + }, + "required": [ + "profileAccess" + ] + } + } + }, + { + "$ref": "#/definitions/Service_TCP_Core" + } + ], + "required": [ + "class" + ] + }, + "Service_TCP": { + "title": "Service_TCP", + "description": "Declares a TCP virtual server (w/optional TLS)", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Service_TCP" + }, + "mqttEnabled": { + "title": "MQTT profile", + "description": "Attaches the MQTT profile /Common/mqtt. MQTT profiles have no configurable properties.", + "type": "boolean", + "default": false + }, + "persistenceMethods": { + "title": "Persistence methods", + "description": "Default 'source-address' is generally good. Use 'persistenceMethods: []' for no persistence.", + "type": "array", + "items": { + "$ref": "#/definitions/Basic_Persist" + }, + "default": [ + "source-address" + ] + }, + "profileSIP": { + "$ref": "#/definitions/Pointer_SIP_Profile" + }, + "profileFTP": { + "$ref": "#/definitions/Pointer_FTP_Profile" + }, + "profileILX": { + "$ref": "#/definitions/Pointer_ILX_Profile" + }, + "profilePPTP": { + "$ref": "#/definitions/Pointer_PPTP_Profile" + }, + "profileRTSP": { + "$ref": "#/definitions/Pointer_RTSP_Profile" + }, + "profileSOCKS": { + "$ref": "#/definitions/Pointer_SOCKS_Profile" + }, + "profileICAP": { + "$ref": "#/definitions/Pointer_ICAP_Profile" + } + }, + "allOf": [ + { + "$ref": "#/definitions/Service_TCP_Core" + } + ], + "required": [ + "class" + ], + "if": { + "not": { + "properties": { + "virtualType": { + "const": "internal" + } + } + } + }, + "then": { + "required": [ + "virtualPort" + ], + "not": { + "required": [ + "profileICAP" + ] + } + } + }, + "Service_TCP_Core": { + "title": "Service_TCP core", + "description": "Core attributes of TCP virtual server", + "type": "object", + "properties": { + "virtualType": { + "title": "Virtual addresses", + "description": "Type of the virtual", + "type": "string", + "enum": [ + "standard", + "internal" + ], + "default": "standard" + }, + "virtualPort": { + "title": "virtual server TCP port", + "description": "Accepts either an integer or a reference to a Firewall_Port_List that contains the ports on which to listen. Firewall_Port_List is only supported on BIG-IP 14.1 and later. If a Firewall_Port_List is provided, BIG-IP AS3 will create a traffic-matching-criteria for the virtual.", + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Port_List" + }, + { + "f5PostProcess": { + "tag": "minVersion", + "data": { + "version": "14.1", + "strict": true + } + } + } + ] + } + ], + "minimum": 0, + "maximum": 65535 + }, + "layer4": { + "title": "L4 protocol", + "description": "For TCP virtual server, Layer 4 protocol must be TCP", + "type": "string", + "const": "tcp", + "default": "tcp" + }, + "profileFIX": { + "$ref": "#/definitions/Pointer_FIX_Profile" + }, + "profileTCP": { + "title": "TCP profile", + "description": "TCP profile; name of built-in or else BIG-IP AS3 pointer", + "if": { + "not": { + "type": "object" + } + }, + "then": { + "type": "string", + "enum": [ + "normal", + "lan", + "wan", + "mobile" + ] + }, + "else": { + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to TCP profile declaration for ingress and egress", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "TCP_Profile" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP TCP profile", + "description": "Pathname of existing BIG-IP TCP profile for both ingress and egress", + "type": "string", + "format": "f5bigip" + }, + "ingress": { + "title": "Ingress profile", + "description": "Ingress (client-side context) TCP profile", + "if": { + "not": { + "type": "object" + } + }, + "then": { + "type": "string", + "enum": [ + "normal", + "lan", + "wan", + "mobile" + ], + "default": "normal" + }, + "else": { + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to TCP profile declaration for incoming connections", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "TCP_Profile" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP TCP profile", + "description": "Pathname of existing BIG-IP TCP profile in client-side context", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1 + } + }, + "egress": { + "title": "Egress TCP profile", + "description": "Egress (server-side context) TCP profile", + "if": { + "not": { + "type": "object" + } + }, + "then": { + "type": "string", + "enum": [ + "normal", + "lan", + "wan", + "mobile" + ], + "default": "normal" + }, + "else": { + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to TCP profile declaration for outgoing connections", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "TCP_Profile" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP server-side TCP profile", + "description": "Pathname of existing BIG-IP TCP profile in server-side context", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1 + } + } + }, + "additionalProperties": false, + "dependencies": { + "use": { + "minProperties": 1, + "maxProperties": 1 + }, + "bigip": { + "minProperties": 1, + "maxProperties": 1 + }, + "ingress": { + "minProperties": 2, + "maxProperties": 2 + }, + "egress": { + "minProperties": 2, + "maxProperties": 2 + } + }, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile tcp" + ] + } + }, + "default": "normal" + }, + "profileAnalyticsTcp": { + "$ref": "#/definitions/Pointer_Analytics_TCP_Profile" + }, + "profileSSHProxy": { + "$ref": "#/definitions/Pointer_SSH_Proxy_Profile" + }, + "serverTLS": { + "title": "TLS server", + "description": "BIG-IP AS3 pointer to TLS Server declaration", + "if": { + "type": "string" + }, + "then": { + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "TLS_Server" + } + }, + "required": [ + "class" + ] + } + } + }, + "else": { + "if": { + "type": "object" + }, + "then": { + "$ref": "#/definitions/Pointer_Existing_TLS_Server_Profile" + }, + "else": { + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Existing_TLS_Server_Profile" + } + } + } + }, + "clientTLS": { + "title": "TLS client", + "description": "BIG-IP AS3 pointer to TLS Client declaration", + "if": { + "type": "string" + }, + "then": { + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "TLS_Client" + } + }, + "required": [ + "class" + ] + } + } + }, + "else": { + "if": { + "type": "object" + }, + "then": { + "$ref": "#/definitions/Pointer_Existing_TLS_Client_Profile" + }, + "else": { + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Existing_TLS_Client_Profile" + } + } + } + }, + "policyEndpoint": { + "title": "Endpoint policy", + "description": "BIG-IP AS3 pointer to Endpoint policy declaration", + "if": { + "type": "array" + }, + "then": { + "items": { + "$ref": "#/definitions/Pointer_Endpoint_Policy" + } + }, + "else": { + "$ref": "#/definitions/Pointer_Endpoint_Policy" + } + }, + "profileStream": { + "$ref": "#/definitions/Pointer_Stream_Profile" + } + }, + "allOf": [ + { + "$ref": "#/definitions/Service_Core" + } + ] + }, + "Service_UDP": { + "title": "Service_UDP", + "description": "Declares a UDP virtual server (w/optional (D)TLS)", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Service_UDP" + }, + "persistenceMethods": { + "title": "Persistence methods", + "description": "Default 'source-address' is generally good. Use 'persistenceMethods: []' for no persistence.", + "type": "array", + "items": { + "$ref": "#/definitions/Basic_Persist" + }, + "default": [ + "source-address" + ] + } + }, + "allOf": [ + { + "$ref": "#/definitions/Service_UDP_Core" + } + ], + "required": [ + "class" + ], + "if": { + "not": { + "properties": { + "virtualType": { + "const": "internal" + } + } + } + }, + "then": { + "required": [ + "virtualPort" + ] + }, + "dependencies": { + "virtualType": { + "if": { + "properties": { + "virtualType": { + "const": "stateless" + } + } + }, + "then": { + "properties": { + "translateClientPort": { + "const": false + }, + "translateServerPort": { + "const": false + } + }, + "required": [ + "pool" + ] + } + } + } + }, + "Service_UDP_Core": { + "title": "Service_UDP core", + "description": "Core attributes of UDP virtual server", + "type": "object", + "properties": { + "virtualType": { + "title": "Virtual addresses", + "description": "Type of the virtual", + "type": "string", + "enum": [ + "standard", + "internal", + "stateless" + ], + "default": "standard" + }, + "virtualPort": { + "title": "Virtual server UDP port", + "description": "Accepts either an integer or a reference to a Firewall_Port_List that contains the ports on which to listen. Firewall_Port_List is only supported on BIG-IP 14.1 and later. If a Firewall_Port_List is provided, BIG-IP AS3 will create a traffic-matching-criteria for the virtual.", + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Port_List" + }, + { + "f5PostProcess": { + "tag": "minVersion", + "data": { + "version": "14.1", + "strict": true + } + } + } + ] + } + ], + "minimum": 0, + "maximum": 65535 + }, + "layer4": { + "title": "L4 protocol", + "description": "For UDP virtual server, Layer 4 protocol must be UDP", + "type": "string", + "const": "udp", + "default": "udp" + }, + "profileUDP": { + "title": "UDP profile", + "description": "UDP profile; name of built-in or else BIG-IP AS3 pointer", + "if": { + "not": { + "type": "object" + } + }, + "then": { + "type": "string", + "enum": [ + "normal" + ] + }, + "else": { + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to UDP profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "UDP_Profile" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP UDP profile", + "description": "Pathname of existing BIG-IP UDP profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile udp" + ] + } + }, + "default": "normal" + }, + "serverTLS": { + "title": "TLS server", + "description": "BIG-IP AS3 pointer to TLS Server declaration", + "if": { + "type": "string" + }, + "then": { + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "TLS_Server" + } + }, + "required": [ + "class" + ] + } + } + }, + "else": { + "if": { + "type": "object" + }, + "then": { + "$ref": "#/definitions/Pointer_Existing_TLS_Server_Profile" + }, + "else": { + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Existing_TLS_Server_Profile" + } + } + } + }, + "clientTLS": { + "title": "TLS client", + "description": "BIG-IP AS3 pointer to TLS Client declaration", + "if": { + "type": "string" + }, + "then": { + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "TLS_Client" + } + }, + "required": [ + "class" + ] + } + } + }, + "else": { + "if": { + "type": "object" + }, + "then": { + "$ref": "#/definitions/Pointer_Existing_TLS_Client_Profile" + }, + "else": { + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Existing_TLS_Client_Profile" + } + } + } + }, + "policyEndpoint": { + "title": "Endpoint policy", + "description": "BIG-IP AS3 pointer to Endpoint policy declaration", + "if": { + "type": "array" + }, + "then": { + "items": { + "$ref": "#/definitions/Pointer_Endpoint_Policy" + } + }, + "else": { + "$ref": "#/definitions/Pointer_Endpoint_Policy" + } + }, + "profileRADIUS": { + "$ref": "#/definitions/Pointer_Radius_Profile" + }, + "profileSIP": { + "$ref": "#/definitions/Pointer_SIP_Profile" + }, + "profileTFTP": { + "$ref": "#/definitions/Pointer_TFTP_Profile" + } + }, + "allOf": [ + { + "$ref": "#/definitions/Service_Core" + } + ] + }, + "Service_SCTP": { + "title": "Service_SCTP", + "description": "Declares a SCTP virtual server", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Service_SCTP" + }, + "virtualPort": { + "title": "virtual server SCTP port", + "description": "Accepts either an integer or a reference to a Firewall_Port_List that contains the ports on which to listen. Firewall_Port_List is only supported on BIG-IP 14.1 and later. If a Firewall_Port_List is provided, BIG-IP AS3 will create a traffic-matching-criteria for the virtual.", + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Port_List" + }, + { + "f5PostProcess": { + "tag": "minVersion", + "data": { + "version": "14.1", + "strict": true + } + } + } + ] + } + ], + "minimum": 0, + "maximum": 65535 + }, + "profileSCTP": { + "$ref": "#/definitions/Pointer_SCTP_Profile" + }, + "layer4": { + "title": "L4 protocol", + "description": "For SCTP virtual server, Layer 4 protocol must be SCTP", + "type": "string", + "const": "sctp", + "default": "sctp" + } + }, + "allOf": [ + { + "$ref": "#/definitions/Service_Core" + } + ], + "required": [ + "class", + "virtualPort" + ] + }, + "Service_L4": { + "title": "Service_L4", + "description": "Declares a L4 (FastL4) virtual server", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Service_L4" + }, + "persistenceMethods": { + "title": "Persistence methods", + "description": "Default 'source-address' is generally good. Use 'persistenceMethods: []' for no persistence.", + "type": "array", + "items": { + "$ref": "#/definitions/Basic_Persist" + }, + "default": [ + "source-address" + ] + } + }, + "allOf": [ + { + "$ref": "#/definitions/Service_L4_Core" + } + ], + "required": [ + "class", + "virtualPort" + ], + "not": { + "required": [ + "profileTrafficLog" + ] + } + }, + "Service_Generic": { + "title": "Service_Generic", + "description": "Declares an 'Any IP' (IPOther) virtual server", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Service_Generic" + }, + "layer4": { + "title": "L4 protocol", + "description": "The L4 protocol type for this virtual server", + "type": "string", + "default": "any" + }, + "profileIPOther": { + "allOf": [ + { + "$ref": "#/definitions/Pointer_IP_Other_Profile" + } + ], + "default": { + "bigip": "/Common/ipother" + } + } + }, + "allOf": [ + { + "$ref": "#/definitions/Service_L4_Core" + } + ], + "required": [ + "class" + ] + }, + "Service_L4_Core": { + "title": "Service_L4 core", + "description": "Core attributes of L4 virtual server", + "type": "object", + "properties": { + "virtualPort": { + "title": "virtual server TCP port", + "description": "Accepts either an integer or a reference to a Firewall_Port_List that contains the ports on which to listen. Firewall_Port_List is only supported on BIG-IP 14.1 and later. If a Firewall_Port_List is provided, BIG-IP AS3 will create a traffic-matching-criteria for the virtual.", + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Port_List" + }, + { + "f5PostProcess": { + "tag": "minVersion", + "data": { + "version": "14.1", + "strict": true + } + } + } + ] + } + ], + "minimum": 0, + "maximum": 65535 + }, + "layer4": { + "title": "L4 protocol", + "description": "The L4 protocol type for this virtual server", + "type": "string", + "enum": [ + "any", + "tcp", + "udp", + "3pc", + "a/n", + "ah", + "argus", + "aris", + "ax.25", + "bbn-rcc", + "bna", + "br-sat-mon", + "cbt", + "cftp", + "chaos", + "compaq-peer", + "cphb", + "cpnx", + "crdup", + "crtp", + "dccp", + "dcn", + "ddp", + "ddx", + "dgp", + "dsr", + "egp", + "eigrp", + "emcon", + "encap", + "esp", + "etherip", + "fc", + "fire", + "ggp", + "gmtp", + "gre", + "hip", + "hmp", + "hopopt", + "i-nlsp", + "iatp", + "icmp", + "idpr", + "idpr-cmtp", + "idrp", + "ifmp", + "igmp", + "igp", + "il", + "ip", + "ipcomp", + "ipcv", + "ipencap", + "ipip", + "iplt", + "ippc", + "ipv6", + "ipv6-auth", + "ipv6-crypt", + "ipv6-frag", + "ipv6-icmp", + "ipv6-nonxt", + "ipv6-opts", + "ipv6-route", + "ipx-in-ip", + "irtp", + "isis", + "iso-ip", + "iso-tp4", + "kryptolan", + "l2tp", + "larp", + "leaf-1", + "leaf-2", + "manet", + "merit-inp", + "mfe-nsp", + "micp", + "mobile", + "mpls-in-ip", + "mtp", + "mux", + "narp", + "netblt", + "nsfnet-igp", + "nvp", + "ospf", + "pgm", + "pim", + "pipe", + "pnni", + "prm", + "ptp", + "pup", + "pvp", + "qnx", + "rdp", + "rsvp", + "rsvp-e2e-ignore", + "rvd", + "sat-expak", + "sat-mon", + "scc-sp", + "scps", + "sctp", + "sdrp", + "secure-vmtp", + "shim6", + "skip", + "sm", + "smp", + "snp", + "sprite-rpc", + "sps", + "srp", + "sscopmce", + "st", + "stp", + "sun-nd", + "swipe", + "tcf", + "tlsp", + "tp++", + "trunk-1", + "trunk-2", + "ttp", + "udplite", + "uti", + "vines", + "visa", + "vmtp", + "vrrp", + "wb-expak", + "wb-mon", + "wesp", + "wsn", + "xnet", + "xns-idp", + "xtp" + ], + "default": "tcp" + }, + "profileFIX": { + "$ref": "#/definitions/Pointer_FIX_Profile" + }, + "profileL4": { + "title": "L4 profile", + "description": "L4 profile; name of built-in or else BIG-IP AS3 pointer", + "if": { + "not": { + "type": "object" + } + }, + "then": { + "type": "string", + "enum": [ + "basic" + ] + }, + "else": { + "$ref": "#/definitions/Pointer_L4_Profile" + }, + "default": "basic" + }, + "profileAnalyticsTcp": { + "$ref": "#/definitions/Pointer_Analytics_TCP_Profile" + } + }, + "allOf": [ + { + "$ref": "#/definitions/Service_Core" + } + ] + }, + "Service_Forwarding": { + "title": "Service_Forwarding", + "description": "Attributes of a forwarding virtual server. ARP and ICMP Echo will be disabled on virtualAddresses by default.", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Service_Forwarding" + }, + "forwardingType": { + "title": "Forwarding Type", + "description": "Controls whether the forwarding service uses IP or L2 forwarding", + "type": "string", + "enum": [ + "ip", + "l2" + ] + }, + "layer4": { + "title": "L4 protocol", + "description": "Layer 4 protocol", + "type": "string", + "default": "any" + }, + "profileL4": { + "title": "L4 profile", + "description": "L4 profile; name of built-in or else BIG-IP AS3 pointer", + "if": { + "not": { + "type": "object" + } + }, + "then": { + "type": "string", + "enum": [ + "basic" + ] + }, + "else": { + "$ref": "#/definitions/Pointer_L4_Profile" + } + } + }, + "allOf": [ + { + "if": { + "properties": { + "forwardingType": { + "const": "ip" + } + } + }, + "then": { + "properties": { + "translateServerPort": { + "type": "boolean", + "default": false, + "const": false + }, + "translateServerAddress": { + "type": "boolean", + "default": false, + "const": false + } + } + } + }, + { + "$ref": "#/definitions/Service_Core" + } + ], + "required": [ + "class", + "forwardingType" + ], + "not": { + "anyOf": [ + { + "required": [ + "fallbackPersistenceMethod" + ] + }, + { + "required": [ + "persistenceMethods" + ] + }, + { + "required": [ + "pool" + ] + }, + { + "required": [ + "profileBotDefense" + ] + }, + { + "required": [ + "profileDiameterEndpoint" + ] + }, + { + "required": [ + "profileDNS" + ] + }, + { + "required": [ + "profileIPOther" + ] + }, + { + "required": [ + "profileProtocolInspection" + ] + }, + { + "required": [ + "profileRewrite" + ] + }, + { + "required": [ + "profileTrafficLog" + ] + }, + { + "required": [ + "sourceAddress" + ] + } + ] + } + }, + "Service_Core": { + "title": "Virtual-server core", + "description": "Core attributes of a virtual server", + "type": "object", + "properties": { + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "virtualAddresses": { + "title": "Virtual addresses", + "description": "Accepts either an array or a reference to an Address_List which contains destination addresses to which this virtual will listen. To accept connections only from certain subnet(s), replace IP address in the provided array with array [IP-address, accept-from-subnet]. IP address in the provided array can also be replaced by a reference to a Service_Address. A reference to an Address_List is only supported on BIG-IP 14.1 and later. If an Address_List is provided, BIG-IP AS3 will create a traffic-matching-criteria for the virtual.", + "oneOf": [ + { + "type": "array", + "f5PostProcess": { + "tag": "virtualAddress" + }, + "items": { + "if": { + "type": "string" + }, + "then": { + "format": "f5ip" + }, + "else": { + "if": { + "type": "array" + }, + "then": { + "type": "array", + "items": { + "title": "Virtual address", + "if": { + "type": "string" + }, + "then": { + "format": "f5ip" + }, + "else": { + "$ref": "#/definitions/Pointer_Service_Address" + } + }, + "minItems": 2, + "maxItems": 2, + "uniqueItems": true + }, + "else": { + "$ref": "#/definitions/Pointer_Service_Address" + } + } + }, + "minItems": 1, + "uniqueItems": true + }, + { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Address_List" + }, + { + "f5PostProcess": { + "tag": "minVersion", + "data": { + "version": "14.1", + "strict": true + } + } + } + ] + } + ] + }, + "serviceDownImmediateAction": { + "title": "Service Down Immediate Action", + "description": "Specifies the immediate action the BIG-IP system should respond with upon the receipt of the initial client's SYN packet if the availability status of the virtual server is Offline or Unavailable. This is supported for the virtual server of Standard type and TCP protocol. The default value is none.", + "type": "string", + "enum": [ + "none", + "drop", + "reset" + ], + "default": "none" + }, + "shareAddresses": { + "title": "Share addresses", + "description": "A user set boolean that indicates whether the virtualAddresses should be added to or checked for /Common instead of the tenant. This value defaults to false, and so will put the virtualAddresses into their tenant.", + "type": "boolean", + "default": false + }, + "sourceAddress": { + "title": "Source address", + "description": "Accepts either a string or a reference to an Address_List which contains source addresses from which this virtual will listen. A reference to an Address_List is only supported on BIG-IP 14.1 and later. If an Address_List is provided, BIG-IP AS3 will create a traffic-matching-criteria for the virtual.", + "oneOf": [ + { + "type": "string", + "format": "f5ip" + }, + { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Address_List" + }, + { + "f5PostProcess": { + "tag": "minVersion", + "data": { + "version": "14.1", + "strict": true + } + } + } + ] + } + ] + }, + "enable": { + "title": "Enable", + "description": "Virtual server handles traffic only when enabled (default)", + "type": "boolean", + "default": true + }, + "maxConnections": { + "title": "Maximum connections", + "description": "Specifies the maximum number of concurrent connections you want to allow for the virtual server", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "snat": { + "title": "SNAT", + "description": "Name of built-in SNAT method or BIG-IP AS3 pointer to SNAT pool. If 'self', the system uses the virtual-server address as SNAT address", + "if": { + "not": { + "type": "object" + } + }, + "then": { + "type": "string", + "enum": [ + "none", + "self", + "auto" + ] + }, + "else": { + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to SNAT pool declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "SNAT_Pool" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP SNAT pool", + "description": "Pathname of existing BIG-IP SNAT pool", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm snatpool" + ] + } + }, + "default": "auto" + }, + "iRules": { + "title": "iRules", + "description": "List iRules for this virtual server (order is significant)", + "type": "array", + "items": { + "title": "iRule", + "description": "BIG-IP AS3 pointer to iRule (declared separately)", + "if": { + "type": "string" + }, + "then": { + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "iRule" + } + }, + "required": [ + "class" + ] + } + } + }, + "else": { + "type": "object", + "properties": { + "bigip": { + "title": "BIG-IP iRule", + "description": "Pathname of existing BIG-IP iRule", + "type": "string", + "format": "f5bigip" + }, + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to iRule (declared separately)", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "iRule" + } + }, + "required": [ + "class" + ] + } + } + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm rule" + ] + } + } + }, + "$comment": "uniqueItems: true" + }, + "pool": { + "title": "Pool", + "description": "BIG-IP AS3 pointer to pool if any (declared separately)", + "if": { + "type": "string" + }, + "then": { + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Pool" + } + }, + "required": [ + "class" + ] + } + } + }, + "else": { + "type": "object", + "properties": { + "bigip": { + "title": "BIG-IP pool", + "description": "Pathname of existing BIG-IP pool", + "type": "string", + "format": "f5bigip" + }, + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to pool if any (declared separately)", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Pool" + } + }, + "required": [ + "class" + ] + } + } + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm pool" + ] + } + } + }, + "addressStatus": { + "title": "Address status", + "description": "Specifies whether the virtual server will contribute to the operational status of the associated virtual address", + "type": "boolean", + "default": true + }, + "mirroring": { + "title": "Mirroring", + "description": "Controls connection-mirroring for high-availability", + "type": "string", + "enum": [ + "none", + "L4" + ], + "default": "none" + }, + "policyBandwidthControl": { + "title": "Bandwidth Control Policy", + "description": "BIG-IP AS3 pointer to Bandwidth Control Policy (policy must be static)", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Bandwidth_Control_Policy" + } + ] + }, + "policyFirewallEnforced": { + "title": "Firewall policy (enforced)", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + } + }, + { + "$ref": "#/definitions/Pointer_Firewall_Policy" + } + ] + }, + "policyFirewallStaged": { + "title": "Firewall policy (staged)", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + } + }, + { + "$ref": "#/definitions/Pointer_Firewall_Policy" + } + ] + }, + "policyNAT": { + "description": "BIG-IP AS3 pointer to NAT policy declaration", + "type": "object", + "properties": { + "bigip": { + "title": "BIG-IP NAT policy", + "description": "Pathname of existing BIG-IP NAT policy", + "type": "string", + "format": "f5bigip" + }, + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to NAT policy declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "NAT_Policy" + } + }, + "required": [ + "class" + ] + } + } + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + } + }, + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security nat policy" + ] + } + } + ] + }, + "policyIdleTimeout": { + "$ref": "#/definitions/Pointer_Idle_Timeout_Policy" + }, + "lastHop": { + "title": "Last hop", + "description": "Name of built-in last-hop method or BIG-IP AS3 pointer to last-hop pool (default 'default' means use system setting)", + "if": { + "not": { + "type": "object" + } + }, + "then": { + "type": "string", + "enum": [ + "default", + "auto", + "disable" + ] + }, + "else": { + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to last-hop pool declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Pool" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP last-hop pool", + "description": "Pathname of existing BIG-IP pool", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm pool" + ] + } + }, + "default": "default" + }, + "translateClientPort": { + "title": "Translate client port", + "description": "If true, hide client's port number from server. A value of true is the same as the string 'change' while a value of false is the same as the string 'preserve'. The value 'preserve-strict' is the only other allowed value for a string", + "type": [ + "boolean", + "string" + ], + "default": false, + "oneOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "change", + "preserve", + "preserve-strict" + ] + } + ] + }, + "translateServerAddress": { + "title": "Translate server address", + "description": "If true (default), make server-side connection to server address (otherwise, treat server as gateway to virtual-server address)", + "type": "boolean", + "default": true + }, + "translateServerPort": { + "title": "Translate server port", + "description": "If true (default), make server-side connection to server port (otherwise, connect to server on virtual-server port)", + "type": "boolean", + "default": true + }, + "nat64Enabled": { + "title": "Translate IPv6 to IPv4", + "description": "If true, translate IPv6 traffic into IPv4 (default false)", + "type": "boolean", + "default": false + }, + "httpMrfRoutingEnabled": { + "title": "HTTP MRF Router", + "description": "Specifies whether to use the HTTP message routing framework (MRF) functionality. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + }, + "persistenceMethods": { + "title": "Persistence method(s)", + "description": "List of persistence methods (each by name or BIG-IP AS3 pointer). Element 0 is primary (default) persistence method. Use 'persistenceMethods: []' for no persistence.", + "type": "array", + "items": { + "$ref": "#/definitions/Basic_Persist" + }, + "$comment": "uniqueItems: true" + }, + "fallbackPersistenceMethod": { + "$ref": "#/definitions/Basic_Persist" + }, + "allowVlans": { + "title": "VLAN list to allow", + "description": "Names of existing VLANs to add to this virtual server to allow.", + "type": "array", + "items": { + "bigip": { + "title": "BIG-IP VLAN", + "description": "Pathname of existing BIG-IP VLAN", + "type": "string", + "format": "f5bigip" + } + } + }, + "rejectVlans": { + "title": "VLAN list to reject", + "description": "Names of existing VLANs to add to this virtual server to reject.", + "type": "array", + "items": { + "bigip": { + "title": "BIG-IP VLAN", + "description": "Pathname of existing BIG-IP VLAN", + "type": "string", + "format": "f5bigip" + } + } + }, + "securityLogProfiles": { + "title": "Security Log Profiles", + "description": "Specifies the log profile applied to the virtual server", + "type": "array", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm", + "asm" + ] + }, + "items": { + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to security log profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Security_Log_Profile" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP security log profile", + "description": "Pathname of existing BIG-IP security log profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security log profile" + ] + } + } + }, + "profileDiameterEndpoint": { + "$ref": "#/definitions/Pointer_Enforcement_Diameter_Endpoint_Profile" + }, + "profileEnforcement": { + "$ref": "#/definitions/Pointer_Enforcement_Profile" + }, + "profileSubscriberManagement": { + "$ref": "#/definitions/Pointer_Enforcement_Subscriber_Management_Profile" + }, + "profileIPOther": { + "$ref": "#/definitions/Pointer_IP_Other_Profile" + }, + "profileClassification": { + "$ref": "#/definitions/Pointer_Classification_Profile" + }, + "profileDNS": { + "$ref": "#/definitions/Pointer_DNS_Profile" + }, + "profileStatistics": { + "$ref": "#/definitions/Pointer_Statistics_Profile" + }, + "profileTrafficLog": { + "$ref": "#/definitions/Pointer_Traffic_Log_Profile" + }, + "profileRewrite": { + "$ref": "#/definitions/Pointer_Rewrite_Profile" + }, + "profileProtocolInspection": { + "description": "BIG-IP AS3 pointer to Protocol Inspection Profile declaration", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + } + }, + { + "$ref": "#/definitions/Pointer_Protocol_Inspection_Profile" + } + ] + }, + "metadata": { + "$ref": "#/definitions/Metadata" + }, + "rateLimit": { + "description": "Specifies the maximum number of connections per second allowed for a virtual server", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "clonePools": { + "$ref": "#/definitions/Clone_Pools" + }, + "maximumBandwidth": { + "description": "Specifies the maximum bandwidth allowed, in Mbps.", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + }, + "oneOf": [ + { + "type": "integer", + "minimum": 10, + "maximum": 1000000 + }, + { + "type": "string", + "const": "infinite" + } + ] + }, + "ipIntelligencePolicy": { + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm", + "asm" + ] + } + }, + { + "$ref": "#/definitions/Pointer_IP_Intelligence_Policy" + } + ] + }, + "profileIntegratedBotDefense": { + "description": "BIG-IP AS3 pointer to an Integrated Bot Defense Profile. These are only supported in tmos version 17.0+.", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Integrated_Bot_Defense_Profile" + } + ] + }, + "adminState": { + "title": "Administration State", + "description": "Specifies the state of the Service. When set to disable the Service no longer accepts new connection requests, but will allow current connections to finish processing before going to a down state.", + "type": "string", + "enum": [ + "enable", + "disable" + ], + "default": "enable" + } + }, + "allOf": [ + { + "if": { + "properties": { + "allowVlans": {} + }, + "required": [ + "allowVlans" + ] + }, + "then": { + "not": { + "properties": { + "rejectVlans": {} + }, + "required": [ + "rejectVlans" + ] + } + } + }, + { + "if": { + "not": { + "required": [ + "virtualType" + ], + "properties": { + "virtualType": { + "const": "internal" + } + } + } + }, + "then": { + "required": [ + "virtualAddresses" + ] + } + }, + { + "$ref": "#/definitions/Include" + } + ], + "dependencies": { + "fallbackPersistenceMethod": [ + "persistenceMethods" + ] + } + }, + "Clone_Pools": { + "title": "Clone Pools", + "description": "Specifies a pool that the virtual server uses to replicate either client or server traffic", + "type": "object", + "properties": { + "ingress": { + "title": "Ingress Clone Pool", + "description": "Ingress (client-side context) clone pool", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Pool" + } + ] + }, + "egress": { + "title": "Egress Clone Pool", + "description": "Egress (server-side context) clone pool", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Pool" + } + ] + } + }, + "additionalProperties": false, + "anyOf": [ + { + "required": [ + "ingress" + ] + }, + { + "required": [ + "egress" + ] + } + ] + }, + "Service_Address": { + "title": "Service_Address", + "description": "Service IP address definition (BIG-IP virtual-address). NOTE: When BIG-IP AS3 creates a Service_Address, it is placed in /tenant/serviceAddress (and not /tenant/app/serviceAddress) on the BIG-IP system.", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Service_Address" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "virtualAddress": { + "title": "Virtual address", + "description": "The virtual IP address. Defaults to mask /32.", + "type": "string", + "format": "f5ip" + }, + "arpEnabled": { + "title": "Enable ARP", + "description": "If true (default), the system services ARP requests on this address", + "type": "boolean", + "default": true + }, + "icmpEcho": { + "title": "Enable ICMP echo", + "description": "If true (default), the system answers ICMP echo requests on this address", + "type": "string", + "enum": [ + "enable", + "disable", + "selective" + ], + "default": "enable" + }, + "routeAdvertisement": { + "title": "Enable route advertisement", + "description": "If true, the route is advertised", + "type": "string", + "enum": [ + "enable", + "disable", + "selective", + "always", + "any", + "all" + ], + "default": "disable" + }, + "spanningEnabled": { + "title": "Enable spanning", + "description": "Enable all BIG-IP systems in device group to listen for and process traffic on the same virtual address", + "type": "boolean", + "default": false + }, + "trafficGroup": { + "title": "Traffic Group", + "description": "Specifies the traffic group which the Service_Address belongs.", + "type": "string", + "default": "default" + } + }, + "dependencies": { + "arpEnabled": { + "$comment": "Only 1 of 2 can be true.", + "if": { + "properties": { + "arpEnabled": { + "const": true + } + } + }, + "then": { + "properties": { + "spanningEnabled": { + "const": false + } + } + } + } + }, + "required": [ + "virtualAddress" + ], + "additionalProperties": false + }, + "SNAT_Pool": { + "title": "SNAT_Pool", + "description": "Declares a list of SNAT addresses", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "SNAT_Pool" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "snatAddresses": { + "title": "SNAT addresses", + "description": "List of SNAT addresses-- may include both IPv4 and IPv6", + "type": "array", + "items": { + "title": "SNAT address", + "type": "string", + "format": "f5ip" + }, + "minItems": 1, + "uniqueItems": true + } + }, + "additionalProperties": false, + "required": [ + "class", + "snatAddresses" + ] + }, + "SNAT_Translation": { + "title": "SNAT_Translation", + "description": "Configures explicit secure network address translation (SNAT) address", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "SNAT_Translation" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "address": { + "title": "Address", + "description": "The IP address of the SNAT translation", + "type": "string", + "format": "f5ip" + }, + "adminState": { + "title": "Administration State", + "description": "Specifies the state of the SNAT translation", + "type": "string", + "enum": [ + "enable", + "disable" + ], + "default": "enable" + }, + "arpEnabled": { + "title": "Enable ARP", + "description": "Specifies that the NAT sends ARP requests", + "type": "boolean", + "default": true + }, + "ipIdleTimeout": { + "title": "IP Idle Timeout", + "description": "Specifies time in seconds that connections to an IP address initiated using a SNAT address are allowed to remain idle before being automatically disconnected. Specifying 'indefinite' prevents the connection from timing out.", + "oneOf": [ + { + "type": "integer", + "maximum": 4294967295, + "minimum": 1 + }, + { + "type": "string", + "const": "indefinite" + } + ], + "default": "indefinite" + }, + "maxConnections": { + "title": "Maximum Connections", + "description": "Specifies a limit on the number of connections a translation address must reach before it no longer initiates a connection. A value of 0 indicates the setting is disabled.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 0 + }, + "tcpIdleTimeout": { + "title": "TCP Idle Timeout", + "description": "Specifies time in seconds that TCP connections initiated using a SNAT address are allowed to remain idle before being automatically disconnected. Specifying 'indefinite' prevents the connection from timing out.", + "oneOf": [ + { + "type": "integer", + "maximum": 4294967295, + "minimum": 1 + }, + { + "type": "string", + "const": "indefinite" + } + ], + "default": "indefinite" + }, + "trafficGroup": { + "title": "Traffic Group", + "description": "Specifies the traffic group which the SNAT_Translation belongs", + "type": "string", + "default": "default" + }, + "udpIdleTimeout": { + "title": "UDP Idle Timeout", + "description": "Specifies time in seconds that UDP connections initiated using a SNAT address are allowed to remain idle before being automatically disconnected. Specifying 'indefinite' prevents the connection from timing out.", + "oneOf": [ + { + "type": "integer", + "maximum": 4294967295, + "minimum": 1 + }, + { + "type": "string", + "const": "indefinite" + } + ], + "default": "indefinite" + } + }, + "additionalProperties": false, + "required": [ + "class", + "address" + ] + }, + "WAF_Policy": { + "title": "WAF_Policy", + "description": "A Web Application Firewall Policy. Supports both traditional and advanced WAF policies. Advanced WAF policies require TMOS version 16.0 or newer.", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "asm" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "WAF_Policy" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "url": { + "title": "URL", + "description": "The URL to pull the ASM policy from", + "allOf": [ + { + "$ref": "#/definitions/Resource_URL" + } + ] + }, + "file": { + "title": "File", + "description": "The absolute file path for the ASM policy stored on the BIG-IP", + "type": "string", + "minLength": 3, + "allOf": [ + { + "f5PostProcess": { + "tag": "expand" + } + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "string" + } + } + ] + }, + "policy": { + "description": "Reference to a WAF Policy", + "allOf": [ + { + "$ref": "#/definitions/F5string" + }, + { + "f5PostProcess": { + "tag": "expand", + "data": { + "when": "1/expand" + } + } + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "string" + } + } + ] + }, + "ignoreChanges": { + "title": "Ignore changes", + "description": "If false (default), the system updates the policy in every BIG-IP AS3 declaration deployment. If true, BIG-IP AS3 creates the policy on first deployment, and leaves it untouched afterwards", + "type": "boolean", + "default": false + }, + "enforcementMode": { + "title": "Enforcement Mode", + "description": "Overrides the enforcement mode setting of the WAF policy. Ignored on Advanced WAF policies", + "type": "string", + "enum": [ + "blocking", + "transparent" + ] + }, + "serverTechnologies": { + "title": "Server Technologies", + "description": "Define server technologies for the WAF Policy, such as Java Servlets or Apache Struts. Ignored on Advanced WAF policies", + "type": "array", + "items": { + "title": "Server Technology", + "type": "string" + }, + "uniqueItems": true + }, + "disabledSignatures": { + "title": "Disabled attack signatures", + "description": "Disable various attack signatures by ID. Ignored on Advanced WAF policies", + "type": "array", + "items": { + "title": "Attack Signature ID", + "type": "integer", + "minimum": 200000000, + "maximum": 399999999 + }, + "uniqueItems": true + }, + "expand": { + "title": "Expand", + "description": "Performs AS3 string expansion on specified values within the WAF Policy. WAF Policies that are not in JSON format will be ignored", + "type": "array", + "items": { + "title": "JSON pointer", + "description": "A JSON pointer to a value within the WAF Policy that requires AS3 string expansion. Pointing to a parent property results in AS3 traversing the sub-properties and expanding any strings that it may find", + "type": "string" + }, + "uniqueItems": true + } + }, + "additionalProperties": false, + "required": [ + "class" + ], + "oneOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "file" + ] + }, + { + "required": [ + "policy" + ] + } + ] + }, + "Basic_Persist": { + "title": "Basic Persist", + "description": "Holds name of simple persistence method or BIG-IP AS3 pointer to persistence method", + "if": { + "type": "string" + }, + "then": { + "enum": [ + "cookie", + "destination-address", + "msrdp", + "source-address", + "tls-session-id" + ] + }, + "else": { + "$ref": "#/definitions/Pointer_Persist_Profile" + } + }, + "Persist": { + "title": "Persist", + "description": "Declares a persistence method", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Persist" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "persistenceMethod": { + "title": "Persistence method", + "description": "You may customize each basic persistence method", + "type": "string", + "enum": [ + "cookie", + "destination-address", + "hash", + "msrdp", + "sip-info", + "source-address", + "tls-session-id", + "universal" + ] + }, + "matchAcrossPools": { + "title": "Match across pools", + "description": "Specifies that the system can use any pool that contains this persistence record", + "type": "boolean", + "default": false + }, + "matchAcrossVirtualPorts": { + "title": "Match across virtual ports", + "description": "Specifies that all persistent connections from a client IP address that go to the same virtual IP address also go to the same node", + "type": "boolean", + "default": false + }, + "matchAcrossVirtualAddresses": { + "title": "Match across virtual addresses", + "description": "Specifies that all persistent connections from the same client IP address go to the same node", + "type": "boolean", + "default": false + }, + "mirror": { + "title": "Mirror", + "description": "If true, try to maintain persistence even after HA failover of ADC (default false)", + "type": "boolean", + "default": false + }, + "overrideConnectionLimit": { + "title": "Override connection limit", + "description": "If true, do not enforce pool member connection limit for persisted connections (default false)", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "if": { + "properties": { + "persistenceMethod": { + "const": "cookie" + } + } + }, + "then": { + "$ref": "#/definitions/Persist_Cookie" + } + }, + { + "if": { + "properties": { + "persistenceMethod": { + "enum": [ + "destination-address", + "source-address" + ] + } + } + }, + "then": { + "$ref": "#/definitions/Persist_Addr" + } + }, + { + "if": { + "properties": { + "persistenceMethod": { + "const": "hash" + } + } + }, + "then": { + "$ref": "#/definitions/Persist_Hash" + } + }, + { + "if": { + "properties": { + "persistenceMethod": { + "const": "msrdp" + } + } + }, + "then": { + "$ref": "#/definitions/Persist_MSRDP" + } + }, + { + "if": { + "properties": { + "persistenceMethod": { + "const": "sip-info" + } + } + }, + "then": { + "$ref": "#/definitions/Persist_SIP" + } + }, + { + "if": { + "properties": { + "persistenceMethod": { + "const": "tls-session-id" + } + } + }, + "then": { + "$ref": "#/definitions/Persist_TLS_Session" + } + }, + { + "if": { + "properties": { + "persistenceMethod": { + "const": "universal" + } + } + }, + "then": { + "$ref": "#/definitions/Persist_UIE" + } + } + ], + "dependencies": { + "use": { + "not": {} + }, + "bigip": { + "not": {} + } + }, + "required": [ + "class", + "persistenceMethod" + ] + }, + "Persist_Addr": { + "title": "Address persistence", + "description": "Configures an address affinity persistence profile", + "type": "object", + "properties": { + "duration": { + "title": "Duration", + "description": "Lifetime of persistence record (seconds, default 180)", + "type": "integer", + "minimum": 0, + "maximum": 604800, + "default": 180 + }, + "hashAlgorithm": { + "title": "Hash algorithm", + "description": "Specifies the algorithm the system uses for hash persistence load balancing. The hash result is the input for the algorithm.", + "type": "string", + "enum": [ + "carp", + "default" + ], + "default": "default" + }, + "addressMask": { + "title": "Address mask", + "description": "Optional mask selects portion of address used by simple persistence (if omitted the system uses all address bits)", + "type": "string", + "format": "f5ip" + } + } + }, + "Persist_Cookie": { + "title": "Cookie persistence", + "description": "Configures a cookie persistence profile", + "type": "object", + "properties": { + "duration": { + "title": "Duration", + "description": "Lifetime of persistence record (seconds, default 0 means indefinite)", + "type": "integer", + "minimum": 0, + "maximum": 604800, + "default": 0 + }, + "cookieMethod": { + "title": "Method", + "description": "Selects cookie processing method (default is insert)", + "type": "string", + "enum": [ + "insert", + "hash", + "passive", + "rewrite" + ], + "default": "insert" + }, + "cookieName": { + "title": "Cookie name", + "description": "Cookie name (for method 'insert', default (empty-string) yields system-generated name)", + "type": "string", + "pattern": "^[0-9A-Za-z.~#$%^&*_-]*$", + "maxLength": 64, + "default": "" + } + }, + "if": { + "properties": { + "cookieMethod": { + "const": "insert" + } + } + }, + "then": { + "properties": { + "ttl": { + "title": "TTL", + "description": "Requested cookie lifetime (seconds, default 0 means session cookie)", + "type": "integer", + "minimum": 0, + "maximum": 604800, + "default": 0 + }, + "httpOnly": { + "title": "HTTP only flag", + "description": "If true (default) the system sets the HTTPOnly flag", + "type": "boolean", + "default": true + }, + "secure": { + "title": "Secure flag", + "description": "If true (default) the system sets the Secure (TLS) flag", + "type": "boolean", + "default": true + }, + "alwaysSet": { + "title": "Always set", + "description": "If true, set cookie with every HTTP response (default false)", + "type": "boolean", + "default": false + }, + "encrypt": { + "title": "Encrypt cookie", + "description": "If true, prevent disclosure of (or tampering with) ADC info in cookie (default false, to reduce latency)", + "type": "boolean", + "default": false + }, + "passphrase": { + "title": "Passphrase", + "description": "Used to create secret key for cookie encryption", + "type": "object", + "properties": { + "allowReuse": { + "description": "If true, other declaration objects may reuse this value", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Secret" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "object" + } + }, + { + "f5PostProcess": { + "tag": "secret" + } + } + ] + } + }, + "if": { + "properties": { + "encrypt": { + "const": true + } + }, + "required": [ + "encrypt" + ] + }, + "then": { + "required": [ + "passphrase" + ] + } + }, + "else": { + "if": { + "properties": { + "cookieMethod": { + "const": "hash" + } + } + }, + "then": { + "properties": { + "cookieName": { + "minLength": 1 + }, + "startAt": { + "title": "Start at", + "description": "Index of first octet in cookie value to hash", + "type": "integer", + "minimum": 0, + "maximum": 4096, + "default": 0 + }, + "hashCount": { + "title": "Hash count", + "description": "Number of octets in cookie value to hash; 0 (default) means all", + "type": "integer", + "minimum": 0, + "maximum": 4096, + "default": 0 + } + } + }, + "else": { + "$comment": "No extra properties for passive or rewrite." + } + } + }, + "Persist_Hash": { + "title": "Hash persistence", + "description": "Configures a hash persistence profile", + "type": "object", + "properties": { + "duration": { + "title": "Duration", + "description": "Lifetime of persistence record (seconds, default 180)", + "type": "integer", + "minimum": 0, + "maximum": 604800, + "default": 180 + }, + "hashAlgorithm": { + "title": "Hash algorithm", + "description": "Specifies the algorithm the system uses for hash persistence load balancing. The hash result is the input for the algorithm.", + "type": "string", + "enum": [ + "carp", + "default" + ], + "default": "default" + }, + "startAt": { + "title": "Start at", + "description": "Index of first octet in packet to hash", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 0 + }, + "count": { + "title": "Hash count", + "description": "Number of octets in cookie value to hash; 0 (default) means all", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 0 + }, + "startPattern": { + "title": "Start pattern", + "description": "Regular expression which matches start of data to hash; default \"\" averts matching", + "type": "string", + "default": "" + }, + "endPattern": { + "title": "End pattern", + "description": "Regular expression which matches end of data to hash; default \"\" averts matching", + "type": "string", + "default": "" + }, + "bufferLimit": { + "title": "Buffer limit", + "description": "Number of octets to buffer while pattern-matching", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 0 + }, + "iRule": { + "title": "iRule", + "description": "BIG-IP AS3 pointer to iRule if any (declared separately)", + "if": { + "type": "string" + }, + "then": { + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "iRule" + } + }, + "required": [ + "class" + ] + } + } + }, + "else": { + "type": "object", + "properties": { + "bigip": { + "title": "BIG-IP iRule", + "description": "Pathname of existing BIG-IP iRule", + "type": "string", + "format": "f5bigip" + }, + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to iRule (declared separately)", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "iRule" + } + }, + "required": [ + "class" + ] + } + } + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm rule" + ] + } + } + } + } + }, + "Persist_MSRDP": { + "title": "MSRDP persistence", + "description": "Configures a Microsoft(r) Remote Display Protocol (MSRDP) persistence profile", + "type": "object", + "properties": { + "duration": { + "title": "Duration", + "description": "Lifetime of persistence record (seconds, default 300)", + "type": "integer", + "minimum": 0, + "maximum": 604800, + "default": 300 + }, + "sessionBroker": { + "title": "Session broker", + "description": "If true (default), the system will persist the client to the server chosen by session broker", + "type": "boolean", + "default": true + } + } + }, + "Persist_SIP": { + "title": "SIP info persistence", + "description": "Configures a Session Initiation Protocol (SIP) persistence profile", + "type": "object", + "properties": { + "duration": { + "title": "Duration", + "description": "Lifetime of persistence record (seconds, default 180)", + "type": "integer", + "minimum": 0, + "maximum": 604800, + "default": 180 + }, + "header": { + "title": "SIP header", + "description": "Suggested values include: Call-ID, To, From, SIP-ETag, and Subject", + "type": "string", + "minLength": 1 + } + }, + "required": [ + "header" + ] + }, + "Persist_TLS_Session": { + "title": "TLS session persistence", + "description": "Configures a Secure Socket Layer (SSL) persistence profile", + "type": "object", + "properties": { + "duration": { + "title": "Duration", + "description": "Lifetime of persistence record (seconds, default 300)", + "type": "integer", + "minimum": 0, + "maximum": 604800, + "default": 300 + } + } + }, + "Persist_UIE": { + "title": "Universal persistence", + "description": "Configures a universal persistence profile", + "type": "object", + "properties": { + "duration": { + "title": "Duration", + "description": "Lifetime of persistence record (seconds, default 180)", + "type": "integer", + "minimum": 0, + "maximum": 604800, + "default": 180 + }, + "iRule": { + "title": "iRule", + "description": "BIG-IP AS3 pointer to required iRule (declared separately)", + "if": { + "type": "string" + }, + "then": { + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "iRule" + } + }, + "required": [ + "class" + ] + } + } + }, + "else": { + "type": "object", + "properties": { + "bigip": { + "title": "BIG-IP iRule", + "description": "Pathname of existing BIG-IP iRule", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "required": [ + "bigip" + ], + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm rule" + ] + } + } + } + }, + "required": [ + "iRule" + ] + }, + "Pool": { + "title": "Pool", + "description": "Declares a service pool", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Pool" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "allowNATEnabled": { + "title": "Enable Allow NAT", + "description": "If true (default), NATs are automatically enabled for any connections using this pool.", + "type": "boolean", + "default": true + }, + "allowSNATEnabled": { + "title": "Enable Allow SNAT", + "description": "If true (default), SNATs are automatically enabled for any connections using this pool.", + "type": "boolean", + "default": true + }, + "loadBalancingMode": { + "title": "LB mode", + "description": "Load-balancing mode", + "type": "string", + "enum": [ + "dynamic-ratio-member", + "dynamic-ratio-node", + "fastest-app-response", + "fastest-node", + "least-connections-member", + "least-connections-node", + "least-sessions", + "observed-member", + "observed-node", + "predictive-member", + "predictive-node", + "ratio-least-connections-member", + "ratio-least-connections-node", + "ratio-member", + "ratio-node", + "ratio-session", + "round-robin", + "weighted-least-connections-member", + "weighted-least-connections-node" + ], + "default": "round-robin" + }, + "minimumMembersActive": { + "title": "Minimum active", + "description": "Pool is down when fewer than this number of members are up", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 1 + }, + "monitors": { + "title": "Monitors", + "description": "List of health monitors (each by name or BIG-IP AS3 pointer)", + "type": "array", + "items": { + "$ref": "#/definitions/Basic_Monitor" + }, + "$comment": "uniqueItems: true" + }, + "minimumMonitors": { + "title": "Minimum monitors", + "description": "Member is down when fewer than minimum monitors report it healthy. Specify 'all' to require all monitors to be up.", + "oneOf": [ + { + "type": "string", + "const": "all" + }, + { + "type": "integer", + "minimum": 1, + "maximum": 63 + } + ] + }, + "members": { + "title": "Members", + "description": "Set of Pool members", + "type": "array", + "items": { + "$ref": "#/definitions/Pool_Member" + }, + "$comment": "uniqueItems: true", + "f5PostProcess": { + "tag": "node" + } + }, + "metadata": { + "$ref": "#/definitions/Metadata" + }, + "reselectTries": { + "title": "Reselect tries", + "description": "Maximum number of attempts to find a responsive member for a connection", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 0 + }, + "serviceDownAction": { + "title": "Service-down action", + "description": "Specifies connection handling when member is non-responsive", + "type": "string", + "enum": [ + "drop", + "none", + "reselect", + "reset" + ], + "default": "none" + }, + "slowRampTime": { + "title": "Slow ramp time", + "description": "BIG-IP AS3 slowly the connection rate to a newly-active member slowly during this interval (seconds)", + "type": "integer", + "minimum": 0, + "maximum": 900, + "default": 10 + } + }, + "additionalProperties": false, + "if": { + "required": [ + "monitors" + ] + }, + "then": { + "properties": { + "minimumMonitors": { + "default": 1 + } + } + }, + "required": [ + "class" + ] + }, + "Address_Discovery_Common": { + "type": "object", + "allOf": [ + { + "if": { + "properties": { + "addressDiscovery": { + "enum": [ + "fqdn", + "aws", + "azure", + "gce", + "consul" + ] + } + }, + "required": [ + "addressDiscovery" + ] + }, + "then": { + "properties": { + "updateInterval": { + "title": "Update interval", + "description": "Server-discovery update interval (seconds)", + "type": "integer", + "minimum": 1, + "maximum": 3600, + "default": 60 + } + }, + "not": { + "required": [ + "bigip" + ] + } + } + }, + { + "if": { + "properties": { + "addressDiscovery": { + "const": "static" + } + } + }, + "then": { + "oneOf": [ + { + "required": [ + "bigip" + ] + }, + { + "properties": { + "serverAddresses": { + "title": "Server addresses", + "description": "Static IP addresses of servers (nodes). Shorthand for 'servers' where you only want to specify the address property.", + "type": "array", + "items": { + "title": "Server address", + "description": "Static IP address for this server (node)", + "type": "string", + "format": "f5ip" + }, + "uniqueItems": true + }, + "servers": { + "title": "Servers", + "description": "Same as serverAddresses, but allowing for further specification of each node.", + "type": "array", + "items": { + "title": "Servers", + "description": "Static IP address and other details for this server (node)", + "type": "object", + "properties": { + "address": { + "title": "Server address", + "description": "Static IP address for this server (node)", + "type": "string", + "format": "f5ip" + }, + "name": { + "title": "Name", + "type": "string", + "pattern": "^[A-Za-z][0-9A-Za-z_.-]*$", + "maxLength": 64 + } + }, + "required": [ + "address" + ], + "additionalProperties": false + } + } + }, + "if": { + "required": [ + "monitors" + ] + }, + "then": { + "properties": { + "minimumMonitors": { + "default": 1 + } + } + }, + "anyOf": [ + { + "required": [ + "serverAddresses" + ] + }, + { + "required": [ + "servers" + ] + } + ] + } + ] + } + }, + { + "if": { + "properties": { + "addressDiscovery": { + "const": "fqdn" + } + }, + "required": [ + "addressDiscovery" + ] + }, + "then": { + "properties": { + "hostname": { + "title": "Hostname", + "type": "string", + "format": "hostname" + }, + "addressFamily": { + "title": "Address family", + "description": "Selects IPv4/6 and DNS A/AAAA RR's", + "type": "string", + "enum": [ + "IPv4", + "IPv6" + ], + "default": "IPv4" + }, + "autoPopulate": { + "title": "Auto-populate", + "description": "If true use multiple server (node) addresses when available, otherwise use only one", + "type": "boolean", + "default": false + }, + "queryInterval": { + "title": "Query interval", + "description": "Normal DNS query interval (seconds, default 0 means RR TTL)", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "downInterval": { + "title": "Down interval", + "description": "DNS retry interval after resolution failure (seconds)", + "type": "integer", + "minimum": 0, + "default": 5 + }, + "fqdnPrefix": { + "description": "String to prepend onto the hostname to create the node name", + "type": "string", + "oneOf": [ + { + "pattern": "^[A-Za-z][0-9A-Za-z_.-]*$" + }, + { + "const": "" + } + ], + "default": "" + } + }, + "if": { + "required": [ + "monitors" + ] + }, + "then": { + "properties": { + "minimumMonitors": { + "default": 1 + } + } + }, + "required": [ + "hostname" + ] + } + }, + { + "if": { + "properties": { + "addressDiscovery": { + "const": "aws" + } + }, + "required": [ + "addressDiscovery" + ] + }, + "then": { + "$ref": "#/definitions/Service_Discovery_AWS" + } + }, + { + "if": { + "properties": { + "addressDiscovery": { + "const": "azure" + } + }, + "required": [ + "addressDiscovery" + ] + }, + "then": { + "$ref": "#/definitions/Service_Discovery_Azure" + } + }, + { + "if": { + "properties": { + "addressDiscovery": { + "const": "gce" + } + }, + "required": [ + "addressDiscovery" + ] + }, + "then": { + "$ref": "#/definitions/Service_Discovery_GCE" + } + }, + { + "if": { + "properties": { + "addressDiscovery": { + "const": "consul" + } + }, + "required": [ + "addressDiscovery" + ] + }, + "then": { + "$ref": "#/definitions/Service_Discovery_Consul" + } + } + ] + }, + "Address_Discovery": { + "title": "Address_Discovery", + "description": "Sharable Pool Member information", + "type": "object", + "properties": { + "class": { + "type": "string", + "const": "Address_Discovery" + }, + "addressDiscovery": { + "title": "Address discovery", + "description": "Selects how server (node) addresses are discovered", + "type": "string", + "enum": [ + "static", + "fqdn", + "event", + "aws", + "gce", + "azure", + "consul" + ], + "f5serviceDiscovery": true + }, + "shareNodes": { + "description": "If enabled, nodes are created in /Common instead of the tenant's partition", + "type": "boolean", + "default": false + } + }, + "required": [ + "addressDiscovery" + ], + "allOf": [ + { + "$ref": "#/definitions/Address_Discovery_Common" + } + ] + }, + "Pool_Member": { + "title": "Pool member", + "description": "Declares a service-pool member", + "type": "object", + "properties": { + "remark": { + "$ref": "#/definitions/Remark" + }, + "servicePort": { + "title": "Service port", + "description": "Service L4 port (optional port-discovery may override)", + "type": "integer", + "minimum": 0, + "maximum": 65535 + }, + "bigip": { + "title": "BIG-IP node", + "description": "If defined, pathname of existing BIG-IP node", + "type": "string", + "format": "f5bigip" + }, + "enable": { + "description": "Maps to BIG-IP pool member state", + "type": "boolean", + "default": true + }, + "connectionLimit": { + "title": "Connection limit", + "description": "Maximum concurrent connections to member", + "type": "integer", + "minimum": 0, + "maximum": 2147483647, + "default": 0 + }, + "rateLimit": { + "title": "Rate limit", + "description": "Value zero prevents use of member", + "type": "integer", + "minimum": -1, + "maximum": 2147483647, + "default": -1 + }, + "dynamicRatio": { + "title": "Dynamic ratio", + "description": "Specifies a range of numbers that you want the system to use in conjunction with the ratio load balancing method", + "type": "integer", + "minimum": 0, + "maximum": 100, + "default": 1 + }, + "ratio": { + "title": "Ratio", + "description": "Specifies the weight of the pool member for load balancing purposes", + "type": "integer", + "minimum": 0, + "maximum": 100, + "default": 1 + }, + "priorityGroup": { + "title": "Priority group", + "description": "Specifies the priority group within the pool for this pool member", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 0 + }, + "monitors": { + "title": "Monitors", + "description": "List of monitors (each by name or BIG-IP AS3 pointer)", + "type": "array", + "items": { + "$ref": "#/definitions/Basic_Monitor" + }, + "$comment": "uniqueItems: true" + }, + "minimumMonitors": { + "title": "Minimum monitors", + "description": "Member is down when fewer than minimum monitors report it healthy", + "type": "integer", + "minimum": 0, + "maximum": 63 + }, + "metadata": { + "$ref": "#/definitions/Metadata" + }, + "adminState": { + "title": "Administration State", + "description": "Setting adminState to enable will create the node in an operational state. Set to disable to disallow new connections but allow existing connections to drain. Set to offline to force immediate termination of all connections.", + "type": "string", + "enum": [ + "enable", + "disable", + "offline" + ], + "default": "enable" + }, + "addressDiscovery": { + "title": "Address discovery", + "description": "Selects how server (node) addresses are discovered", + "type": [ + "string", + "object" + ], + "if": { + "type": "string" + }, + "then": { + "enum": [ + "static", + "fqdn", + "event", + "aws", + "gce", + "azure", + "consul" + ] + }, + "else": { + "$ref": "#/definitions/Pointer_Address_Discovery" + }, + "default": "static", + "f5serviceDiscovery": { + "exceptions": [ + "static", + "fqdn" + ] + } + }, + "shareNodes": { + "description": "If enabled, nodes are created in /Common instead of the tenant's partition", + "type": "boolean", + "default": false + }, + "routeDomain": { + "description": "The Route Domain to use for the pool member", + "$comment": "Due to the fact the Route Domain id is required for address modification, BIG-IP AS3 does NOT support this route domain reference as anything but the id.", + "type": "integer", + "minimum": 0, + "maximum": 65534 + } + }, + "required": [ + "servicePort" + ], + "allOf": [ + { + "$ref": "#/definitions/Address_Discovery_Common" + }, + { + "if": { + "required": [ + "bigip" + ] + }, + "then": { + "if": { + "required": [ + "monitors" + ] + }, + "then": { + "properties": { + "minimumMonitors": { + "default": 1 + } + } + } + } + }, + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm node" + ] + } + } + ] + }, + "Service_Discovery_Polling_Core": { + "type": "object", + "properties": { + "addressRealm": { + "title": "Address realm", + "description": "Specifies whether to look for public or private IP addresses", + "type": "string", + "enum": [ + "public", + "private" + ], + "default": "private" + }, + "credentialUpdate": { + "title": "Credential Update", + "type": "boolean", + "description": "Specifies whether you are updating your credentials", + "default": false + }, + "undetectableAction": { + "title": "Undetectable Action", + "description": "Action to take when node cannot be detected", + "type": "string", + "enum": [ + "disable", + "remove" + ], + "default": "remove" + } + } + }, + "Service_Discovery_Polling_Core_Tagged": { + "properties": { + "tagKey": { + "title": "Tag key", + "type": "string", + "minLength": 1, + "description": "The tag key associated with the node to add to this pool" + }, + "tagValue": { + "title": "Tag value", + "type": "string", + "minLength": 1, + "description": "The tag value associated with the node to add to this pool" + } + }, + "allOf": [ + { + "$ref": "#/definitions/Service_Discovery_Polling_Core" + } + ] + }, + "Service_Discovery_AWS": { + "description": "Service Discovery properties for Amazon Web Services (AWS)", + "properties": { + "region": { + "title": "AWS region", + "description": "Empty string (default) means region in which ADC is running", + "type": "string", + "default": "" + }, + "roleARN": { + "title": "Role Amazon Resource Name", + "description": "Assume a role (also requires the externalId field)", + "type": "string", + "minLength": 1 + }, + "externalId": { + "title": "External Id", + "description": "External Id", + "type": "string", + "minLength": 1 + }, + "accessKeyId": { + "title": "Access Key Id", + "description": "Information for discovering AWS nodes that are not in the same region as your BIG-IP (also requires the secretAccessKey field", + "type": "string", + "minLength": 1 + }, + "secretAccessKey": { + "title": "Secret Access Key", + "description": "Will be stored in the declaration as an encrypted string", + "oneOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "allOf": [ + { + "required": [ + "ciphertext" + ] + }, + { + "$ref": "#/definitions/Secret" + } + ] + } + ], + "f5PostProcess": { + "tag": "longSecret" + } + } + }, + "dependencies": { + "roleARN": { + "required": [ + "externalId" + ] + }, + "externalId": { + "required": [ + "roleARN" + ] + }, + "accessKeyId": { + "required": [ + "secretAccessKey" + ] + }, + "secretAccessKey": { + "required": [ + "accessKeyId" + ] + } + }, + "if": { + "required": [ + "monitors" + ] + }, + "then": { + "properties": { + "minimumMonitors": { + "type": "integer", + "default": 1 + } + } + }, + "required": [ + "region", + "tagKey", + "tagValue" + ], + "allOf": [ + { + "$ref": "#/definitions/Service_Discovery_Polling_Core_Tagged" + } + ] + }, + "Service_Discovery_Azure": { + "description": "Service Discovery properties for Azure", + "properties": { + "resourceGroup": { + "title": "Resource group", + "description": "Azure Resource Group name", + "type": "string" + }, + "subscriptionId": { + "title": "Subscription ID", + "description": "Azure subscription ID", + "type": "string" + }, + "useManagedIdentity": { + "title": "Use Managed Identity", + "description": "Use Azure managed identity rather than directoryId, applicationId, and apiAccessKey", + "type": "boolean", + "default": false + }, + "directoryId": { + "title": "(Azure) Directory ID", + "description": "Azure Active Directory ID (AKA tenant ID)", + "type": "string" + }, + "applicationId": { + "title": "(Azure) Application ID", + "description": "Azure registered application ID (AKA client ID)", + "type": "string" + }, + "apiAccessKey": { + "title": "Azure API access key", + "description": "Azure registered application API access key (AKA service principal secret). Will be stored in the declaration in an encrypted format.", + "oneOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "allOf": [ + { + "required": [ + "ciphertext" + ] + }, + { + "$ref": "#/definitions/Secret" + } + ] + } + ], + "f5PostProcess": { + "tag": "longSecret" + } + }, + "resourceType": { + "description": "Type of resource identified by resourceId. This can be used in place of tagKey/tagValue.", + "type": "string", + "enum": [ + "tag", + "scaleSet" + ] + }, + "resourceId": { + "description": "ID of resource to find nodes by.", + "type": "string" + }, + "environment": { + "title": "Azure environment", + "description": "Azure environment name. Required if environment should not be determined by instance metadata.", + "type": "string", + "default": "Azure" + } + }, + "required": [ + "resourceGroup", + "subscriptionId" + ], + "allOf": [ + { + "$ref": "#/definitions/Service_Discovery_Polling_Core_Tagged" + }, + { + "if": { + "required": [ + "monitors" + ] + }, + "then": { + "properties": { + "minimumMonitors": { + "type": "integer", + "default": 1 + } + } + } + }, + { + "if": { + "required": [ + "tagKey", + "tagValue" + ] + }, + "then": { + "not": { + "required": [ + "resourceId", + "resourceType" + ] + } + }, + "else": { + "required": [ + "resourceId", + "resourceType" + ], + "not": { + "required": [ + "tagKey", + "tagValue" + ] + } + } + }, + { + "if": { + "properties": { + "useManagedIdentity": { + "const": true + } + } + }, + "then": { + "allOf": [ + { + "not": { + "required": [ + "directoryId" + ] + } + }, + { + "not": { + "required": [ + "applicationId" + ] + } + }, + { + "not": { + "required": [ + "apiAccessKey" + ] + } + } + ] + }, + "else": { + "required": [ + "directoryId", + "applicationId", + "apiAccessKey" + ] + } + } + ] + }, + "Service_Discovery_GCE": { + "description": "Service Discovery properties for Google Compute Engine (GCE)", + "properties": { + "region": { + "title": "GCE region", + "description": "Empty string (default) means region in which ADC is running", + "type": "string" + }, + "encodedCredentials": { + "title": "Encoded Service Account Credentials", + "description": "Base 64 encoded service account credentials JSON", + "oneOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "allOf": [ + { + "required": [ + "ciphertext" + ] + }, + { + "$ref": "#/definitions/Secret" + } + ] + } + ], + "f5PostProcess": { + "tag": "longSecret" + } + }, + "projectId": { + "title": "Project Id", + "description": "For Google Cloud Engine (GCE) only: The ID of the project in which the members are located", + "type": "string" + } + }, + "if": { + "required": [ + "monitors" + ] + }, + "then": { + "properties": { + "minimumMonitors": { + "type": "integer", + "default": 1 + } + } + }, + "required": [ + "region", + "tagKey", + "tagValue" + ], + "allOf": [ + { + "$ref": "#/definitions/Service_Discovery_Polling_Core_Tagged" + } + ] + }, + "Service_Discovery_Consul": { + "description": "Service Discovery properties for Consul", + "properties": { + "uri": { + "title": "URI", + "type": "string", + "minLength": 1, + "description": "The location of the node data" + }, + "encodedToken": { + "title": "Encoded ACL Token", + "description": "Base 64 encoded bearer token to make requests to the Consul API. Will be stored in the declaration in an encrypted format.", + "oneOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "allOf": [ + { + "required": [ + "ciphertext" + ] + }, + { + "$ref": "#/definitions/Secret" + } + ] + } + ], + "f5PostProcess": { + "tag": "longSecret" + } + }, + "trustCA": { + "title": "Trusted CA bundle", + "description": "CA Bundle to validate server certificates", + "allOf": [ + { + "$ref": "#/definitions/Pointer_CA_Bundle" + } + ] + }, + "rejectUnauthorized": { + "title": "Reject Unauthorized Connection", + "description": "If true, the server certificate is verified against the list of supplied/default CAs when making requests to the Consul API.", + "type": "boolean", + "default": true + }, + "jmesPathQuery": { + "title": "JMESPath Query", + "type": "string", + "description": "Custom JMESPath Query" + } + }, + "if": { + "required": [ + "monitors" + ] + }, + "then": { + "properties": { + "minimumMonitors": { + "type": "integer", + "default": 1 + } + } + }, + "required": [ + "uri" + ], + "allOf": [ + { + "$ref": "#/definitions/Service_Discovery_Polling_Core" + } + ] + }, + "Basic_Monitor": { + "title": "Basic Monitor", + "description": "Holds name of simple monitor or BIG-IP AS3 pointer to a monitor declaration", + "if": { + "type": "string" + }, + "then": { + "enum": [ + "http", + "https", + "http2", + "icmp", + "tcp-half-open", + "tcp" + ] + }, + "else": { + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to monitor declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Monitor" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP monitor", + "description": "Pathname of existing BIG-IP monitor", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "probe ltm monitor icmp" + ] + } + } + }, + "Monitor": { + "title": "Monitor", + "description": "Declares a (possibly complex) monitor", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Monitor" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "monitorType": { + "title": "Monitor type", + "description": "You may customize each monitor type", + "type": "string", + "enum": [ + "dns", + "external", + "ftp", + "http", + "https", + "http2", + "icmp", + "inband", + "ldap", + "mysql", + "postgresql", + "radius", + "sip", + "smtp", + "tcp", + "tcp-half-open", + "udp" + ] + } + }, + "allOf": [ + { + "if": { + "not": { + "properties": { + "monitorType": { + "const": "inband" + } + } + } + }, + "then": { + "properties": { + "targetAddress": { + "title": "Address", + "description": "IP address monitor should probe; if empty (default) then pool member address", + "type": "string", + "format": "f5ip", + "default": "" + }, + "interval": { + "title": "Interval", + "description": "Poll interval (seconds)", + "type": "integer", + "minimum": 0, + "maximum": 3600, + "default": 5 + }, + "upInterval": { + "title": "Up-Interval", + "description": "Poll interval when service is already up (seconds)", + "type": "integer", + "minimum": 0, + "maximum": 3600, + "default": 0 + }, + "timeUntilUp": { + "title": "Time until up", + "description": "Delay between successful probe and sending traffic to node (seconds)", + "type": "integer", + "minimum": 0, + "maximum": 1800, + "default": 0 + }, + "timeout": { + "title": "Timeout", + "description": "Time limit for node to respond (seconds)", + "type": "integer", + "minimum": 0, + "maximum": 900, + "default": 16 + } + } + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "icmp" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor_ICMP" + }, + "else": { + "if": { + "properties": { + "monitorType": { + "const": "inband" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor_Inband" + }, + "else": { + "properties": { + "targetPort": { + "title": "Port", + "description": "L4 port (if any) monitor should probe; if 0 (default) then pool member port", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 0 + } + } + } + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "http" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor_HTTP" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "https" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor_HTTPS" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "http2" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor_HTTP2" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "external" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor_External" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "tcp" + } + } + }, + "then": { + "properties": { + "dscp": { + "title": "IP DSCP", + "description": "Value for IP DSCP (ex-TOS) field (default 0)", + "type": "integer", + "minimum": 0, + "maximum": 63, + "default": 0 + } + }, + "allOf": [ + { + "$ref": "#/definitions/Monitor_TCP" + } + ] + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "udp" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor_UDP" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "smtp" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor_SMTP" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "mysql" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor_MySQL" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "postgresql" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor_PostgreSQL" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "sip" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor_SIP" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "tcp-half-open" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor_TCP_Half_Open" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "ldap" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor_LDAP" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "dns" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor_DNS" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "radius" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor_RADIUS" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "ftp" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor_FTP" + } + } + ], + "required": [ + "class", + "monitorType" + ] + }, + "Monitor_May_Adapt": { + "description": "Additional Monitor class properties available when monitorType = http, https, tcp, udp, or icmp", + "type": "object", + "properties": { + "adaptive": { + "title": "Adaptive", + "description": "If true, use adaptive probe timing", + "type": "boolean", + "default": false + }, + "adaptiveDivergenceType": { + "title": "Adaptive divergence type", + "description": "Adaptive divergence, 'absolute' selects milliseconds, 'relative' (default) selects percentage", + "type": "string", + "enum": [ + "absolute", + "relative" + ], + "default": "relative" + }, + "adaptiveDivergenceMilliseconds": { + "title": "Adaptive divergence msec", + "description": "Probe fails if response latency exceeds mean by this number of milliseconds", + "type": "integer", + "minimum": 1, + "maximum": 10000, + "default": 500 + }, + "adaptiveDivergencePercentage": { + "title": "Adaptive divergence percent", + "description": "Probe fails if response latency exceeds mean by this percentage", + "type": "integer", + "minimum": 1, + "maximum": 500, + "default": 100 + }, + "adaptiveLimitMilliseconds": { + "title": "Adaptive limit msec", + "description": "Probe fails if response latency exceeds this number of milliseconds", + "type": "integer", + "minimum": 1, + "maximum": 10000, + "default": 1000 + }, + "adaptiveWindow": { + "title": "Adaptive window", + "description": "Time window over which the system samples latency (seconds)", + "type": "integer", + "minimum": 60, + "maximum": 1800, + "default": 180 + } + } + }, + "Monitor_External": { + "description": "Additional Monitor class properties available when monitorType = external", + "type": "object", + "properties": { + "pathname": { + "title": "pathname", + "description": "Tmsh object path name of an imported existing external monitor (e.g. /Common/arg_example)", + "type": "string", + "minLength": 2, + "f5PostProcess": { + "tag": "expand" + } + }, + "expand": { + "title": "Expand", + "description": "If true (default), expand backquoted variables in script", + "type": "boolean", + "default": true + }, + "script": { + "title": "External monitor script", + "description": "Bash(1) script which implements external monitor", + "allOf": [ + { + "$ref": "#/definitions/F5string" + }, + { + "f5PostProcess": { + "tag": "expand", + "data": { + "when": "1/expand" + } + } + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "string" + } + } + ] + }, + "arguments": { + "title": "Arguments", + "description": "Arguments to specified external monitor (will be backquote-expanded)", + "type": "string", + "default": "", + "f5PostProcess": { + "tag": "expand" + } + }, + "environmentVariables": { + "description": "Specifies user defined command line parameters that the external program requires.", + "type": "object", + "additionalProperties": { + "type": "string" + }, + "default": {} + } + }, + "oneOf": [ + { + "required": [ + "pathname" + ] + }, + { + "required": [ + "script" + ] + } + ] + }, + "Monitor_FTP": { + "description": "Additional Monitor class properties available when monitorType = ftp", + "type": "object", + "properties": { + "mode": { + "title": "Mode", + "description": "Specifies the data transfer process (DTP) mode. The default value is passive.", + "type": "string", + "default": "passive", + "enum": [ + "passive", + "port" + ] + }, + "username": { + "title": "Username", + "description": "Username if any for query authentication", + "type": "string" + }, + "passphrase": { + "title": "Passphrase", + "description": "Passphrase if any for query authentication", + "type": "object", + "properties": { + "allowReuse": { + "description": "If true, other declaration objects may reuse this value", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Secret" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "object" + } + }, + { + "f5PostProcess": { + "tag": "secret" + } + } + ] + }, + "filename": { + "title": "Filename", + "description": "Specifies the full path and file name of the file that the system attempts to download. The health check is successful if the system can download the file.", + "type": "string" + } + } + }, + "Monitor_HTTP": { + "description": "Additional Monitor class properties available when monitorType = http or https or http2", + "type": "object", + "properties": { + "send": { + "title": "Send", + "description": "Send this (backquote-expanded) string to query node", + "type": "string", + "default": "HEAD / HTTP/1.0\\r\\n\\r\\n", + "f5PostProcess": { + "tag": "expand" + } + }, + "receive": { + "title": "Receive = up", + "description": "Mark node up upon receipt of this (backquote-expanded) string", + "type": "string", + "default": "HTTP/1.", + "f5PostProcess": { + "tag": "expand" + } + }, + "receiveDown": { + "title": "Receive = down", + "description": "Mark node down upon receipt of this (backquote-expanded) string (optional; must be empty when 'reverse' is true)", + "type": "string", + "default": "", + "f5PostProcess": { + "tag": "expand" + } + }, + "reverse": { + "title": "Reverse", + "description": "If true, mark node down upon receipt of 'receive' string", + "type": "boolean", + "default": false + }, + "username": { + "title": "Username", + "description": "Username if any for query authentication", + "type": "string" + }, + "passphrase": { + "title": "Passphrase", + "description": "Passphrase if any for query authentication", + "type": "object", + "properties": { + "allowReuse": { + "description": "If true, other declaration objects may reuse this value", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Secret" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "object" + } + }, + { + "f5PostProcess": { + "tag": "secret" + } + } + ] + }, + "transparent": { + "title": "Transparent", + "description": "If true, treat pool member address as gateway to server (node) (default false)", + "type": "boolean", + "default": false + }, + "dscp": { + "title": "IP DSCP", + "description": "Value for IP DSCP (ex-TOS) field (default 0)", + "type": "integer", + "minimum": 0, + "maximum": 63, + "default": 0 + } + }, + "allOf": [ + { + "$ref": "#/definitions/Monitor_May_Adapt" + } + ], + "dependencies": { + "reverse": { + "if": { + "properties": { + "reverse": { + "const": true + } + } + }, + "then": { + "properties": { + "receiveDown": { + "const": "" + } + } + } + } + } + }, + "Monitor_HTTPS": { + "description": "Additional Monitor class properties available when monitorType = https", + "type": "object", + "properties": { + "ciphers": { + "title": "Ciphers", + "description": "Ciphersuite selection string", + "type": "string", + "default": "DEFAULT" + }, + "clientCertificate": { + "title": "Client certificate", + "description": "BIG-IP AS3 pointer to client Certificate declaration, for TLS authentication (optional)", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Certificate" + } + }, + "required": [ + "class" + ] + } + } + }, + "clientTLS": { + "title": "Client TLS", + "description": "BIG-IP AS3 pointer to client TLS Profile", + "allOf": [ + { + "$ref": "#/definitions/Pointer_TLS_Client" + } + ] + } + }, + "allOf": [ + { + "$ref": "#/definitions/Monitor_HTTP" + } + ] + }, + "Monitor_HTTP2": { + "description": "Additional Monitor class properties available when monitorType = http2. Requires TMOS version 15.1 or newer.", + "type": "object", + "properties": { + "clientTLS": { + "title": "Client TLS", + "description": "BIG-IP AS3 pointer to client TLS Profile", + "allOf": [ + { + "$ref": "#/definitions/Pointer_TLS_Client" + } + ] + }, + "receive": { + "title": "Receive = up", + "description": "Mark node up upon receipt of this (backquote-expanded) string", + "type": "string", + "default": "HTTP/2.", + "f5PostProcess": { + "tag": "expand" + } + }, + "send": { + "title": "Send", + "description": "Send this (backquote-expanded) string to query node", + "type": "string", + "default": "GET /\\r\\n\\r\\n", + "f5PostProcess": { + "tag": "expand" + } + } + }, + "allOf": [ + { + "$ref": "#/definitions/Monitor_HTTP" + } + ] + }, + "Monitor_ICMP": { + "description": "Additional Monitor class properties available when monitorType = icmp", + "type": "object", + "properties": { + "transparent": { + "title": "Transparent", + "description": "If true, treat pool member address as gateway to server (node) (default false)", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Monitor_May_Adapt" + } + ] + }, + "Monitor_MySQL": { + "description": "Additional Monitor class properties available when monitorType = mysql", + "type": "object", + "properties": { + "send": { + "title": "Send", + "description": "Send this (backquote-expanded) string to query node", + "type": "string", + "f5PostProcess": { + "tag": "expand" + } + }, + "receive": { + "title": "Receive = up", + "description": "Mark node up upon receipt of this (backquote-expanded) string", + "type": "string", + "f5PostProcess": { + "tag": "expand" + } + }, + "username": { + "title": "Username", + "description": "Username if any for query authentication", + "type": "string" + }, + "passphrase": { + "title": "Passphrase", + "description": "Passphrase if any for query authentication", + "type": "object", + "properties": { + "allowReuse": { + "description": "If true, other declaration objects may reuse this value", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Secret" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "object" + } + }, + { + "f5PostProcess": { + "tag": "secret" + } + } + ] + }, + "count": { + "title": "Count", + "description": "Number of monitor probes after which the connection to the database will be terminated. Count value of zero indicates that the connection will never be terminated.", + "type": "integer", + "minimum": 0, + "maximum": 2147483647, + "default": 0 + }, + "database": { + "title": "Database", + "description": "The name of the database with which the monitor attempts to communicate.", + "type": "string" + }, + "receiveColumn": { + "title": "Receive Column", + "description": "Specifies the column in the database where the system expects the specified Receive String to be located. Specify this property only if you configure the Send and Receive properties.", + "type": "integer", + "minimum": 1, + "maximum": 4096 + }, + "receiveRow": { + "title": "Receive Row", + "description": "Specifies the row in the database where the system expects the specified Receive String to be located. Specify this property only if you configure the Send and Recieve properties.", + "type": "integer", + "minimum": 1, + "maximum": 65535 + } + }, + "dependencies": { + "receiveColumn": { + "required": [ + "send", + "receive" + ] + }, + "receiveRow": { + "required": [ + "send", + "receive" + ] + } + } + }, + "Monitor_PostgreSQL": { + "description": "Additional Monitor class properties available when monitorType = postgresql", + "type": "object", + "properties": { + "send": { + "title": "Send", + "description": "Send this (backquote-expanded) string to query node", + "type": "string", + "f5PostProcess": { + "tag": "expand" + } + }, + "receive": { + "title": "Receive = up", + "description": "Mark node up upon receipt of this (backquote-expanded) string", + "type": "string", + "f5PostProcess": { + "tag": "expand" + } + }, + "username": { + "title": "Username", + "description": "Username if any for query authentication", + "type": "string" + }, + "passphrase": { + "title": "Passphrase", + "description": "Passphrase if any for query authentication", + "type": "object", + "properties": { + "allowReuse": { + "description": "If true, other declaration objects may reuse this value", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Secret" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "object" + } + }, + { + "f5PostProcess": { + "tag": "secret" + } + } + ] + }, + "count": { + "title": "Count", + "description": "Number of monitor probes after which the connection to the database will be terminated. Count value of zero indicates that the connection will never be terminated.", + "type": "integer", + "minimum": 0, + "maximum": 2147483647, + "default": 0 + }, + "database": { + "title": "Database", + "description": "The name of the database with which the monitor attempts to communicate.", + "type": "string" + }, + "receiveColumn": { + "title": "Receive Column", + "description": "Specifies the column in the database where the system expects the specified Receive String to be located. Specify this property only if you configure the Send and Receive properties.", + "type": "integer", + "minimum": 1, + "maximum": 1600 + }, + "receiveRow": { + "title": "Receive Row", + "description": "Specifies the row in the database where the system expects the specified Receive String to be located. Specify this property only if you configure the Send and Recieve properties.", + "type": "integer", + "minimum": 1, + "maximum": 4294967294 + } + }, + "dependencies": { + "receiveColumn": { + "required": [ + "send", + "receive" + ] + }, + "receiveRow": { + "required": [ + "send", + "receive" + ] + } + } + }, + "Monitor_SIP": { + "description": "Additional Monitor class properties available when monitorType = sip", + "type": "object", + "properties": { + "protocol": { + "title": "Protocol", + "description": "SIP transport protocol", + "type": "string", + "enum": [ + "sips", + "tcp", + "tls", + "udp" + ], + "default": "udp" + }, + "request": { + "title": "Request", + "description": "SIP request to send in probes (default empty)", + "type": "string", + "default": "" + }, + "headers": { + "title": "Headers", + "description": "SIP headers to send in probes (if any)--separate by newlines (backquote-expanded)", + "type": "string", + "default": "", + "f5PostProcess": { + "tag": "expand" + } + }, + "codesUp": { + "title": "Codes = up", + "description": "List of additional (to all 1/2/3xx) status codes meaning service is up (0 matches any code)", + "type": "array", + "items": { + "title": "Code = up", + "type": "integer", + "minimum": 0 + }, + "uniqueItems": true + }, + "codesDown": { + "title": "Codes = down", + "description": "List of status codes meaning service is down (0 matches any code)", + "type": "array", + "items": { + "title": "Code = down", + "type": "integer", + "minimum": 0 + }, + "uniqueItems": true + }, + "ciphers": { + "title": "Ciphers", + "description": "Ciphersuite selection string", + "type": "string", + "default": "DEFAULT" + }, + "clientCertificate": { + "title": "Client certificate", + "description": "BIG-IP AS3 pointer to client Certificate declaration, for TLS authentication (optional)", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Certificate" + } + }, + "required": [ + "class" + ] + } + } + } + }, + "dependencies": { + "clientCertificate": { + "properties": { + "protocol": { + "enum": [ + "sips", + "tls" + ] + } + } + } + } + }, + "Monitor_SMTP": { + "description": "Additional Monitor class properties available when monitorType = smtp", + "type": "object", + "properties": { + "domain": { + "title": "Domain", + "description": "Mail domain to check, if any (backquote-expanded)", + "type": "string", + "format": "hostname", + "default": "", + "f5PostProcess": { + "tag": "expand" + } + } + } + }, + "Monitor_TCP": { + "description": "Additional Monitor class properties available when monitorType = tcp", + "type": "object", + "properties": { + "send": { + "title": "Send", + "description": "Send this (backquote-expanded) string to node", + "type": "string", + "f5PostProcess": { + "tag": "expand" + }, + "default": "none" + }, + "receive": { + "title": "Receive = up", + "description": "Mark node up upon receipt of this (backquote-expanded) string", + "type": "string", + "f5PostProcess": { + "tag": "expand" + }, + "default": "none" + }, + "receiveDown": { + "title": "Receive = down", + "description": "Mark node down upon receipt of this (backquote-expanded) string (optional; must be empty when 'reverse' is true)", + "type": "string", + "default": "", + "f5PostProcess": { + "tag": "expand" + } + }, + "reverse": { + "title": "Reverse", + "description": "If true, mark node down upon receipt of 'receive' string", + "type": "boolean", + "default": false + }, + "transparent": { + "title": "Transparent", + "description": "If true, treat pool member address as gateway to server (node) (default false)", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Monitor_May_Adapt" + } + ], + "dependencies": { + "reverse": { + "if": { + "properties": { + "reverse": { + "const": true + } + } + }, + "then": { + "properties": { + "receiveDown": { + "const": "" + } + } + } + } + } + }, + "Monitor_UDP": { + "description": "Additional Monitor class properties available when monitorType = udp", + "type": "object", + "properties": { + "send": { + "title": "Send", + "description": "Send this (backquote-expanded) string to node", + "type": "string", + "f5PostProcess": { + "tag": "expand" + }, + "default": "default send string" + }, + "receive": { + "title": "Receive = up", + "description": "Mark node up upon receipt of this (backquote-expanded) string", + "type": "string", + "f5PostProcess": { + "tag": "expand" + }, + "default": "none" + }, + "receiveDown": { + "title": "Receive = down", + "description": "Mark node down upon receipt of this (backquote-expanded) string (optional; must be empty when 'reverse' is true)", + "type": "string", + "default": "", + "f5PostProcess": { + "tag": "expand" + } + }, + "reverse": { + "title": "Reverse", + "description": "If true, mark node down upon receipt of 'receive' string", + "type": "boolean", + "default": false + }, + "transparent": { + "title": "Transparent", + "description": "If true, treat pool member address as gateway to server (node) (default false)", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Monitor_May_Adapt" + } + ], + "dependencies": { + "reverse": { + "if": { + "properties": { + "reverse": { + "const": true + } + } + }, + "then": { + "properties": { + "receiveDown": { + "const": "" + } + } + } + } + } + }, + "Monitor_TCP_Half_Open": { + "description": "Additional Monitor class properties available when monitorType = tcp-half-open", + "type": "object", + "properties": { + "transparent": { + "title": "Transparent", + "description": "If true, treat pool member address as gateway to server (node) (default false)", + "type": "boolean", + "default": false + } + } + }, + "Monitor_Inband": { + "description": "Additional Monitor class properties available when monitorType = inband", + "type": "object", + "properties": { + "failureInterval": { + "title": "Failure Interval", + "description": "Specifies an interval, in seconds. If the number of failures specified in the failures option occurs within this interval, the system marks the pool member as being unavailable.", + "type": "integer", + "maximum": 1000, + "minimum": 2, + "default": 30 + }, + "failures": { + "title": "Failures", + "description": "Specifies the number of failures that the system allows to occur, within the time period specified in the failureInterval property, before marking a pool member unavailable. The multiple tmm processes use a per-process number to calculate failures, depending on the specified load. For example, for the Round Robin load balancing method, if there are N tmm processes and M pool members, and the Failures property is set to L, then up to N*M*L+1 failures can occur before the system marks the node as down. Specifying a value of 0 disables this option. A failure can be either a failure to connect or a failure of the pool member to respond within the time specified in the responseTime property.", + "type": "integer", + "default": 3, + "maximum": 1000, + "minimum": 0 + }, + "responseTime": { + "title": "Response Time", + "description": "Specifies an amount of time, in seconds. If the pool member does not respond with data after the specified amount of time has passed, the number of failures in this interval increments by 1. Specifying a value of 0 disables this option.", + "type": "integer", + "default": 10, + "maximum": 5000, + "minimum": 0 + }, + "retryTime": { + "title": "Retry Time", + "description": "Specifies the amount of time in seconds after the pool member has been marked unavailable before the system retries to connect to the pool member. Specifying a value of 0 disables this option.", + "type": "integer", + "default": 300, + "maximum": 5000, + "minimum": 0 + } + } + }, + "Monitor_LDAP": { + "description": "Additional Monitor class properties available when monitorType = smtp", + "type": "object", + "properties": { + "username": { + "title": "Username", + "description": "Username if any for query authentication", + "type": "string" + }, + "passphrase": { + "title": "Passphrase", + "description": "Passphrase if any for query authentication", + "type": "object", + "properties": { + "allowReuse": { + "description": "If true, other declaration objects may reuse this value", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Secret" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "object" + } + }, + { + "f5PostProcess": { + "tag": "secret" + } + } + ] + }, + "base": { + "title": "Base", + "description": "Specifies the location in the LDAP tree from which the monitor starts the health check", + "type": "string" + }, + "filter": { + "title": "Filter", + "description": "Specifies an LDAP key which the monitor searches", + "type": "string" + }, + "security": { + "title": "Security", + "description": "Specifies the secure protocol type for communications with the target", + "type": "string", + "enum": [ + "none", + "ssl", + "tls" + ], + "default": "none" + }, + "mandatoryAttributes": { + "title": "Mandatory Attributes", + "description": "Specifies whether the target must include attributes in its response to be considered up", + "type": "boolean", + "default": false + }, + "chaseReferrals": { + "title": "Chase Referrals", + "description": "Specifies, whether, upon receipt of an LDAP referral entry, the referral is followed", + "type": "boolean", + "default": true + } + } + }, + "Monitor_DNS": { + "description": "Additional Monitor class properties available when monitorType = dns", + "type": "object", + "properties": { + "acceptRCODE": { + "title": "Accept RCODE", + "description": "Specifies the RCODE required in the response for an up status", + "type": "string", + "enum": [ + "anything", + "no-error" + ], + "default": "no-error" + }, + "answerContains": { + "title": "Answer Section Contains", + "description": "Specifies the type of DNS query that the monitor sends", + "type": "string", + "enum": [ + "any-type", + "anything", + "query-type" + ], + "default": "query-type" + }, + "queryName": { + "title": "Query Name", + "description": "Specifies a query name for the monitor to use in a DNS query", + "type": "string", + "minLength": 1 + }, + "queryType": { + "title": "Query Type", + "description": "Specifies the type of DNS query that the monitor sends.", + "type": "string", + "enum": [ + "a", + "aaaa" + ], + "default": "a" + }, + "receive": { + "title": "Receive String", + "description": "IP address that the monitor uses from the resource records sections of the DNS response", + "type": "string" + }, + "reverse": { + "title": "Reverse", + "description": "If true, mark node down upon receipt of 'receive' string", + "type": "boolean", + "default": false + }, + "transparent": { + "title": "Transparent", + "description": "If true, treat pool member address as gateway to server (node) (default false)", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Monitor_May_Adapt" + }, + { + "if": { + "properties": { + "transparent": { + "const": true + } + }, + "required": [ + "transparent" + ] + }, + "then": { + "allOf": [ + { + "required": [ + "targetAddress", + "targetPort" + ] + }, + { + "properties": { + "targetAddress": { + "not": { + "const": "" + } + } + } + } + ] + } + }, + { + "if": { + "properties": { + "reverse": { + "const": true + } + }, + "required": [ + "reverse" + ] + }, + "then": { + "allOf": [ + { + "required": [ + "receive" + ] + }, + { + "properties": { + "receive": { + "not": { + "const": "" + } + } + } + } + ] + } + }, + { + "if": { + "properties": { + "answerContains": { + "const": "query-type" + }, + "acceptRCODE": { + "const": "no-error" + } + } + }, + "then": { + "properties": { + "receive": { + "default": "" + } + } + } + } + ], + "required": [ + "queryName" + ] + }, + "Monitor_RADIUS": { + "description": "Additional Monitor class properties available when monitorType = radius", + "type": "object", + "properties": { + "username": { + "title": "Username", + "description": "Specifies the user name, if the monitor target requires authentication", + "type": "string" + }, + "passphrase": { + "title": "Passphrase", + "description": "Specifies the password, if the monitored target requires authentication", + "type": "object", + "properties": { + "allowReuse": { + "description": "If true, other declaration objects may reuse this value", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Secret" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "object" + } + }, + { + "f5PostProcess": { + "tag": "secret" + } + } + ] + }, + "secret": { + "title": "Secret", + "description": "Specifies the secret the monitor needs to access the resource", + "type": "object", + "properties": { + "allowReuse": { + "description": "If true, other declaration objects may reuse this value", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Secret" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "object" + } + }, + { + "f5PostProcess": { + "tag": "secret" + } + } + ] + }, + "nasIpAddress": { + "title": "IP Address", + "description": "Specifies the networks access server's IP address (NAS IP address) for a RADIUS monitor", + "type": "string", + "format": "f5ip" + } + } + }, + "TLS_Server": { + "title": "TLS_Server", + "description": "TLS server parameters (connections arriving to ADC)", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "TLS_Server" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "requireSNI": { + "title": "Require SNI", + "description": "When a client sends no or unknown SNI and Require SNI is false (default), the system uses the primary certificate, otherwise the system rejects the client", + "type": "boolean", + "default": false + }, + "alertTimeout": { + "title": "Alert Timeout", + "description": "Specifies the duration of time, in seconds, for the system to try to close an SSL connection before resetting the connection. The default is 'indefinite'. You can also specify 'immediate', or an integer.", + "oneOf": [ + { + "type": "integer", + "maximum": 4294967294, + "minimum": 1 + }, + { + "type": "string", + "enum": [ + "immediate", + "indefinite" + ] + } + ], + "default": "indefinite" + }, + "cacheTimeout": { + "title": "Cache Timeout", + "description": "Sets the cache timeout (in seconds)", + "type": "integer", + "maximum": 86400, + "minimum": 0, + "default": 3600 + }, + "certificates": { + "title": "Certificates", + "description": "Primary and (optional) additional certificates (order is significant, element 0 is primary cert)", + "type": "array", + "items": { + "type": "object", + "properties": { + "matchToSNI": { + "title": "Match to SNI", + "description": "If value is FQDN (wildcard okay), ignore all names in certificate and select this cert when SNI matches value (or by default)", + "type": "string" + }, + "sniDefault": { + "title": "Default SNI", + "description": "When true, this profile is the default SSL profile when a client connection does not specify a known server name, or does not specify any server name at all. The default value is false", + "type": "boolean", + "default": false + }, + "enabled": { + "title": "Enabled", + "description": "Enables SSL processing", + "type": "boolean", + "default": true + }, + "certificate": { + "title": "Certificate", + "description": "BIG-IP AS3 pointer to Certificate declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Certificate" + } + }, + "required": [ + "class" + ] + } + } + }, + "proxyCertificate": { + "title": "Proxy Certificate", + "description": "BIG-IP AS3 pointer to Certificate declaration for SSL forward proxy", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Certificate" + } + }, + "required": [ + "class" + ] + } + } + } + }, + "additionalProperties": false, + "required": [ + "certificate" + ] + }, + "minItems": 1, + "$comment": "uniqueItems: true" + }, + "ciphers": { + "title": "Ciphers", + "description": "Ciphersuite selection string. ciphers and cipherGroup are mutually exclusive, only use one.", + "type": "string" + }, + "cipherGroup": { + "description": "Pointer to a cipherGroup. cipherGroup and ciphers are mutually exclusive, only use one.", + "$ref": "#/definitions/Pointer_Cipher_Group" + }, + "authenticationMode": { + "title": "Authentication mode", + "description": "Client certificate authentication mode", + "type": "string", + "enum": [ + "ignore", + "request", + "require" + ], + "default": "ignore" + }, + "authenticationFrequency": { + "title": "Authentication frequency", + "description": "Client certificate authentication frequency", + "type": "string", + "enum": [ + "one-time", + "every-time" + ], + "default": "one-time" + }, + "authenticationTrustCA": { + "title": "Authentication trust CA", + "description": "BIG-IP AS3 pointer to declaration of CA Bundle used to validate client certificates", + "if": { + "type": "string" + }, + "then": { + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "CA_Bundle" + } + }, + "required": [ + "class" + ] + } + } + }, + "else": { + "type": "object", + "properties": { + "bigip": { + "title": "BIG-IP CA bundle", + "description": "Pathname of existing BIG-IP CA bundle", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "required": [ + "bigip" + ], + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys file ssl-cert" + ] + } + } + }, + "authenticationInviteCA": { + "title": "Authentication invite CA", + "description": "BIG-IP AS3 pointer to declaration of CA Bundle used to invite client certificates", + "if": { + "type": "string" + }, + "then": { + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "CA_Bundle" + } + }, + "required": [ + "class" + ] + } + } + }, + "else": { + "type": "object", + "properties": { + "bigip": { + "title": "BIG-IP CA bundle", + "description": "Pathname of existing BIG-IP CA bundle", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "required": [ + "bigip" + ], + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys file ssl-cert" + ] + } + } + }, + "crlFile": { + "title": "Certificate Revocation List (CRL) File", + "description": "Specifies the name of a file containing a list of revoked client certificates", + "allOf": [ + { + "$ref": "#/definitions/Pointer_SSL_CRL_File" + } + ] + }, + "allowExpiredCRL": { + "title": "Allow Expired CRL", + "description": "Specifies if the CRL can be used even if it has expired", + "type": "boolean", + "default": false + }, + "cacheCertificateEnabled": { + "title": "Cache Certificate Enabled", + "description": "Enables or disables (default) caching certificates by IP address and port number", + "type": "boolean", + "default": false + }, + "c3dOCSPUnknownStatusAction": { + "title": "C3D OCSP Unknown Status Action", + "description": "Specifies the BIG-IP action when the OCSP returns unknown status. The default is drop", + "type": "string", + "enum": [ + "drop", + "ignore" + ], + "default": "drop" + }, + "c3dOCSP": { + "title": "C3D OCSP", + "description": "Specifies SSL Client Certificate Constrained Delegation (C3D) OCSP object that the BIG-IP SSL should use to connect to the OCSP responder and check the client certificate status", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Certificate_Validator_OCSP" + } + ] + }, + "c3dEnabled": { + "title": "C3D Delegation Enabled", + "description": "Enables or disables SSL Client Certificate Constrained Delegation (C3D). The default is false", + "type": "boolean", + "default": false + }, + "forwardProxyEnabled": { + "title": "Forward Proxy Enabled", + "description": "Enables or disables (default) SSL forward proxy", + "type": "boolean", + "default": false + }, + "forwardProxyBypassEnabled": { + "title": "Forward Proxy Bypass Enabled", + "description": "Enables or disables (default) SSL forward proxy bypass", + "type": "boolean", + "default": false + }, + "forwardProxyBypassAllowlist": { + "title": "Forward Proxy Bypass Allowlist", + "description": "Specifies the data group name of hostname allowlist when both SSL forwardProxyEnabled & forwardProxyBypassEnabled features are set to true.", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Data_Group" + } + ] + }, + "ldapStartTLS": { + "title": "Client-LDAP Profile", + "description": "Creates a client LDAP profile with the specified activation mode STARTTLS.", + "type": "string", + "enum": [ + "none", + "allow", + "require" + ] + }, + "smtpsStartTLS": { + "title": "Simple Mail Transfer Protocol Security (SMTPS) profile", + "description": "Creates a SMTPS profile with the specified activation mode STARTTTLS. Because HTTP profile is not compatible with SMTPS use with Service_TCP instead of Service_HTTPS. Also incompatible with ldapStartTLS. Use only one of the two.", + "type": "string", + "enum": [ + "none", + "allow", + "require" + ] + }, + "staplerOCSPEnabled": { + "description": "Specifies whether to enable OCSP stapling", + "type": "boolean", + "default": false + }, + "insertEmptyFragmentsEnabled": { + "title": "Insert Empty Fragments Enabled", + "description": "Enables a countermeasure against an SSL 3.0/TLS 1.0 protocol vulnerability affecting CBC ciphers. These ciphers cannot be handled by certain broken SSL implementations.", + "type": "boolean", + "default": false + }, + "singleUseDhEnabled": { + "title": "Single Use DH Enabled", + "description": "Creates a new key when using temporary/ephemeral DH parameters. This option must be used to prevent small subgroup attacks, when the DH parameters were not generated using strong primes (for example. when using DSA-parameters). If strong primes were used, it is not strictly necessary to generate a new DH key during each handshake, but F5 Networks recommends it. Enable the Single DH Use option whenever temporary or ephemeral DH parameters are used.", + "type": "boolean", + "default": false + }, + "tls1_3Enabled": { + "title": "TLS 1.3", + "description": "Allow TLS 1.3 Protocol. Note: tls1_3Enabled is only supported in tmos version 14.0+.", + "type": "boolean", + "default": false + }, + "tls1_2Enabled": { + "title": "TLS 1.2", + "description": "Allow TLS 1.2 Protocol.", + "type": "boolean", + "default": true + }, + "tls1_1Enabled": { + "title": "TLS 1.1", + "description": "Allow TLS 1.1 Protocol.", + "type": "boolean", + "default": true + }, + "tls1_0Enabled": { + "title": "TLS 1.0", + "description": "Allow TLS 1.0 Protocol.", + "type": "boolean", + "default": true + }, + "renegotiationEnabled": { + "title": "Renegotiation", + "description": "Controls on a per-connection basis how the system responds to mid-stream SSL reconnection requests.", + "type": "boolean", + "default": true + }, + "retainCertificateEnabled": { + "title": "Retain Certificate", + "description": "When enabled, server certificate is retained in SSL session.", + "type": "boolean", + "default": true + }, + "namingScheme": { + "description": "Scheme to use when naming generated tmsh configuration", + "type": "string", + "enum": [ + "numbered", + "certificate" + ], + "default": "numbered" + }, + "sslEnabled": { + "title": "SSL", + "description": "Allow SSL protocol", + "type": "boolean", + "default": true + }, + "ssl3Enabled": { + "title": "SSL v3", + "description": "Allow SSL v3 protocol", + "type": "boolean", + "default": true + }, + "proxySslEnabled": { + "title": "Proxy SSL Enabled", + "description": "When enabled, further modification of application traffic within an SSL tunnel is allowed while still allowing the server to perform necessary authorization, authentication, and auditing steps. Requires a corresponding TLS_Client with this enabled to perform transparent SSL decryption.", + "type": "boolean", + "default": false + }, + "proxySslPassthroughEnabled": { + "title": "Proxy SSL Passthrough Enabled", + "description": "When enabled, it allows Proxy SSL to passthrough the traffic when ciphersuite negotiated between the client and server is not supported. Requires a corresponding TLS_Client with this enabled to perform transparent SSL decryption.", + "type": "boolean", + "default": false + }, + "secureRenegotiation": { + "title": "Secure Renegotiation", + "description": "Specifies the secure renegotiation mode. When set to require, any client attempting to renegotiate that does not support secure renegotiation will have its connection aborted. When set to require-strict, any client attempting to connect that does not support secure renegotiation will have its initial handshake denied. When set to request, unpatched clients will be permitted to renegotiate. Setting to request is not recommended as it is subject to active man-in-the-middle attacks.", + "type": "string", + "enum": [ + "request", + "require", + "require-strict" + ], + "default": "require" + }, + "uncleanShutdownEnabled": { + "title": "Unclean Shutdown Enabled", + "description": "When enabled, the profile performs unclean shutdowns of all SSL connections, which means the underlying TCP connections are closed without exchanging the required SSL shutdown alerts.", + "type": "boolean", + "default": true + }, + "dtlsEnabled": { + "title": "DTLS Enabled", + "description": "Allows the DTLS protocol.", + "type": "boolean", + "default": true + }, + "dtls1_2Enabled": { + "title": "DTLS1.2 Enabled", + "description": "Allows the DTLS 1.2 protocol.", + "type": "boolean", + "default": true + }, + "certificateExtensions": { + "title": "Certificate Extensions", + "description": "Specifies the extensions of the web server certificates to be included in the generated certificates using SSL Forward Proxy.", + "type": "array", + "items": { + "type": "string", + "enum": [ + "authority-key-identifier", + "basic-constraints", + "certificate-policies", + "crl-distribution-points", + "extended-key-usage", + "fresh-crl", + "issuer-alternative-name", + "key-usage", + "subject-alternative-name", + "subject-directory-attribute", + "subject-key-identifier" + ] + } + }, + "nonSslConnectionsEnabled": { + "title": "Allow Non-SSL Connections", + "description": "Specifies if non-SSL connections are allowed.", + "type": "boolean", + "default": false + }, + "allowDynamicRecordSizing": { + "title": "Allow Dynamic Record Sizing", + "description": "Enables or disables dynamic application record sizing.", + "type": "boolean", + "default": false + }, + "dataZeroRoundTripTime": { + "title": "Data Zero Round Trip Time", + "description": "Specifies if TLSv1.3 should accept 0-RTT with early data, with or without anti-replay. To protect against packet replay, F5 recommends that you enable anti-replay. The default value is disabled, which means TLSv1.3 will discard any early data.", + "type": "string", + "enum": [ + "disabled", + "enabled-with-anti-replay", + "enabled-no-anti-replay" + ], + "default": "disabled" + }, + "renegotiateMaxRecordDelay": { + "title": "Renegotiate Max Record Delay", + "description": "Specifies the maximum number of SSL records that the traffic management system can receive before it renegotiates an SSL session. After the system receives this number of SSL records, it closes the connection. This setting applies to client profiles only.", + "oneOf": [ + { + "type": "integer", + "minimum": 0, + "maximum": 4294967295 + }, + { + "type": "string", + "const": "indefinite" + } + ], + "default": "indefinite" + }, + "renegotiatePeriod": { + "title": "Renegotiate Period", + "description": "Specifies the number of seconds required to renegotiate an SSL session.", + "oneOf": [ + { + "type": "integer", + "minimum": 0, + "maximum": 4294967295 + }, + { + "type": "string", + "const": "indefinite" + } + ], + "default": "indefinite" + }, + "renegotiateSize": { + "title": "Renegotiate Size", + "description": "Specifies the size of the application data, in megabytes, that is transmitted over the secure channel. If the size of the data is higher than this value, the traffic management system must renegotiate the SSL session.", + "oneOf": [ + { + "type": "integer", + "minimum": 0, + "maximum": 4294967295 + }, + { + "type": "string", + "const": "indefinite" + } + ], + "default": "indefinite" + } + }, + "additionalProperties": false, + "dependencies": { + "forwardProxyBypassAllowlist": { + "properties": { + "forwardProxyEnabled": { + "const": true + }, + "forwardProxyBypassEnabled": { + "const": true + } + } + }, + "smtpsStartTLS": { + "not": { + "required": [ + "ldapStartTLS" + ] + } + } + }, + "allOf": [ + { + "if": { + "properties": { + "c3dEnabled": { + "const": true + } + }, + "required": [ + "c3dEnabled" + ] + }, + "then": { + "properties": { + "authenticationMode": { + "enum": [ + "request", + "require" + ] + } + } + } + }, + { + "if": { + "properties": { + "authenticationMode": { + "enum": [ + "request", + "require" + ] + } + }, + "required": [ + "authenticationMode" + ] + }, + "then": { + "required": [ + "authenticationTrustCA" + ] + } + }, + { + "if": { + "required": [ + "ciphers" + ] + }, + "then": { + "not": { + "required": [ + "cipherGroup" + ] + } + } + }, + { + "if": { + "not": { + "required": [ + "ciphers", + "cipherGroup" + ] + } + }, + "then": { + "properties": { + "ciphers": { + "default": "DEFAULT" + } + } + } + } + ], + "required": [ + "class", + "certificates" + ] + }, + "TLS_Client": { + "title": "TLS_Client", + "description": "TLS client parameters (connections leaving ADC)", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "TLS_Client" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "sendSNI": { + "title": "Send SNI", + "description": "FQDN to send in SNI (optional)", + "type": "string", + "format": "hostname", + "default": "none" + }, + "sniDefault": { + "title": "Default SNI", + "description": "When true, this profile is the default SSL profile when a client connection does not specify a known server name, or does not specify any server name at all. The default value is false", + "type": "boolean", + "default": false + }, + "requireSNI": { + "title": "Require SNI", + "description": "When a client sends no or unknown SNI and Require SNI is false (default), the system uses the primary certificate, otherwise the system rejects the client", + "type": "boolean", + "default": false + }, + "alertTimeout": { + "title": "Alert Timeout", + "description": "Specifies the duration of time, in seconds, for the system to try to close an SSL connection before resetting the connection. The default is 'indefinite'. You can also specify 'immediate', or an integer.", + "oneOf": [ + { + "type": "integer", + "maximum": 4294967294, + "minimum": 1 + }, + { + "type": "string", + "enum": [ + "immediate", + "indefinite" + ] + } + ], + "default": "indefinite" + }, + "cacheTimeout": { + "title": "Cache Timeout", + "description": "Sets the cache timeout (in seconds)", + "type": "integer", + "maximum": 86400, + "minimum": 0, + "default": 3600 + }, + "ciphers": { + "title": "Ciphers", + "description": "Ciphersuite selection string. ciphers and cipherGroup are mutually exclusive, only use one.", + "type": "string" + }, + "cipherGroup": { + "description": "Pointer to a cipherGroup. cipherGroup and ciphers are mutually exclusive, only use one.", + "$ref": "#/definitions/Pointer_Cipher_Group" + }, + "authenticationFrequency": { + "title": "Authentication frequency", + "description": "Client certificate authentication frequency", + "type": "string", + "enum": [ + "one-time", + "every-time" + ], + "default": "one-time" + }, + "serverName": { + "title": "Server name", + "description": "FQDN which server certificate must match (optional)", + "type": "string", + "format": "hostname", + "default": "none" + }, + "validateCertificate": { + "title": "Validate certificate", + "description": "If false (default) accept any cert from server, else validate server cert against trusted CA bundle", + "type": "boolean", + "default": false + }, + "trustCA": { + "title": "Trusted CA bundle", + "description": "CA's trusted to validate server certificate; 'generic' (default) or else BIG-IP AS3 pointer to declaration of CA Bundle", + "if": { + "not": { + "type": "object" + } + }, + "then": { + "type": "string", + "enum": [ + "generic", + "none" + ], + "default": "generic" + }, + "else": { + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to declaration of CA bundle", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "CA_Bundle" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP CA bundle", + "description": "Pathname of existing BIG-IP CA bundle", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys file ssl-cert" + ] + } + } + }, + "ignoreExpired": { + "title": "Ignored expired", + "description": "If false (default) drop connections with expired server certificates", + "type": "boolean", + "default": false + }, + "ignoreUntrusted": { + "title": "Ignored untrusted", + "description": "If false (default) drop connections with untrusted server certificates", + "type": "boolean", + "default": false + }, + "sessionTickets": { + "title": "Session tickets", + "description": "If false (default) do not use rfc5077 session tickets", + "type": "boolean", + "default": false + }, + "clientCertificate": { + "title": "Client certificate", + "description": "BIG-IP AS3 pointer to client Certificate declaration (optional)", + "type": "string", + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Certificate" + } + }, + "required": [ + "class" + ] + } + } + }, + "crlFile": { + "title": "Certificate Revocation List (CRL) File", + "description": "Specifies the name of a file containing a list of revoked client certificates", + "allOf": [ + { + "$ref": "#/definitions/Pointer_SSL_CRL_File" + } + ] + }, + "allowExpiredCRL": { + "title": "Allow Expired CRL", + "description": "Specifies if the CRL can be used even if it has expired", + "type": "boolean", + "default": false + }, + "c3dCertificateAuthority": { + "title": "C3D Certificate Authority", + "description": "Pointer to a Certificate class which specifies the Certificate Authority values for C3D", + "type": "string", + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Certificate" + } + }, + "required": [ + "class" + ] + } + } + }, + "c3dCertificateExtensions": { + "title": "C3D Certificate Extensions", + "description": "Specifies the custom extension OID of the client certificates to be included in the generated certificates using SSL C3D", + "type": "array", + "items": { + "type": "string", + "enum": [ + "basic-constraints", + "extended-key-usage", + "key-usage", + "subject-alternative-name" + ] + }, + "default": [ + "basic-constraints", + "extended-key-usage", + "key-usage", + "subject-alternative-name" + ] + }, + "c3dCertificateLifespan": { + "title": "C3D Certificate Lifespan", + "description": "Specifies the lifespan of the certificate generated using the SSL client certificate constrained delegation", + "type": "integer", + "maximum": 8760, + "minimum": 0, + "default": 24 + }, + "c3dEnabled": { + "title": "C3D Enabled", + "description": "Enables or disables SSL Client certificate constrained delegation (C3D). Using C3D eliminates the need for requiring users to provide credentials twice for certain authentication actions", + "type": "boolean", + "default": false + }, + "forwardProxyEnabled": { + "title": "Forward Proxy Enabled", + "description": "Enables or disables (default) SSL forward proxy", + "type": "boolean", + "default": false + }, + "forwardProxyBypassEnabled": { + "title": "Forward Proxy Bypass Enabled", + "description": "Enables or disables (default) SSL forward proxy bypass", + "type": "boolean", + "default": false + }, + "ldapStartTLS": { + "title": "Server-LDAP Profile", + "description": "Creates a client LDAP profile with the specified activation mode STARTTLS.", + "type": "string", + "enum": [ + "none", + "allow", + "require" + ] + }, + "insertEmptyFragmentsEnabled": { + "title": "Insert Empty Fragments Enabled", + "description": "Enables a countermeasure against an SSL 3.0/TLS 1.0 protocol vulnerability affecting CBC ciphers. These ciphers cannot be handled by certain broken SSL implementations.", + "type": "boolean", + "default": false + }, + "singleUseDhEnabled": { + "title": "Single Use DH Enabled", + "description": "Creates a new key when using temporary/ephemeral DH parameters. This option must be used to prevent small subgroup attacks, when the DH parameters were not generated using strong primes (for example. when using DSA-parameters). If strong primes were used, it is not strictly necessary to generate a new DH key during each handshake, but F5 Networks recommends it. Enable the Single DH Use option whenever temporary or ephemeral DH parameters are used.", + "type": "boolean", + "default": false + }, + "tls1_3Enabled": { + "title": "TLS 1.3", + "description": "Allow TLS 1.3 Ciphers. Note: tls1_3Enabled is only supported in tmos version 14.0+.", + "type": "boolean", + "default": false + }, + "tls1_2Enabled": { + "title": "TLS 1.2", + "description": "Allow TLS 1.2 Ciphers.", + "type": "boolean", + "default": true + }, + "tls1_1Enabled": { + "title": "TLS 1.1", + "description": "Allow TLS 1.1 Ciphers.", + "type": "boolean", + "default": true + }, + "tls1_0Enabled": { + "title": "TLS 1.0", + "description": "Allow TLS 1.0 Ciphers.", + "type": "boolean", + "default": true + }, + "renegotiationEnabled": { + "title": "Renegotiation", + "description": "Controls on a per-connection basis how the system responds to mid-stream SSL reconnection requests.", + "type": "boolean", + "default": true + }, + "retainCertificateEnabled": { + "title": "Retain Certificate", + "description": "When enabled, server certificate is retained in SSL session.", + "type": "boolean", + "default": true + }, + "sslEnabled": { + "title": "SSL", + "description": "Allow SSL protocol", + "type": "boolean", + "default": true + }, + "ssl3Enabled": { + "title": "SSL v3", + "description": "Allow SSL v3 protocol", + "type": "boolean", + "default": true + }, + "proxySslEnabled": { + "title": "Proxy SSL Enabled", + "description": "When enabled, further modification of application traffic within an SSL tunnel is allowed while still allowing the server to perform necessary authorization, authentication, and auditing steps. Requires a corresponding TLS_Server with this enabled to perform transparent SSL decryption.", + "type": "boolean", + "default": false + }, + "proxySslPassthroughEnabled": { + "title": "Proxy SSL Passthrough Enabled", + "description": "When enabled, it allows Proxy SSL to passthrough the traffic when ciphersuite negotiated between the client and server is not supported. Requires a corresponding TLS_Server with this enabled to perform transparent SSL decryption.", + "type": "boolean", + "default": false + }, + "secureRenegotiation": { + "title": "Secure Renegotiation", + "description": "Specifies the secure renegotiation mode. When set to require, any connection to an unpatched server will be aborted. For TLS_Client, require and require-strict are the same. When set to request, connections to unpatched servers will be permitted. Setting to request is not recommended as it is subject to active man-in-the-middle attacks.", + "type": "string", + "enum": [ + "request", + "require", + "require-strict" + ], + "default": "require-strict" + }, + "uncleanShutdownEnabled": { + "title": "Unclean Shutdown Enabled", + "description": "When enabled, the profile performs unclean shutdowns of all SSL connections, which means the underlying TCP connections are closed without exchanging the required SSL shutdown alerts.", + "type": "boolean", + "default": true + }, + "dtlsEnabled": { + "title": "DTLS Enabled", + "description": "Allows the DTLS protocol.", + "type": "boolean", + "default": true + }, + "dtls1_2Enabled": { + "title": "DTLS1.2 Enabled", + "description": "Allows the DTLS 1.2 protocol.", + "type": "boolean", + "default": true + }, + "dataZeroRoundTripTime": { + "title": "Data Zero Round Trip Time", + "description": "Specifies if TLSv1.3 should send 0-RTT early data when available.", + "type": "boolean", + "default": false + }, + "renegotiatePeriod": { + "title": "Renegotiate Period", + "description": "Specifies the number of seconds from the initial connect time after which the system renegotiates an SSL session. The default value is indefinite, which means that you do not want the system to renegotiate SSL sessions.", + "oneOf": [ + { + "type": "integer", + "minimum": 0, + "maximum": 4294967295 + }, + { + "type": "string", + "const": "indefinite" + } + ], + "default": "indefinite" + }, + "renegotiateSize": { + "title": "Renegotiate Size", + "description": "Specifies a throughput size, in megabytes, of SSL renegotiation. This option forces the traffic management system to renegotiate an SSL session based on the size, in megabytes, of application data that is transmitted over the secure channel. The default value is indefinite, which specifies that you do not want a throughput size.", + "oneOf": [ + { + "type": "integer", + "minimum": 0, + "maximum": 4294967295 + }, + { + "type": "string", + "const": "indefinite" + } + ], + "default": "indefinite" + } + }, + "allOf": [ + { + "if": { + "required": [ + "ciphers" + ] + }, + "then": { + "not": { + "required": [ + "cipherGroup" + ] + } + } + }, + { + "if": { + "not": { + "required": [ + "ciphers", + "cipherGroup" + ] + } + }, + "then": { + "properties": { + "ciphers": { + "default": "DEFAULT" + } + } + } + } + ], + "additionalProperties": false, + "required": [ + "class" + ] + }, + "Sender_Tag_Mapping": { + "title": "Sender and Tag Data Group Mapping", + "description": "Establishes a mapping between a sender value and data group containing tag substitution values", + "type": "object", + "properties": { + "senderId": { + "title": "Sender ID", + "description": "Specifies sender ID value", + "type": "string" + }, + "tagDataGroup": { + "description": "Specifies tag substitution data group", + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to data group if any (declared separately)", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Data_Group" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP data group", + "description": "Pathname of existing BIG-IP data group", + "type": "string", + "format": "f5bigip" + } + }, + "dependencies": { + "bigip": { + "properties": { + "isExternal": { + "title": "External data group", + "description": "Toggles whether existing data group is internal or external", + "type": "boolean", + "default": false + } + } + } + }, + "if": { + "properties": { + "isExternal": { + "const": true + } + } + }, + "then": { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm data-group external" + ] + } + }, + "else": { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm data-group internal" + ] + } + }, + "minProperties": 1, + "maxProperties": 2 + } + }, + "additionalProperties": false, + "required": [ + "senderId", + "tagDataGroup" + ] + }, + "FIX_Profile": { + "title": "FIX_Profile", + "type": "object", + "description": "Configures a Financial Information eXchange Protocol (FIX) profile", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "FIX_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "parentProfile": { + "description": "Specifies the name of the profile object to inherit the settings from", + "allOf": [ + { + "$ref": "#/definitions/Pointer_FIX_Profile" + } + ], + "default": { + "bigip": "/Common/fix" + } + }, + "errorAction": { + "title": "Error Action", + "description": "Specifies the error handling method", + "type": "string", + "enum": [ + "dont-forward", + "drop-connection" + ], + "default": "dont-forward" + }, + "fullLogonParsingEnabled": { + "title": " Fully Parse Logon Message", + "description": "Enables or disables logon message as always fully parsed. Other messages are parsed according to the configuration of Quick Parsing", + "type": "boolean", + "default": true + }, + "messageLogPublisher": { + "title": "Message Log Publisher", + "description": "Specifies the publisher for message logging", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Log_Publisher" + } + ] + }, + "reportLogPublisher": { + "description": "Specifies the publisher for error messages and status reports", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Log_Publisher" + } + ] + }, + "quickParsingEnabled": { + "title": "Quick Parsing", + "description": "Enables or disables quick parsing which parses the basic standard fields and validates message length and checksum", + "type": "boolean", + "default": false + }, + "responseParsingEnabled": { + "title": "Response Parsing", + "description": "Enables or disables response parsing which parses the messages from the FIX server. Applies the same parser configuration and error handling at server side as at client side. If not enabled, server side messages are directly passed through", + "type": "boolean", + "default": false + }, + "statisticsSampleInterval": { + "title": "Statistics Sample Interval", + "description": "Specifies the sample interval of the message rate in seconds", + "type": "integer", + "default": 20, + "minimum": 10, + "maximum": 4294967295 + }, + "senderTagMappingList": { + "title": "Sender and Tag Substitution Mapping", + "description": "Specifies the mappings between sender ID and tag substitution data group.", + "type": "array", + "items": { + "$ref": "#/definitions/Sender_Tag_Mapping" + } + } + }, + "additionalProperties": false, + "required": [ + "class" + ] + }, + "RTSP_Profile": { + "title": "RTSP_Profile", + "type": "object", + "description": "Real Time Streaming Protocol Profile", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "RTSP_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "idleTimeout": { + "title": "Idle Timeout", + "description": "The number of seconds that a Real-time Transport Protocol (RTP) connection is idle before the connection is eligible for deletion", + "if": { + "type": "integer" + }, + "then": { + "type": "integer", + "minimum": 0, + "maximum": 4294967295 + }, + "else": { + "type": "string", + "enum": [ + "indefinite", + "immediate" + ] + }, + "default": 300 + }, + "maxHeaderSize": { + "title": "Maximum Header Size", + "description": "The largest RTSP request or response header, in bytes, that the RTSP filter accepts before dropping the connection", + "type": "integer", + "default": 4096, + "minimum": 0, + "maximum": 4294967295 + }, + "maxQueuedData": { + "title": "Maximum Queued Data", + "description": "The maximum amount of data, in bytes, that the RTSP filter buffers before dropping the connection", + "type": "integer", + "default": 32768, + "minimum": 0, + "maximum": 4294967295 + }, + "unicastRedirect": { + "title": "Unicast Redirect", + "description": "When enabled specifies that the client can select the destination port for the streamed data. The destination address for the data is the source of the request.", + "type": "boolean", + "default": false + }, + "multicastRedirect": { + "title": "Multicast Redirect", + "description": "When enabled, if you are using multicast streams, specifies that the client has permission to supply a different destination IP address for the streamed data", + "type": "boolean", + "default": false + }, + "sessionReconnect": { + "title": "Session Reconnect", + "description": "When enabled specifies that the system persists a resumed control connection to the correct server. Typical clients do not support this behavior.", + "type": "boolean", + "default": false + }, + "realHTTPPersistence": { + "title": "Real HTTP Persistence", + "description": "When enabled specifies that the system automatically persists Real Networks-tunneled RTSP data over HTTP, which is over the RTSP port. When disabled, a user can override the default behavior with an iRule.", + "type": "boolean", + "default": true + }, + "checkSource": { + "title": "Check Source", + "description": "When true the system uses the source attribute in the transport header to establish the target address of the RTP stream, and before the response is forwarded to the client, updates the value of the source attribute to be the virtual address of the BIG-IP system. When false the system does not change the source attribute.", + "type": "boolean", + "default": true + }, + "proxy": { + "title": "Proxy", + "description": "Specifies whether the RTSP profile is associated with an RTSP proxy configuration", + "type": "string", + "enum": [ + "external", + "internal", + "none" + ], + "default": "none" + }, + "proxyHeader": { + "title": "Proxy Header", + "description": "When set, specifies the name of the header in the RTSP proxy configuration that is passed from the client-side virtual server to the server-side virtual server. Note that the name of the header must begin with X-. To use the proxyHeader option, you must specify a value for the proxy option. Note that the system removes this header from the request prior to sending the request to the server for processing.", + "type": "string" + }, + "RTPPort": { + "title": "RTP Port", + "description": "The number of the port to use for the RTP service", + "type": "integer", + "default": 0, + "minimum": 0, + "maximum": 65535 + }, + "RTCPPort": { + "title": "RTCP Port", + "description": "The number of the port to use for the Real Time Control Protocol (RTCP) service. RTCP allows monitoring of real-time data delivery.", + "type": "integer", + "default": 0, + "minimum": 0, + "maximum": 65535 + }, + "algLogProfile": { + "description": "ALG log profile pointer", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "cgnat" + ] + } + }, + { + "$ref": "#/definitions/Pointer_ALG_Log_Profile" + } + ] + }, + "logPublisher": { + "description": "Log publisher pointer", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "cgnat" + ] + } + }, + { + "$ref": "#/definitions/Pointer_Log_Publisher" + } + ] + } + }, + "additionalProperties": false, + "required": [ + "class" + ], + "dependencies": { + "algLogProfile": { + "required": [ + "logPublisher" + ] + }, + "logPublisher": { + "required": [ + "algLogProfile" + ] + } + } + }, + "SIP_Profile": { + "title": "SIP_Profile", + "type": "object", + "description": "Configures a profile you can use to manage Session Initiation Protocol (SIP) traffic.", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "SIP_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + } + }, + "additionalProperties": false, + "required": [ + "class" + ] + }, + "Statistics_Profile": { + "title": "Statistics Profile", + "type": "object", + "description": "User-defined statistics fields. This object assigns field names for up to 32 fields. You can then use these field names from an iRule to record values.", + "patternProperties": { + "^field(3[0-2]|[1-2][0-9]|[1-9])$": { + "title": "Field Name", + "description": "This regular expression represents 32 field properties named 'field1' through 'field32'.", + "type": "string" + } + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Statistics_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + } + }, + "additionalProperties": false, + "required": [ + "class" + ] + }, + "TFTP_Profile": { + "title": "TFTP_Profile", + "type": "object", + "description": "Trivial File Transer Protocol (TFTP) profile", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "TFTP_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "idleTimeout": { + "description": "Specifies an idle timeout in seconds. This setting specifies the number of seconds that a connection is idle before the connection is eligible for deletion.", + "if": { + "type": "integer" + }, + "then": { + "type": "integer", + "minimum": 0, + "maximum": 4294967295 + }, + "else": { + "type": "string", + "const": "indefinite" + }, + "default": 30 + }, + "algLogProfile": { + "description": "ALG log profile pointer", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "cgnat" + ] + } + }, + { + "$ref": "#/definitions/Pointer_ALG_Log_Profile" + } + ] + }, + "logPublisher": { + "description": "Log publisher pointer", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "cgnat" + ] + } + }, + { + "$ref": "#/definitions/Pointer_Log_Publisher" + } + ] + } + }, + "additionalProperties": false, + "required": [ + "class" + ], + "dependencies": { + "algLogProfile": { + "required": [ + "logPublisher" + ] + }, + "logPublisher": { + "required": [ + "algLogProfile" + ] + } + } + }, + "FTP_Profile": { + "title": "FTP_Profile", + "type": "object", + "description": "File Transfer Protocol (FTP) profile", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "FTP_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "port": { + "description": "Specifies a service for the data channel port used for this profile", + "type": "integer", + "default": 20, + "minimum": 0, + "maximum": 65535 + }, + "ftpsMode": { + "description": "Specifies the policy for explicit FTPS negotiation on FTP command channel", + "type": "string", + "enum": [ + "disallow", + "allow", + "require" + ], + "default": "disallow" + }, + "enforceTlsSessionReuseEnabled": { + "description": "Enforce data connection to reuse TLS session", + "type": "boolean", + "default": false, + "f5PostProcess": { + "tag": "minVersion", + "data": "14.0" + } + }, + "activeModeEnabled": { + "description": "Specifies if the profile should allow FTP active transfer mode", + "type": "boolean", + "default": true, + "f5PostProcess": { + "tag": "minVersion", + "data": "14.0" + } + }, + "securityEnabled": { + "description": "Specifies whether to enable or disable secure FTP traffic for the BIG-IP Application Security Manager", + "type": "boolean", + "default": false + }, + "translateExtendedEnabled": { + "description": "Specifies if the profile should automatically translate RFC2428 extended requests EPSV and EPRT to PASV and PORT when communicating with IPv4servers", + "type": "boolean", + "default": true + }, + "inheritParentProfileEnabled": { + "description": "Specifies if the FTP data channel should inherit the TCP profile used by the control channel", + "type": "boolean", + "default": false + }, + "algLogProfile": { + "description": "ALG log profile pointer", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "cgnat" + ] + } + }, + { + "$ref": "#/definitions/Pointer_ALG_Log_Profile" + } + ] + }, + "logPublisher": { + "description": "Log publisher pointer", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "cgnat" + ] + } + }, + { + "$ref": "#/definitions/Pointer_Log_Publisher" + } + ] + } + }, + "additionalProperties": false, + "required": [ + "class" + ], + "dependencies": { + "algLogProfile": { + "required": [ + "logPublisher" + ] + }, + "logPublisher": { + "required": [ + "algLogProfile" + ] + } + } + }, + "HTML_Rule": { + "title": "HTML_Rule", + "type": "object", + "description": "HTML Rule with configurable options", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "HTML_Rule" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "ruleType": { + "title": "Rule type", + "description": "Type of rule", + "type": "string", + "enum": [ + "comment-raise-event", + "comment-remove", + "tag-append-html", + "tag-prepend-html", + "tag-raise-event", + "tag-remove", + "tag-remove-attribute" + ] + } + }, + "allOf": [ + { + "if": { + "properties": { + "ruleType": { + "const": "tag-append-html" + } + } + }, + "then": { + "$ref": "#/definitions/HTML_Rule_TagAppendHTML" + } + }, + { + "if": { + "properties": { + "ruleType": { + "const": "tag-prepend-html" + } + } + }, + "then": { + "$ref": "#/definitions/HTML_Rule_TagPrependHTML" + } + }, + { + "if": { + "properties": { + "ruleType": { + "const": "tag-raise-event" + } + } + }, + "then": { + "$ref": "#/definitions/HTML_Rule_TagRaiseEvent" + } + }, + { + "if": { + "properties": { + "ruleType": { + "const": "tag-remove" + } + } + }, + "then": { + "$ref": "#/definitions/HTML_Rule_TagRemove" + } + }, + { + "if": { + "properties": { + "ruleType": { + "const": "tag-remove-attribute" + } + } + }, + "then": { + "$ref": "#/definitions/HTML_Rule_TagRemoveAttribute" + } + } + ], + "required": [ + "class", + "ruleType" + ] + }, + "HTML_Rule_Match_Attribute_Optional": { + "title": "HTML_Rule_Match_Attribute_Optional", + "description": "Matches on the specified tag name, attribute name, and attribute value. Attribute name and value are optional.", + "type": "object", + "properties": { + "match": { + "title": "Match", + "description": "Properties the rule is to match", + "type": "object", + "properties": { + "attributeName": { + "title": "Attribute Name", + "description": "Name of attribute", + "type": "string" + }, + "attributeValue": { + "title": "Attribute Value", + "description": "Value of attribute", + "type": "string" + }, + "tagName": { + "title": "Tag Name", + "description": "Name of tag", + "type": "string" + } + }, + "dependencies": { + "attributeValue": { + "required": [ + "attributeName" + ] + } + }, + "required": [ + "tagName" + ] + } + }, + "required": [ + "match" + ] + }, + "HTML_Rule_Match_Attribute_Required": { + "title": "HTML_Rule_Match_Attribute_Required", + "description": "Matches on the specified tag name, attribute name, and attribute value. Attribute name and value are required.", + "type": "object", + "properties": { + "match": { + "title": "Match", + "description": "Properties the rule is to match", + "type": "object", + "properties": { + "attributeName": { + "title": "Attribute Name", + "description": "Name of attribute", + "type": "string" + }, + "attributeValue": { + "title": "Attribute Value", + "description": "Value of attribute", + "type": "string" + }, + "tagName": { + "title": "Tag Name", + "description": "Name of tag", + "type": "string" + } + }, + "required": [ + "tagName", + "attributeName", + "attributeValue" + ] + } + }, + "required": [ + "match" + ] + }, + "HTML_Rule_TagAppendHTML": { + "title": "Append HTML HTML_Rule", + "description": "Matches on the specified tag name and optional attribute name and attribute value, and then appends the specified HTML content to the tag delimiter.", + "type": "object", + "properties": { + "content": { + "title": "Content", + "description": "HTML content to append to tag delimiter", + "type": "string" + } + }, + "allOf": [ + { + "$ref": "#/definitions/HTML_Rule_Match_Attribute_Optional" + } + ], + "required": [ + "content" + ] + }, + "HTML_Rule_TagPrependHTML": { + "title": "HTML_Rule_TagPrependHTML", + "description": "Matches on the specified tag name and optional attribute name and attribute value, and then prepends the specified HTML content to the tag delimiter.", + "type": "object", + "properties": { + "content": { + "title": "Content", + "description": "HTML content to prepend to tag delimiter", + "type": "string" + } + }, + "allOf": [ + { + "$ref": "#/definitions/HTML_Rule_Match_Attribute_Optional" + } + ], + "required": [ + "content" + ] + }, + "HTML_Rule_TagRaiseEvent": { + "title": "HTML_Rule_TagRaiseEvent", + "description": "Matches on the specified tag name and optional attribute name and attribute value, and then raises an event.", + "type": "object", + "allOf": [ + { + "$ref": "#/definitions/HTML_Rule_Match_Attribute_Optional" + } + ] + }, + "HTML_Rule_TagRemove": { + "title": "HTML_Rule_TagRemove", + "description": "Matches on the specified tag name and optional attribute name and attribute value, and then removes the tag.", + "type": "object", + "allOf": [ + { + "$ref": "#/definitions/HTML_Rule_Match_Attribute_Optional" + } + ] + }, + "HTML_Rule_TagRemoveAttribute": { + "title": "Append HTML HTML_Rule", + "description": "Matches on the specified tag name, attribute name, and attribute value, and then removes a specified attribute. Tag name, attribute name, and value are required.", + "type": "object", + "properties": { + "attributeName": { + "title": "Attriute Name", + "description": "Name of the attribute to be removed", + "type": "string" + } + }, + "allOf": [ + { + "$ref": "#/definitions/HTML_Rule_Match_Attribute_Required" + } + ], + "required": [ + "attributeName" + ] + }, + "HTML_Profile": { + "title": "HTML_Profile", + "type": "object", + "description": "HTML profile with configurable options", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "HTML_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "contentDetectionEnabled": { + "title": "Content Detection Enabled", + "description": "Scans initial HTTP payload to look for HTML signatures and enables HTML profile if HTML-like patterns are detected", + "type": "boolean", + "default": false + }, + "contentSelection": { + "title": "Content Selection", + "description": "Matches content-type from response header against a list of the content-types and enables HTML profile if a match is found", + "type": "array", + "items": { + "title": "Content Type", + "type": "string" + }, + "default": [ + "text/html", + "text/xhtml" + ], + "uniqueItems": true + }, + "rules": { + "title": "HTML Rules", + "description": "HTML Rules followed by the profile", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_HTML_Rule" + } + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "WebSocket_Profile": { + "additionalProperties": false, + "allOf": [ + { + "if": { + "properties": { + "masking": { + "const": "preserve" + } + }, + "required": [ + "masking" + ] + }, + "then": { + "properties": { + "compressMode": { + "not": { + "const": "typed" + } + } + }, + "required": [ + "compressMode" + ] + } + } + ], + "description": "WebSocket profile with configurable options", + "properties": { + "class": { + "const": "WebSocket_Profile", + "title": "Class", + "type": "string" + }, + "compressMode": { + "default": "preserved", + "description": "Available when TMOS version is 16.1 or newer. Specifies the mode that controls what compression operations are performed. Setting 'masking' to 'preserve' and 'compressMode' to 'typed' will not be allowed because it results in an invalid configuration.", + "enum": [ + "preserved", + "typed" + ], + "title": "Compress Mode", + "type": "string" + }, + "compression": { + "default": true, + "description": "Available when TMOS version is 16.1 or newer and used when compressMode is 'typed'. Specifies whether compress will be negotiated with the endpoint.", + "title": "Compression", + "type": "boolean" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "masking": { + "default": "selective", + "description": "Specifies the masking operation for WebSocket frames", + "enum": [ + "preserve", + "unmask", + "remask", + "selective" + ], + "title": "Masking", + "type": "string" + }, + "maximumWindowSize": { + "default": 10, + "description": "Available when TMOS version is 16.1 or newer and used when compressMode is 'typed'. Specifies the maximum sliding window for compression negotiated with the endpoint.", + "maximum": 15, + "minimum": 8, + "title": "Maximum Window Size", + "type": "integer" + }, + "noDelay": { + "default": true, + "description": "Available when TMOS version is 16.1 or newer and used when compressMode is 'typed'. Specifies whether data should be buffered for efficient compression, or compressed without delay.", + "title": "No Delay", + "type": "boolean" + }, + "remark": { + "$ref": "#/definitions/Remark" + } + }, + "title": "WebSocket_Profile", + "type": "object" + }, + "Multiplex_Profile": { + "title": "Multiplex_Profile", + "type": "object", + "description": "Multiplex (OneConnect) profile with configurable options", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Multiplex_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "sourceMask": { + "title": "Source Address Mask", + "description": "Idle connection re-use applies to connections whose source address matches this mask", + "type": "string", + "format": "f5ip" + }, + "maxConnections": { + "title": "Maximum Connections", + "description": "Specifies the maximum number of connections that the system holds in the connection reuse pool.", + "type": "integer", + "minimum": 0, + "default": 10000 + }, + "maxConnectionAge": { + "title": "Maximum Connection Age", + "description": "Specifies the maximum age, in number of seconds, of a connection in the connection reuse pool.", + "type": "integer", + "minimum": 0, + "default": 86400 + }, + "maxConnectionReuse": { + "title": "Maximum Connection Reuse", + "description": "Specifies the maximum number of times that a server connection can be reused.", + "type": "integer", + "minimum": 0, + "default": 1000 + }, + "idleTimeoutOverride": { + "title": "Idle Timeout Override", + "description": "Specifies the number of seconds that a connection is idle before the connection flow is eligible for deletion.", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "connectionLimitEnforcement": { + "title": "Connection Limit Enforcement", + "description": "When the limit is 'none', simultaneous in-flight requests and responses over TCP connections to a pool member are counted toward the limit. When the limit is 'idle', idle connections will be dropped as the TCP connection limit is reached. When the limit is 'strict', idle connections will prevent new TCP connections from being made until they expire (not recommended).", + "type": "string", + "enum": [ + "none", + "idle", + "strict" + ], + "default": "none" + }, + "sharePools": { + "title": "Share Pools", + "description": "Indicates that TCP connections for the current pool may be shared among similar virtual servers using the same pool.", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false, + "required": [ + "class" + ] + }, + "SOCKS_Profile": { + "title": "SOCKS_Profile", + "description": "Configures a SOCKS (Socket Secure) profile", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "SOCKS_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "protocolVersions": { + "description": "Specifies the SOCKS protocol versions that are supported", + "type": "array", + "items": { + "type": "string", + "enum": [ + "socks4", + "socks4a", + "socks5" + ] + }, + "default": [ + "socks4", + "socks4a", + "socks5" + ], + "minItems": 1, + "uniqueItems": true + }, + "resolver": { + "title": "DNS resolver", + "description": "BIG-IP AS3 pointer to DNS resolver used to resolve hostnames in connect requests", + "type": "object", + "properties": { + "bigip": { + "title": "BIG-IP resolver", + "description": "Pathname of existing BIG-IP net DNS resolver", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "required": [ + "bigip" + ], + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query net dns-resolver" + ] + } + }, + "ipv6First": { + "title": "IPv6 first priority", + "description": "Specifies the relative order of IPv4 and IPv6 DNS resolutions for URIs. If false (default), then the system performs IPv4 lookup before IPv6.", + "type": "boolean", + "default": false + }, + "routeDomain": { + "description": "The route domain that will be used for outbound connect requests", + "oneOf": [ + { + "type": "integer", + "minimum": 0, + "maximum": 65534 + }, + { + "type": "string" + } + ], + "default": 0 + }, + "tunnelName": { + "title": "Tunnel name", + "description": "Name of tunnel used for outbound connect requests", + "type": "string", + "minLength": 1, + "maxLength": 63, + "default": "socks-tunnel", + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query net tunnels tunnel" + ] + } + }, + "defaultConnectAction": { + "title": "Default Connect Action", + "description": "Specifies the behavior of the proxy service for connect requests. If set to 'deny', connect requests will only be honored if there is another virtual server listening for the requested outbound connection. If set to 'allow' outbound connection will be made ragardless of other virtual servers.", + "type": "string", + "enum": [ + "deny", + "allow" + ], + "default": "deny" + } + }, + "additionalProperties": false, + "required": [ + "class", + "resolver" + ] + }, + "TCP_Profile": { + "title": "TCP_Profile", + "description": "Configures a Transmission Control Protocol (TCP) profile", + "type": "object", + "$comment": "Configures TCP settings. When deployed on BIG-IP, defaults match f5-tcp-progressive.", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "TCP_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "abc": { + "title": "Appropriate Byte Counting", + "description": "If true (default), BIG-IP AS3 adjusts the congestion window per rfc3465", + "type": "boolean", + "default": true + }, + "ackOnPush": { + "title": "ACK on PSH", + "description": "If true (default), the system immediately acknowledges segments with the PSH flag set", + "type": "boolean", + "default": true + }, + "autoProxyBufferSize": { + "title": "Automatic proxy-buffer size", + "description": "If true (default), BIG-IP AS3 adjusts the proxy buffer size automatically to optimize throughput", + "type": "boolean", + "default": true + }, + "autoReceiveWindowSize": { + "title": "Automatic receive-window size", + "description": "If true (default), BIG-IP AS3 adjusts the receive window size automatically to optimize throughput", + "type": "boolean", + "default": true + }, + "autoSendBufferSize": { + "title": "Automatic send-buffer size", + "description": "If true (default), BIG-IP AS3 adjusts the send buffer size automatically to optimize throughput", + "type": "boolean", + "default": true + }, + "closeWaitTimeout": { + "title": "Close-wait timeout", + "description": "Number of seconds (default 5) connection will remain in LAST-ACK state before exiting. Value -1 means indefinite, limited by maximum retransmission timeout", + "type": "integer", + "minimum": -1, + "maximum": 3600, + "default": 5 + }, + "congestionControl": { + "title": "Congestion-control algorithm", + "description": "Selects TCP congestion-control algorithm (default 'woodside'). The bbr option is available on BIGIP 14.1 and above.", + "type": "string", + "enum": [ + "bbr", + "cdg", + "chd", + "cubic", + "high-speed", + "illinois", + "new-reno", + "none", + "reno", + "scalable", + "vegas", + "westwood", + "woodside" + ], + "default": "woodside" + }, + "congestionMetricsCache": { + "title": "Congestion metrics cache", + "description": "If true (default), the system may cache congestion metrics to inform the congestion control algorithm", + "type": "boolean", + "default": true + }, + "congestionMetricsCacheTimeout": { + "title": "Congestion metrics cache timeout", + "description": "Number of seconds for which entries in the congestion metrics cache are valid (default 0 means use system default)", + "type": "integer", + "minimum": 0, + "maximum": 1000, + "default": 0 + }, + "deferredAccept": { + "title": "Deferred accept", + "description": "If true, ADC will defer allocating resources to a connection until some payload data has arrived from the client (default false). This may help minimize the impact of certain DoS attacks but adds undesirable latency under normal conditions. Note: 'deferredAccept' is incompatible with server-speaks-first application protocols", + "type": "boolean", + "default": false + }, + "delayedAcks": { + "title": "Delayed ACKs", + "description": "If true (default), the system may coalesce multiple adjacent ACK responses", + "type": "boolean", + "default": true + }, + "delayWindowControl": { + "title": "Delay-window control", + "description": "If true, BIG-IP AS3 uses queueing delay as well as packet loss to estimate congestion (default false)", + "type": "boolean", + "default": false + }, + "dsack": { + "title": "Use D-SACK", + "description": "If true, BIG-IP AS3 uses rfc2883 duplicate selective-acknowledgements extension (default false). Do not enable this option unless you are certain all peers support D-SACK", + "type": "boolean", + "default": false + }, + "earlyRetransmit": { + "title": "Early retransmit", + "description": "If true (default), BIG-IP AS3 uses rfc5827 Early Retransmit recovery", + "type": "boolean", + "default": true + }, + "ecn": { + "title": "Explicit congestion notification", + "description": "If true (default), BIG-IP AS3 may send explicit congestion notification (ECN) flags (CWR, ECE) to peers", + "type": "boolean", + "default": true + }, + "enhancedLossRecovery": { + "title": "Enhanced loss recovery", + "description": "If true (default), BIG-IP AS3 uses Selective ACK data to increase throughput", + "type": "boolean", + "default": true + }, + "fastOpen": { + "title": "Fast-open", + "description": "If true (default), the system can use the TCP Fast Open protocol extension to reduce latency by sending payload data with initial SYN", + "type": "boolean", + "default": true + }, + "fastOpenCookieExpiration": { + "title": "Fast-open cookie expiration", + "description": "Sets maximum lifetime in seconds (default 21600 = six hours) of TCP Fast Open cookies", + "type": "integer", + "minimum": 1, + "maximum": 1000000, + "default": 21600 + }, + "finWaitTimeout": { + "title": "FIN-WAIT timeout", + "description": "Number of seconds (default 5) connection will remain in FIN-WAIT-1 or closing state before exiting. Value -1 means indefinite, limited by maximum retransmission timeout", + "type": "integer", + "minimum": -1, + "maximum": 3600, + "default": 5 + }, + "finWait2Timeout": { + "title": "FIN-WAIT-2 timeout", + "description": "Number of seconds (default 300) connection will remain in LAST-ACK state before closing. Value -1 means indefinite, limited by maximum retransmission timeout", + "type": "integer", + "minimum": -1, + "maximum": 3600, + "default": 300 + }, + "idleTimeout": { + "title": "Idle timeout", + "description": "Number of seconds (default 300; may not be 0) connection may remain idle before it becomes eligible for deletion. Value -1 (not recommended) means infinite", + "type": "integer", + "anyOf": [ + { + "minimum": 1, + "maximum": 86400 + }, + { + "const": -1 + } + ], + "default": 300 + }, + "initCwnd": { + "title": "Initial congestion-window size", + "description": "Sets the initial congestion-window size (default 16) in multiples of MSS (not in octets)", + "type": "integer", + "minimum": 0, + "maximum": 64, + "default": 16 + }, + "initRwnd": { + "title": "Initial receive-window size", + "description": "Sets the initial receive-window size (default 16) in multiples of MSS (not in octets)", + "type": "integer", + "minimum": 0, + "maximum": 64, + "default": 16 + }, + "ipDfMode": { + "title": "IP DF mode", + "description": "Controls DF (Don't Fragment) flag in outgoing packets. Value 'pmtu' (default) sets DF based on IP PMTU value. Value 'preserve' copies DF from received packets. Value 'set' forces DF true in all outgoing packets. Value 'clear' forces DF false in all outgoing packets", + "type": "string", + "enum": [ + "clear", + "pmtu", + "preserve", + "set" + ], + "default": "pmtu" + }, + "ipTosToClient": { + "title": "IP DSCP (TOS) to client", + "description": "Specifies the IP DSCP/TOS value in packets sent to clients (default 0). Numeric values in this property are decimal representations of eight-bit numbers, of which the leftmost six bits are the DSCP per rfc2474 (and the system uses the rightmost two bits for congestion signaling when 'ecn' is true). You may have to calculate the value of this property by multiplying a DSCP code, such as CS5+EF = 46, by four to obtain the proper 'ipTosToClient' value, such as 184. Value 'pass-through' sets DSCP from the initial server-side value. Value 'mimic' copies DSCP from the most-recently received server-side packet (allowing DSCP to vary during the life of a connection)", + "oneOf": [ + { + "type": "integer", + "minimum": 0, + "maximum": 252, + "multipleOf": 4 + }, + { + "type": "string", + "enum": [ + "pass-through", + "mimic" + ] + } + ], + "default": 0 + }, + "keepAliveInterval": { + "title": "Keep-alive interval", + "description": "Number of seconds (default 1800) between keep-alive probes", + "type": "integer", + "minimum": 1, + "maximum": 86400, + "default": 1800 + }, + "limitedTransmit": { + "title": "Limited transmit recovery", + "description": "When true (default), the system can use rfc3042 limited transmit recovery scheme", + "type": "boolean", + "default": true + }, + "linkQosToClient": { + "title": "Link QOS to client", + "description": "Specifies the Layer-2 QOS code in packets sent to clients (default 0). Ethernet-type networks recognize codes from 0 to 7. Value 'pass-through' sets QOS from the initial server-side value", + "oneOf": [ + { + "type": "integer", + "minimum": 0, + "maximum": 7 + }, + { + "type": "string", + "const": "pass-through" + } + ], + "default": 0 + }, + "maxRetrans": { + "title": "Maximum segment retransmissions", + "description": "Sets maximum number of times the system may retransmit a segment (default 8)", + "type": "integer", + "minimum": 0, + "maximum": 12, + "default": 8 + }, + "maxSegmentSize": { + "title": "MSS", + "description": "Sets MSS advertised to peer. Value 0 (default) will set MSS automatically in proportion to interface MTU. Default 0 is usually the best choice", + "type": "integer", + "anyOf": [ + { + "minimum": 28, + "maximum": 8960 + }, + { + "const": 0 + } + ], + "default": 0 + }, + "md5Signature": { + "title": "MD5 signatures", + "description": "If true, the system signs TCP headers using MD5 per rfc2385 (default false)", + "type": "boolean", + "default": false + }, + "md5SignaturePassphrase": { + "title": "MD5 passphrase", + "description": "Passphrase from which the system derives the key for MD5 signatures (MACs) when 'md5signature' is true", + "type": "object", + "properties": { + "allowReuse": { + "description": "If true, other declaration objects may reuse this value", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Secret" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "object" + } + }, + { + "f5PostProcess": { + "tag": "secret" + } + } + ] + }, + "minimumRto": { + "title": "Minimum retransmission timeout", + "description": "Minimum retransmission timeout in milliseconds (default 1000)", + "type": "integer", + "minimum": 1, + "maximum": 5000, + "default": 1000 + }, + "mptcp": { + "title": "Multipath TCP (MPTCP)", + "description": "Value 'disable' (default) excludes use of Multipath TCP (MPTCP) through virtual server. Value 'enable' means virtual server will accept and participate in MPTCP connections. Value 'passthrough' means MPTCP packets may pass through virtual server", + "type": "string", + "enum": [ + "disable", + "enable", + "passthrough" + ], + "default": "disable" + }, + "mptcpCsum": { + "title": "MPTCP checksums", + "description": "If true, the system calculates MPTCP checksums (default false)", + "type": "boolean", + "default": false + }, + "mptcpCsumVerify": { + "title": "MPTCP checksum verify", + "description": "If true, the system verifies MPTCP checksums (default false)", + "type": "boolean", + "default": false + }, + "mptcpFallback": { + "title": "MPTCP fallback action", + "description": "Selects action on fallback from MPTCP to ordinary TCP", + "type": "string", + "enum": [ + "accept", + "active-accept", + "reset", + "retransmit" + ], + "default": "reset" + }, + "mptcpFastJoin": { + "title": "MPTCP fast join", + "description": "If true, the system may send data with MP_JOIN SYN packet, reducing connection latency (default false)", + "type": "boolean", + "default": false + }, + "mptcpIdleTimeout": { + "title": "Idle timeout", + "description": "Number of seconds (default 300) connection may remain idle before it becomes eligible for deletion", + "type": "integer", + "minimum": 1, + "maximum": 86400, + "default": 300 + }, + "mptcpJoinMax": { + "title": "MPTCP join maximum", + "description": "Limit on number of subflows which the system may add to the MPTCP connection (default 5)", + "type": "integer", + "minimum": 1, + "maximum": 20, + "default": 5 + }, + "mptcpMakeAfterBreak": { + "title": "MPTCP make-after-break", + "description": "If true, the system can add additional subflows during the 'mptcpTimeout' period, even if the ADC is not currently handling an active connection (default false)", + "type": "boolean", + "default": false + }, + "mptcpNoJoinDssAck": { + "title": "MPTCP fast join", + "description": "If true, no DSS option will sent with MP_JOIN ACK packet (default false)", + "type": "boolean", + "default": false + }, + "mptcpRtoMax": { + "title": "MPTCP RTO maximum", + "description": "Maximum number of retransmission timeouts which may occur before the system declares a subflow dead", + "type": "integer", + "minimum": 1, + "maximum": 20, + "default": 5 + }, + "mptcpRetransmitMin": { + "title": "MPTCP retransmit timer", + "description": "Minimum value in milliseconds (default 1000) of MPTCP retransmission timer", + "type": "integer", + "minimum": 1, + "maximum": 5000, + "default": 1000 + }, + "mptcpSubflowMax": { + "title": "MPTCP subflow maximum", + "description": "Maximum number of subflows per connection (default 6)", + "type": "integer", + "minimum": 1, + "maximum": 20, + "default": 6 + }, + "mptcpTimeout": { + "title": "MPTCP timeout", + "description": "Number of seconds (default 3600) after which the system may expunge an MPTCP session with no active flow", + "type": "integer", + "minimum": 60, + "maximum": 3600, + "default": 3600 + }, + "nagle": { + "title": "Nagle's algorithm", + "description": "Value 'enable' means to use Nagle's algorithm to minimize the transmission of short TCP segments (note: Nagle's algorithm yields undesirable results with many application protocols). Value 'auto' (default) means the ADC will choose automatically whether to enable Nagle's algorithm. Value 'disable' averts application of Nagle's algorithm", + "type": "string", + "enum": [ + "disable", + "enable", + "auto" + ], + "default": "auto" + }, + "pktLossIgnoreBurst": { + "title": "Packet loss ignore burst", + "description": "Modulates use of congestion control when losing multiple packets. Value 0 (default) means to perform congestion control if any packet loss occurs. Higher values increase tolerance for lost packets before signaling congestion", + "type": "integer", + "minimum": 0, + "maximum": 32, + "default": 0 + }, + "pktLossIgnoreRate": { + "title": "Packet loss ignore rate", + "description": "Sets threshold of packet loss rate (lost-packets/million-packets) above which the system performs congestion control. Value 0 (default) means to perform congestion control if any packet loss occurs. Higher values increase tolerance for lost packets before signaling congestion", + "type": "integer", + "minimum": 0, + "maximum": 1000000, + "default": 0 + }, + "proxyBufferHigh": { + "title": "Proxy-buffer high", + "description": "The system closes the receive window when the number of octets in proxy buffer rises above this value", + "type": "integer", + "minimum": 64, + "maximum": 33554432, + "default": 262144 + }, + "proxyBufferLow": { + "title": "Proxy-buffer low", + "description": "The system opens the receive window when the number of octets in proxy buffer falls below this value", + "type": "integer", + "minimum": 64, + "maximum": 33554432, + "default": 196608 + }, + "proxyMSS": { + "title": "Proxy MSS", + "description": "If true (default), the MSS value advertised on the server side will match that negotiated with the client, if permitted by MTU and other constraints", + "type": "boolean", + "default": true + }, + "proxyOptions": { + "title": "Proxy options", + "description": "If true, TCP options such as timestamp advertised on the server side will match those negotiated with client (default false)", + "type": "boolean", + "default": false + }, + "pushFlag": { + "title": "PuSH flag control", + "description": "Controls when ADC sets PSH flag in outbound TCP segments. Limiting the sending of segments with PSH improves performance. Value 'auto' (recommended) sets PSH according to a system algorithm optimal in most cases. Value 'default' (not recommended) sets the PUSH flag in every segment which happens to empty the send buffer. Value 'none' prevents use of the PSH flag, and 'one' means the system sets PSH only when FIN is, at the end of a connection", + "type": "string", + "enum": [ + "auto", + "default", + "none", + "one" + ], + "default": "auto" + }, + "ratePace": { + "title": "Rate pace", + "description": "If true (default), system will automatically pace rate of data transmission to optimize throughput", + "type": "boolean", + "default": true + }, + "ratePaceMaxRate": { + "title": "Rate pace maximum rate", + "description": "Limit maximum data-transmission rate in octets/second to this value when 'ratePace' is true. Default 0 means choose maximum rate automatically", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "$comment": "maximum in future: 137438953472", + "default": 0 + }, + "receiveWindowSize": { + "title": "Receive-window size", + "description": "Maximum size of receive window (octets, default 131072)", + "type": "integer", + "minimum": 64, + "maximum": 33554432, + "default": 131072 + }, + "resetOnTimeout": { + "title": "Reset on timeout", + "description": "If true (default), connections which time out will be reset (that is, the system will send an RST packet to the peer) before the system expunges them. Value false is not recommended", + "type": "boolean", + "default": true + }, + "retransmitThreshold": { + "title": "Retransmit threshold", + "description": "Specifies the number of duplicate ACKs to start fast recovery", + "type": "integer", + "minimum": 0, + "maximum": 12, + "default": 3 + }, + "selectiveAcks": { + "title": "Selective ACKs", + "description": "If true (default), the system negotiates rfc2018 Selective Acknowledgements with peers", + "type": "boolean", + "default": true + }, + "selectiveNack": { + "title": "Selective NAK", + "description": "If true, the system negotiates Selective Negative Acknowledgements with peers (default false)", + "type": "boolean", + "default": false + }, + "sendBufferSize": { + "title": "Send-buffer size", + "description": "Maximum size of send buffer (octets, default 262144)", + "type": "integer", + "minimum": 64, + "maximum": 33554432, + "default": 262144 + }, + "slowStart": { + "title": "Slow-start", + "description": "If true (default), BIG-IP AS3 adjusts the initial window size per rfc3390. This generally makes connections start more quickly, NOT more slowly", + "type": "boolean", + "default": true + }, + "synCookieEnable": { + "title": "SYN cookie enable", + "description": "If true (default), the system may use SYN cookies to avert connection-table overflow (for example, from DoS attacks)", + "type": "boolean", + "default": true + }, + "synCookieAllowlist": { + "title": "SYN cookie allowlist", + "description": "If true, after a client responds successfully to a SYN cookie challenge, the system accepts additional connection requests from that client without challenge for 30 seconds.", + "type": "boolean" + }, + "synCookieWhitelist": { + "title": "SYN cookie whitelist", + "description": "Deprecated. Replaced with functionally equivalent synCookieAllowlist. If true, after a client responds successfully to a SYN cookie challenge, the system accepts additional connection requests from that client without challenge for 30 seconds.", + "type": "boolean", + "default": false + }, + "synMaxRetrans": { + "title": "Maximum SYN retransmissions", + "description": "Maximum number of times the system retransmits a SYN when it does not receive a SYN+ACK (default 3)", + "type": "integer", + "minimum": 0, + "maximum": 12, + "default": 3 + }, + "synRtoBase": { + "title": "SYN RTO base", + "description": "Number of milliseconds (default 3000) to which the system initially sets the SYN retransmission timer. The system adjusts the timer after each retransmission to implement binary-exponential-backoff", + "type": "integer", + "minimum": 0, + "maximum": 5000, + "default": 3000 + }, + "tailLossProbe": { + "title": "Tail loss probe", + "description": "If true (default), the system uses the Tail Loss Probe scheme to reduce retransmission timeouts", + "type": "boolean", + "default": true + }, + "tcpOptions": { + "title": "TCP options capture for iRules", + "description": "Selects which TCP Option values the system captures for reference by iRules", + "type": "array", + "items": { + "title": "Option", + "type": "object", + "properties": { + "option": { + "title": "Number", + "description": "Specifies the TCP option to capture", + "type": "integer", + "minimum": 0, + "maximum": 255 + }, + "when": { + "title": "When seen", + "description": "Specifies when to capture the TCP option", + "type": "string", + "enum": [ + "first", + "last" + ] + } + }, + "additionalProperties": false + }, + "maxItems": 255, + "$comment": "uniqueItems: true" + }, + "timestamps": { + "title": "Timestamps", + "description": "If true (default and recommended), BIG-IP AS3 enables rfc1323 timestamps", + "type": "boolean", + "default": true + }, + "timeWaitRecycle": { + "title": "TIME-WAIT recycle", + "description": "If true (default), the system reuses connection resources immediately when it receives a SYN during the TIME-WAIT period", + "type": "boolean", + "default": true + }, + "timeWaitTimeout": { + "title": "Time-wait timeout", + "description": "Number of milliseconds (default 2,000) connection will remain in TIME-WAIT state before closing. Value -1 means indefinite", + "type": "integer", + "minimum": -1, + "maximum": 600000, + "default": 2000 + }, + "ttlMode": { + "title": "TTL mode", + "description": "Controls IP TTL in outgoing packets. Value 'set' forces TTL to value of property 'ttlIPv4' or 'ttlIPv6' as appropriate. Value 'proxy' (default) forces TTL to the default value for IPv4 or IPv6 as appropriate. Value 'preserve' copies TTL from received packet. Value 'decrement' sets TTL to one less than received packet's TTL", + "type": "string", + "enum": [ + "decrement", + "preserve", + "proxy", + "set" + ], + "default": "proxy" + }, + "ttlIPv4": { + "title": "TTL for IPv4", + "description": "TTL the system sets in outgoing IPv4 packets", + "type": "integer", + "minimum": 1, + "maximum": 255, + "default": 255 + }, + "ttlIPv6": { + "title": "TTL for IPv6", + "description": "TTL the system sets in outgoing IPv6 packets", + "type": "integer", + "minimum": 1, + "maximum": 255, + "default": 64 + }, + "verifiedAccept": { + "title": "Verified accept", + "description": "If true, the system must establish a server-side connection before a it accepts a corresponding client-side connection (default false). Value 'true' is incompatible with iRules", + "type": "boolean", + "default": false + }, + "zeroWindowTimeout": { + "title": "Zero-window timeout", + "description": "Number of milliseconds (default 20,000) connection will persist with window-size of zero (effective timeout is value rounded up to the nearest multiple of 5000). Value -1 means indefinite", + "type": "integer", + "minimum": -1, + "maximum": 86400000, + "default": 20000 + } + }, + "additionalProperties": false, + "required": [ + "class" + ], + "f5aliases": { + "synCookieAllowlist": "synCookieWhitelist" + } + }, + "Classification_Profile": { + "title": "Classification_Profile", + "description": "Configures a classification profile", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Classification_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "parentProfile": { + "description": "Specifies the name of the object to inherit the settings from", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Classification_Profile" + } + ], + "default": { + "bigip": "/Common/classification" + } + }, + "appDetectionEnabled": { + "description": "Enables/disables Application Detection feature", + "type": "boolean", + "default": true + }, + "urlCategorizationEnabled": { + "description": "Enables/disables URL Categorization feature", + "type": "boolean", + "default": false + }, + "iRuleEventEnabled": { + "description": "Enables/disables CLASSIFICATION_DETECTED iRule event generation", + "type": "boolean", + "default": false + }, + "logPublisher": { + "$ref": "#/definitions/Pointer_Log_Publisher" + }, + "logUnclassifiedDomain": { + "description": "Enables/disables unclassified domain logging", + "type": "boolean", + "default": false + }, + "preset": { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Classification_Preset" + } + ], + "default": { + "bigip": "/Common/ce" + } + }, + "statisticsCollectionEnabled": { + "description": "Enables/disables statistics collection", + "type": "boolean", + "default": false + }, + "statisticsPublisher": { + "$ref": "#/definitions/Pointer_Log_Publisher" + } + }, + "additionalProperties": false, + "required": [ + "class" + ] + }, + "Radius_Profile": { + "title": "Radius_Profile", + "description": "Configures a RADIUS profile for network traffic load balancing", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Radius_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "parentProfile": { + "description": "Specifies the name of the object to inherit the settings from", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Radius_Profile" + } + ], + "default": { + "bigip": "/Common/radiusLB" + } + }, + "persistAttribute": { + "description": "Specifies the name of the RADIUS attribute on which traffic persists. Acceptable values are ASCII strings from section 5 of RFC 2865 or numeric codes (1-255). A value of none indicates that persistence is disabled.", + "oneOf": [ + { + "type": "integer", + "minimum": 1, + "maximum": 255 + }, + { + "type": "string", + "enum": [ + "none", + "User-Name", + "User-Password", + "NAS-IP-Address", + "NAS-Port", + "Service-Type", + "Framed-Protocol", + "Framed-IP-Address", + "Framed-IP-Netmask", + "Framed-Routing", + "Filter-Id", + "Framed-MTU", + "Framed-Compression", + "Login-IP-Host", + "Login-Service", + "Login-TCP-Port", + "Reply-Message", + "Callback-Number", + "Callback-Id", + "Framed-Route", + "Framed-IPX-Network", + "State", + "Class", + "Vendor-Specific", + "Session-Timeout", + "Idle-Timeout", + "Termination-Action", + "Called-Station-Id", + "Calling-Station-Id", + "NAS-Identifier", + "Proxy-State", + "Login-LAT-Service", + "Login-LAT-Node", + "Login-LAT-Group", + "Framed-AppleTalk-Link", + "Framed-AppleTalk-Network", + "Framed-AppleTalk-Zone", + "CHAP-Challenge", + "NAS-Port-Type", + "Port-Limit", + "Login-LAT-Port" + ] + } + ], + "default": "none" + }, + "protocolProfile": { + "description": "Specifies PEM protocol profile that defines mapping of RADIUS AVPs to subscriber ID and other PEM subscriber session attributes", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "pem", + "afm" + ] + } + }, + { + "$ref": "#/definitions/Pointer_Enforcement_Protocol_Profile_Radius" + } + ], + "default": { + "bigip": "/Common/_sys_radius_proto_imsi" + } + }, + "subscriberDiscoveryEnabled": { + "description": "Specifies whether to enable PEM subscriber discovery based on the content of RADIUS packets", + "type": "boolean", + "f5PostProcess": { + "tag": "modules", + "data": [ + "pem", + "afm" + ] + }, + "default": true + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "IP_Other_Profile": { + "title": "IP_Other_Profile", + "description": "Configures a generic IP profile for non-TCP and non-UDP traffic", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "IP_Other_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "parentProfile": { + "description": "Specifies the name of the object to inherit the settings from", + "allOf": [ + { + "$ref": "#/definitions/Pointer_IP_Other_Profile" + } + ], + "default": { + "bigip": "/Common/ipother" + } + }, + "idleTimeout": { + "description": "Specifies the number of seconds a connection can be idle before the connection is eligible for deletion", + "$comment": "It might be possible to specify a value of 0 and remove the immediate option", + "if": { + "type": "integer" + }, + "then": { + "type": "integer", + "minimum": 0, + "maximum": 4294967295 + }, + "else": { + "type": "string", + "enum": [ + "indefinite", + "immediate" + ] + }, + "default": 60 + } + }, + "additionalProperties": false, + "required": [ + "class" + ] + }, + "Label": { + "title": "Label", + "description": "Optional friendly name for this object. Allows 0-64 chars, excluding a few likely to cause trouble with string searching, JS, TCL, or HTML", + "type": "string", + "pattern": "^[^\\x00-\\x1f\\x22#&*<>?\\x5b-\\x5d`\\x7f]*$", + "minLength": 0, + "maxLength": 64 + }, + "Remark": { + "title": "Remark", + "description": "Arbitrary (brief) text pertaining to this object. Allows 0-64 chars, excluding only control characters, double-quote, and backslash. This is permissive enough that you should worry about XSS attacks", + "type": "string", + "pattern": "^[^\\x00-\\x1f\\x22\\x5c\\x7f]*$", + "minLength": 0, + "maxLength": 64 + }, + "F5base64": { + "type": "string", + "description": "Slightly over-matches both base64-orig and base64-url data", + "pattern": "^([0-9A-Za-z/+_-]*|[0-9A-Za-z/+_-]+={1,2})$" + }, + "F5string": { + "title": "String value", + "description": "String value optionally in base64 or from URL or BIG-IP AS3 pointer", + "if": { + "not": { + "type": "object" + } + }, + "then": { + "type": "string" + }, + "else": { + "$comment": "May add 'cryptogram' in future.", + "properties": { + "base64": { + "title": "Base64", + "description": "Base64-encoded value (in JSON string)", + "type": "string", + "allOf": [ + { + "$ref": "#/definitions/F5base64" + } + ] + }, + "text": { + "title": "Text", + "description": "UTF-8 text (in JSON string)", + "type": "string" + }, + "url": { + "$ref": "#/definitions/Resource_URL" + }, + "copyFrom": { + "title": "Copy from", + "description": "BIG-IP AS3 pointer to declaration object/property from which to copy value", + "type": "string", + "format": "f5pointer" + }, + "bigip": { + "title": "BIG-IP component pathname", + "description": "Pathname of existing BIG-IP component", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1 + } + }, + "Metadata": { + "title": "Metadata", + "type": "object", + "description": "Useful datapoints for tracking, tagging, and organizing declarations.", + "$comment": "Properties are arbitrarily set by the user.", + "additionalProperties": { + "type": "object", + "properties": { + "value": { + "type": "string" + }, + "persist": { + "type": "boolean", + "default": true + } + }, + "required": [ + "value" + ], + "additionalProperties": false + } + }, + "Rewrite_Profile": { + "title": "Rewrite_Profile", + "type": "object", + "description": "Configures a rewrite profile", + "properties": { + "class": { + "type": "string", + "const": "Rewrite_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "bypassList": { + "description": "List of URIs that are bypassed in a web page when a rewrite mode of portal is used", + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "clientCachingType": { + "description": "The type of client caching used", + "type": "string", + "enum": [ + "cache-all", + "cache-css-js", + "cache-img-css-js", + "no-cache" + ], + "default": "cache-css-js" + }, + "javaCaFile": { + "description": "The CA Bundle used to verify Java applets signature certificates", + "allOf": [ + { + "$ref": "#/definitions/Pointer_CA_Bundle" + } + ], + "default": { + "bigip": "/Common/ca-bundle.crt" + } + }, + "javaSignKeyPassphrase": { + "description": "Passphrase if any for query authentication", + "type": "object", + "properties": { + "allowReuse": { + "description": "If true, other declaration objects may reuse this value", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Secret" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "object" + } + }, + { + "f5PostProcess": { + "tag": "secret" + } + } + ] + }, + "certificate": { + "description": "BIG-IP AS3 pointer to client Certificate declaration (optional)", + "type": "string", + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Certificate" + } + }, + "required": [ + "class" + ] + } + } + }, + "locationSpecificEnabled": { + "description": "Specifies if this contains an attribute with values specific to the location that the BIG-IP device resides", + "type": "boolean", + "default": false + }, + "requestSettings": { + "description": "The request settings used for uri-translation", + "allOf": [ + { + "$ref": "#/definitions/Rewrite_Profile_Request_Settings" + } + ], + "default": {} + }, + "responseSettings": { + "description": "The response settings used for uri-translation", + "allOf": [ + { + "$ref": "#/definitions/Rewrite_Profile_Response_Settings" + } + ], + "default": {} + }, + "rewriteList": { + "description": "List of URIs that are rewritten inside a web page when a rewrite mode of portal is used", + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "rewriteMode": { + "description": "The mode of rewriting that is used.uri-translation is a rules-based rewrite mode. portal is for use with Portal Access", + "type": "string", + "enum": [ + "portal", + "uri-translation" + ], + "default": "portal" + }, + "setCookieRules": { + "description": "The rules for rewriting HTTP Set-Cookie headers. Used with a rewrite mode of uri-translation", + "type": "array", + "items": { + "$ref": "#/definitions/Rewrite_Profile_Set_Cookie_Rule" + } + }, + "splitTunnelingEnabled": { + "description": "Determines if the profile provides for split tunneling", + "type": "boolean", + "default": false + }, + "uriRules": { + "description": "The rules for rewriting request and response headers and response bodies. Used with a rewrite mode of uri-translation", + "type": "array", + "items": { + "$ref": "#/definitions/Rewrite_Profile_Uri_Rule" + } + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "Rewrite_Profile_Set_Cookie_Rule": { + "description": "A Set-Cookie rule", + "type": "object", + "properties": { + "client": { + "description": "The client domain and path", + "type": "object", + "properties": { + "domain": { + "description": "The domain of the client", + "type": "string", + "minLength": 1 + }, + "path": { + "description": "The path of the client. Must be an absolute directory path", + "type": "string", + "minLength": 1 + } + }, + "required": [ + "domain", + "path" + ], + "additionalProperties": false + }, + "server": { + "description": "The server domain and path", + "type": "object", + "properties": { + "domain": { + "description": "The domain of the server", + "type": "string", + "minLength": 1 + }, + "path": { + "description": "The path of the server. Must be an absolute directory path", + "type": "string", + "minLength": 1 + } + }, + "required": [ + "domain", + "path" + ], + "additionalProperties": false + } + }, + "required": [ + "client", + "server" + ], + "additionalProperties": false + }, + "Rewrite_Profile_Uri_Rule": { + "description": "A URI rule", + "type": "object", + "properties": { + "type": { + "description": "The type of rule. request will affect request headers only, response will affect response headers and bodies, and both will do request and response", + "type": "string", + "enum": [ + "both", + "request", + "response" + ], + "default": "both" + }, + "client": { + "description": "The client URI", + "type": "object", + "properties": { + "scheme": { + "description": "The scheme of the client URI", + "type": "string" + }, + "host": { + "description": "The host of the client URI", + "type": "string", + "minLength": 1 + }, + "port": { + "description": "The port of the client URI", + "type": "string" + }, + "path": { + "description": "The path of the client URI. Must be an absolute directory path", + "type": "string", + "minLength": 1 + } + }, + "required": [ + "path" + ], + "dependencies": { + "host": { + "required": [ + "path", + "scheme" + ] + }, + "scheme": { + "required": [ + "path", + "host" + ] + }, + "port": { + "required": [ + "path", + "host", + "scheme" + ] + } + }, + "additionalProperties": false + }, + "server": { + "description": "The server URI", + "type": "object", + "properties": { + "scheme": { + "description": "The scheme of the server URI", + "type": "string" + }, + "host": { + "description": "The host of the server URI", + "type": "string", + "minLength": 1 + }, + "port": { + "description": "The port of the server URI", + "type": "string" + }, + "path": { + "description": "the path of the server URI. Must be an absolute directory path", + "type": "string", + "minLength": 1 + } + }, + "required": [ + "path" + ], + "dependencies": { + "host": { + "required": [ + "path", + "scheme" + ] + }, + "scheme": { + "required": [ + "path", + "host" + ] + }, + "port": { + "required": [ + "path", + "host", + "scheme" + ] + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "Rewrite_Profile_Request_Settings": { + "description": "Request settings for Rewrite_Profile", + "type": "object", + "properties": { + "insertXforwardedForEnabled": { + "description": "Determines if X-Forwarded-For header", + "type": "boolean", + "default": true + }, + "insertXforwardedHostEnabled": { + "description": "Determines if X-Forwarded-Proto header", + "type": "boolean", + "default": false + }, + "insertXforwardedProtoEnabled": { + "description": "Determines if X-Forwarded-Host header", + "type": "boolean", + "default": false + }, + "rewriteHeadersEnabled": { + "description": "Determines if request headers are rewritten", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false + }, + "Rewrite_Profile_Response_Settings": { + "description": "Response settings for Rewrite_Profile", + "type": "object", + "properties": { + "rewriteContentEnabled": { + "description": "Determines if response content should be rewritten", + "type": "boolean", + "default": true + }, + "rewriteHeadersEnabled": { + "description": "Determines if response headers should be rewritten", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false + }, + "Stream_Profile": { + "title": "Stream_Profile", + "description": "Configures a Stream profile", + "type": "object", + "properties": { + "class": { + "type": "string", + "const": "Stream_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "parentProfile": { + "description": "Specifies the profile that this profile will inherit values from", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Stream_Profile" + } + ], + "default": { + "bigip": "/Common/stream" + } + }, + "chunkingEnabled": { + "description": "Specifies that incoming data should be parsed in chunks", + "type": "boolean", + "default": false + }, + "chunkSize": { + "description": "The maximum size that a parsed chunk can be", + "type": "integer", + "minimum": 1024, + "maximum": 65535, + "default": 4096 + }, + "source": { + "description": "Specifies the string to rewrite", + "type": "string" + }, + "target": { + "description": "Specifies the new string that will replace the source string", + "type": "string" + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "Access_Profile": { + "title": "Access_Profile", + "description": "Configures an Access Profile", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "apm" + ] + }, + "properties": { + "class": { + "type": "string", + "const": "Access_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "url": { + "title": "URL", + "description": "The URL to pull the Access Profile from", + "allOf": [ + { + "$ref": "#/definitions/Resource_URL" + } + ] + }, + "ssloCreated": { + "title": "SSL Orchestrator Created", + "description": "Set to true if the profile was created by SSL Orchestrator. If true the non-configurable Kerberos Request-Based Authentication (/Common/rba) and WebSSO (/Common/websso) profiles will not be attached to Services when this profile is attached", + "type": "boolean", + "default": false + }, + "ignoreChanges": { + "title": "Ignore changes", + "description": "If false (default), the system updates the profile in every BIG-IP AS3 declaration deployment. If true, BIG-IP AS3 creates the profile on first deployment, and leaves it untouched afterwards. However, if enable is set to true, the policy will be applied even if ignoreChanges is true", + "type": "boolean", + "default": false + }, + "enable": { + "title": "Enable", + "description": "Apply the profile after updating it. If false (default), the system only updates the profile. Also note 'ignoreChanges'.", + "type": "boolean", + "default": false + } + }, + "required": [ + "class", + "url" + ], + "additionalProperties": false + }, + "Per_Request_Access_Policy": { + "title": "Per_Request_Access_Policy", + "description": "Configures a Per Flow Request Access Policy", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "apm" + ] + }, + "properties": { + "class": { + "type": "string", + "const": "Per_Request_Access_Policy" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "url": { + "title": "URL", + "description": "The URL to pull the policy from", + "allOf": [ + { + "$ref": "#/definitions/Resource_URL" + } + ] + }, + "ignoreChanges": { + "title": "Ignore changes", + "description": "If false (default), the system updates the profile in every BIG-IP AS3 declaration deployment. If true, BIG-IP AS3 creates the profile on first deployment, and leaves it untouched afterwards", + "type": "boolean", + "default": false + } + }, + "required": [ + "class", + "url" + ], + "additionalProperties": false + }, + "ICAP_Profile": { + "title": "ICAP_Profile", + "description": "Configures an ICAP profile", + "type": "object", + "properties": { + "class": { + "type": "string", + "const": "ICAP_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "uri": { + "description": "Specifies the absolute URI that contains both the complete hostname and the path of the resource to use in the ICAP header. Macro expansion is supported for all attribute values in the ICAP header (e.g. icap://${SERVER_IP}:${SERVER_PORT}/videoOptimization)", + "type": "string" + }, + "fromHeader": { + "description": "Specifies the 'From' attribute to use in the ICAP header", + "type": "string" + }, + "hostHeader": { + "description": "Specifies the 'Host' attribute to use in the ICAP header", + "type": "string" + }, + "refererHeader": { + "description": "Specifies the 'Referer' attribute to use in the ICAP header", + "type": "string" + }, + "userAgentHeader": { + "description": "Specifies the 'User-Agent' attribute to use in the ICAP header", + "type": "string" + }, + "previewLength": { + "description": "Specifies the length of the preview in the transaction", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 0 + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "Adapt_Profile": { + "title": "Adapt_Profile", + "description": "Configures a request or response Adapt profile or both", + "type": "object", + "properties": { + "class": { + "type": "string", + "const": "Adapt_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "messageType": { + "description": "The type of Adapt profile. Use both to create a request and response profile with the same property values", + "type": "string", + "enum": [ + "response", + "request", + "request-and-response" + ] + }, + "enableHttpAdaptation": { + "description": "Enable or disable the adaptation of HTTP requests/responses. They will be forwarded to the internal service", + "type": "boolean", + "default": true + }, + "internalService": { + "description": "Specifies the name of the internal service to use for adapting the request/response", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Service" + } + ] + }, + "previewSize": { + "description": "Specifies the maximum size of the preview buffer", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 1024 + }, + "serviceDownAction": { + "description": "Specifies the action to take if the internal service doesn't exist or is down", + "type": "string", + "enum": [ + "ignore", + "reset", + "drop" + ], + "default": "ignore" + }, + "timeout": { + "description": "Specifies how long in miliseconds to wait for the internal service before a timeout error will occur", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 0 + }, + "allowHTTP10": { + "description": "Specifies whether to forward HTTP 1.0 requests/responses", + "type": "boolean", + "default": false + } + }, + "required": [ + "class", + "messageType" + ] + }, + "Cipher_Rule": { + "title": "Cipher_Rule", + "description": "Configures a cipher rule", + "type": "object", + "properties": { + "class": { + "type": "string", + "const": "Cipher_Rule" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "cipherSuites": { + "description": "Specifies the cipher suites", + "type": "array", + "items": { + "type": "string" + } + }, + "namedGroups": { + "description": "Specifies the Elliptic Curve Diffie Hellman key agreement algorithms used to negotiate SSL/TLS connections. namedGroups are only supported on BIG-IP 14.0 and later.", + "type": "array", + "items": { + "type": "string", + "enum": [ + "DEFAULT", + "P256", + "P384", + "X25519" + ] + } + }, + "signatureAlgorithms": { + "description": "Specifies the digital signature algorithms used for authentication. signatureAlgorithms are only supported on BIG-IP 14.0 and later.", + "type": "array", + "items": { + "type": "string", + "enum": [ + "DEFAULT", + "DSA-SHA1", + "DSA-SHA256", + "DSA-SHA384", + "DSA-SHA512", + "ECDSA-SHA1", + "ECDSA-SHA256", + "ECDSA-SHA384", + "ECDSA-SHA512", + "RSA-PKCS1-SHA1", + "RSA-PKCS1-SHA256", + "RSA-PKCS1-SHA384", + "RSA-PKCS1-SHA512", + "RSA-PSS-SHA256", + "RSA-PSS-SHA384", + "RSA-PSS-SHA512" + ] + } + } + }, + "required": [ + "class" + ], + "anyOf": [ + { + "required": [ + "cipherSuites" + ] + }, + { + "required": [ + "namedGroups" + ] + }, + { + "required": [ + "signatureAlgorithms" + ] + } + ], + "additionalProperties": false + }, + "Cipher_Group": { + "title": "Cipher_Group", + "description": "Configures a Cipher Group", + "type": "object", + "properties": { + "class": { + "type": "string", + "const": "Cipher_Group" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "order": { + "description": "Configure the order of the specified Cipher Rules.", + "type": "string", + "enum": [ + "default", + "speed", + "strength", + "fips", + "hardware" + ], + "default": "default" + }, + "allowCipherRules": { + "description": "Allow the following Cipher Rules.", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Cipher_Rule" + }, + "default": [ + { + "bigip": "/Common/f5-default" + } + ] + }, + "excludeCipherRules": { + "description": "Exclude the following Cipher_Rules from the Allowed list.", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Cipher_Rule" + } + }, + "requireCipherRules": { + "description": "Restrict the Allowed list to the following Cipher_Rules.", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Cipher_Rule" + } + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "iFile": { + "title": "iFile", + "description": "An iFile", + "type": "object", + "properties": { + "class": { + "type": "string", + "const": "iFile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "iFile": { + "description": "Reference to an iFile", + "allOf": [ + { + "$ref": "#/definitions/F5string" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "string" + } + } + ] + } + }, + "additionalProperties": false, + "required": [ + "class", + "iFile" + ] + }, + "Firewall_Address_List": { + "title": "Firewall_Address_List", + "description": "Declares an address-list for use by firewall rules. An address list is a list of IP-address prefixes to compare against the source-IP address and/or destination-IP address in an IP packet", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm", + "asm" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Firewall_Address_List" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "addresses": { + "type": "array", + "description": "A list of IPv4 and IPv6 addresses and address ranges. You can specify a network with CIDR slash notation.", + "items": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "object", + "properties": { + "addressDiscovery": { + "title": "Address discovery", + "description": "Selects how server (node) addresses are discovered", + "type": "string", + "enum": [ + "event", + "aws", + "gce", + "azure", + "consul" + ], + "f5serviceDiscovery": true + }, + "updateInterval": { + "title": "Update interval", + "description": "Server-discovery update interval (seconds)", + "type": "integer", + "minimum": 1, + "maximum": 3600, + "default": 60 + } + }, + "required": [ + "addressDiscovery" + ], + "allOf": [ + { + "if": { + "properties": { + "addressDiscovery": { + "const": "aws" + } + } + }, + "then": { + "$ref": "#/definitions/Service_Discovery_AWS" + } + }, + { + "if": { + "properties": { + "addressDiscovery": { + "const": "azure" + } + } + }, + "then": { + "$ref": "#/definitions/Service_Discovery_Azure" + } + }, + { + "if": { + "properties": { + "addressDiscovery": { + "const": "gce" + } + } + }, + "then": { + "$ref": "#/definitions/Service_Discovery_GCE" + } + }, + { + "if": { + "properties": { + "addressDiscovery": { + "const": "consul" + } + } + }, + "then": { + "$ref": "#/definitions/Service_Discovery_Consul" + } + } + ] + } + ] + }, + "minItems": 1 + }, + "fqdns": { + "type": "array", + "description": "A list of fully qualified domain names.", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "geo": { + "type": "array", + "description": "A list of geographic locations (for example, US:Washington).", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "addressLists": { + "type": "array", + "description": "A list of other address lists (each by BIG-IP AS3 pointer or BIG-IP pathname).", + "items": { + "$ref": "#/definitions/Pointer_Firewall_Address_List" + }, + "minItems": 1 + } + }, + "additionalProperties": false, + "required": [ + "class" + ], + "anyOf": [ + { + "required": [ + "addresses" + ] + }, + { + "required": [ + "fqdns" + ] + }, + { + "required": [ + "geo" + ] + }, + { + "required": [ + "addressLists" + ] + } + ] + }, + "Firewall_Port_List": { + "title": "Firewall_Port_List", + "description": "Declares a port-list for use by firewall rules. A firewall rule can match a packet's source port or destination port against one of the ports in a port list, and can take some action (such as ACCEPT or DROP) for a matching packet.", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Firewall_Port_List" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "ports": { + "type": "array", + "description": "A list of ports and port ranges (for example, 80, \"8080-8090\").", + "items": { + "type": [ + "integer", + "string" + ] + }, + "minItems": 1 + }, + "portLists": { + "type": "array", + "description": "A list of other port lists (each by BIG-IP AS3 pointer or BIG-IP pathname).", + "items": { + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to firewall port list declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Firewall_Port_List" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP Firewall Port List", + "description": "Pathname of existing BIG-IP firewall port list", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security firewall port-list" + ] + } + }, + "minItems": 1 + } + }, + "additionalProperties": false, + "required": [ + "class" + ], + "anyOf": [ + { + "required": [ + "ports" + ] + }, + { + "required": [ + "portLists" + ] + } + ] + }, + "Firewall_Rule_List": { + "title": "Firewall_Rule_List", + "description": "Declares a list of network firewall rules. You can reuse a rule list in multiple firewalls, such as the firewalls for self IPs, routing domains, and the global firewall.", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Firewall_Rule_List" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "rules": { + "type": "array", + "description": "A list of network firewall rules.", + "items": { + "$ref": "#/definitions/Firewall_Rule" + } + } + }, + "additionalProperties": false, + "required": [ + "class" + ] + }, + "Firewall_Rule": { + "title": "Firewall Rule", + "description": "Declares a network firewall rule.", + "type": "object", + "properties": { + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "name": { + "type": "string", + "description": "The name of the firewall rule." + }, + "action": { + "type": "string", + "description": "Specifies the action that the firewall rule will take on matching packets.", + "enum": [ + "accept", + "drop", + "accept-decisively", + "reject" + ] + }, + "protocol": { + "type": "string", + "description": "Specifies the protocol to which the firewall rule applies", + "enum": [ + "3pc", + "a/n", + "ah", + "any", + "argus", + "aris", + "ax.25", + "bbn-rcc", + "bna", + "br-sat-mon", + "cbt", + "cftp", + "chaos", + "compaq-peer", + "cphb", + "cpnx", + "crdup", + "crtp", + "dccp", + "dcn", + "ddp", + "ddx", + "dgp", + "dsr", + "egp", + "eigrp", + "emcon", + "encap", + "esp", + "etherip", + "fc", + "fire", + "ggp", + "gmtp", + "gre", + "hip", + "hmp", + "hopopt", + "i-nlsp", + "iatp", + "icmp", + "idpr", + "idpr-cmtp", + "idrp", + "ifmp", + "igmp", + "igp", + "il", + "ip", + "ipcomp", + "ipcv", + "ipip", + "iplt", + "ippc", + "ipv4", + "ipv6", + "ipv6-auth", + "ipv6-crypt", + "ipv6-frag", + "ipv6-icmp", + "ipv6-nonxt", + "ipv6-opts", + "ipv6-route", + "ipx-in-ip", + "irtp", + "isis", + "iso-ip", + "iso-tp4", + "kryptolan", + "l2tp", + "larp", + "leaf-1", + "leaf-2", + "manet", + "merit-inp", + "mfe-nsp", + "micp", + "mobile", + "mobility-header", + "mpls-in-ip", + "mtp", + "mux", + "narp", + "netblt", + "nsfnet-igp", + "nvp", + "ospf", + "pgm", + "pim", + "pipe", + "pnni", + "prm", + "ptp", + "pup", + "pvp", + "qnx", + "rdp", + "rohc", + "rsvp", + "rsvp-e2e-ignore", + "rvd", + "sat-expak", + "sat-mon", + "scc-sp", + "scps", + "sctp", + "sdrp", + "secure-vmtp", + "shim6", + "skip", + "sm", + "smp", + "snp", + "sprite-rpc", + "sps", + "srp", + "sscopmce", + "st", + "stp", + "sun-nd", + "swipe", + "tcf", + "tcp", + "tlsp", + "tp++", + "trunk-1", + "trunk-2", + "ttp", + "udp", + "udplite", + "uti", + "vines", + "visa", + "vmtp", + "vrrp", + "wb-expak", + "wb-mon", + "wesp", + "wsn", + "xnet", + "xns-idp", + "xtp" + ], + "default": "any" + }, + "source": { + "$ref": "#/definitions/Firewall_Rule_Source" + }, + "destination": { + "$ref": "#/definitions/Firewall_Rule_Destination" + }, + "loggingEnabled": { + "type": "boolean", + "description": "Specifies whether the system enables or disables logging for the firewall rule.", + "default": false + }, + "iRule": { + "type": "object", + "description": "Specifies the name of the iRule (by BIG-IP AS3 pointer or BIG-IP pathname) that the system will trigger when a packet matches the firewall rule.", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to iRule declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "iRule" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP iRule", + "description": "Pathname of existing BIG-IP iRule", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm rule" + ] + } + }, + "iRuleSampleRate": { + "type": "integer", + "description": "Specifies the rate at which the system will trigger the specified iRule when a packet matches this firewall rule. The default value is 1 and causes the system to trigger the iRule for every packet that matches. A value of 0 disables iRule triggering." + } + }, + "additionalProperties": false, + "dependencies": { + "iRuleSampleRate": [ + "iRule" + ] + }, + "required": [ + "name", + "action" + ] + }, + "Firewall_Rule_Source": { + "title": "Firewall Rule Source", + "description": "Declares the packet sources to which the network firewall rule applies.", + "type": "object", + "properties": { + "addressLists": { + "type": "array", + "description": "A list of address lists (each by BIG-IP AS3 pointer or BIG-IP pathname).", + "items": { + "$ref": "#/definitions/Pointer_Firewall_Address_List" + } + }, + "portLists": { + "type": "array", + "description": "A list of port lists (each by BIG-IP AS3 pointer or BIG-IP pathname).", + "items": { + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to firewall port list declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Firewall_Port_List" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP Firewall Port List", + "description": "Pathname of existing BIG-IP firewall port list", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security firewall port-list" + ] + } + } + }, + "vlans": { + "type": "array", + "description": "A list of VLANs by BIG-IP pathname", + "items": { + "bigip": { + "title": "BIG-IP VLAN", + "description": "Pathname of existing BIG-IP VLAN", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query net vlan" + ] + } + } + }, + "additionalProperties": false + }, + "Firewall_Rule_Destination": { + "title": "Firewall Rule Destination", + "description": "Declares the packet destinations to which the network firewall rule applies.", + "type": "object", + "properties": { + "addressLists": { + "type": "array", + "description": "A list of address lists (each by BIG-IP AS3 pointer or BIG-IP pathname).", + "items": { + "$ref": "#/definitions/Pointer_Firewall_Address_List" + } + }, + "portLists": { + "type": "array", + "description": "A list of port lists (each by BIG-IP AS3 pointer or BIG-IP pathname).", + "items": { + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to firewall port list declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Firewall_Port_List" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP Firewall Port List", + "description": "Pathname of existing BIG-IP firewall port list", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security firewall port-list" + ] + } + } + } + }, + "additionalProperties": false + }, + "Firewall_Policy": { + "title": "Firewall_Policy", + "description": "Configures firewall policy", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Firewall_Policy" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "rules": { + "description": "A list of firewall policy rules", + "type": "array", + "items": { + "if": { + "oneOf": [ + { + "required": [ + "use" + ] + }, + { + "required": [ + "bigip" + ] + } + ] + }, + "then": { + "$ref": "#/definitions/Pointer_Firewall_Rule_List" + }, + "else": { + "$ref": "#/definitions/Firewall_Rule" + } + } + } + }, + "additionalProperties": false, + "required": [ + "class", + "rules" + ] + }, + "NAT_Policy": { + "title": "NAT_Policy", + "description": "Configures network address translation policy", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "NAT_Policy" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "rules": { + "description": "A list of NAT rules", + "type": "array", + "items": { + "$ref": "#/definitions/NAT_Rule" + } + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "NAT_Rule": { + "description": "Network address translation rule", + "type": "object", + "properties": { + "name": { + "description": "NAT rule name", + "type": "string" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "source": { + "$ref": "#/definitions/NAT_Rule_Source" + }, + "destination": { + "$ref": "#/definitions/NAT_Rule_Destination" + }, + "protocol": { + "description": "Specifies the IP protocol against which the packet will be compared", + "type": "string", + "enum": [ + "any", + "tcp", + "udp" + ], + "default": "any" + }, + "sourceTranslation": { + "allOf": [ + { + "$ref": "#/definitions/Pointer_NAT_Source_Translation" + } + ] + }, + "securityLogProfile": { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Security_Log_Profile" + } + ] + } + }, + "required": [ + "name" + ], + "additionalProperties": false + }, + "NAT_Rule_Destination": { + "description": "Network address translation destination configuration", + "type": "object", + "properties": { + "addressLists": { + "description": "A list of address lists (each by BIG-IP AS3 pointer or BIG-IP pathname)", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Firewall_Address_List" + } + }, + "portLists": { + "description": "A list of port lists (each by BIG-IP AS3 pointer or BIG-IP pathname)", + "type": "array", + "items": { + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to firewall port list declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Firewall_Port_List" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP Firewall Port List", + "description": "Pathname of existing BIG-IP firewall port list", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security firewall port-list" + ] + } + } + } + }, + "required": [], + "additionalProperties": false + }, + "NAT_Rule_Source": { + "description": "Network address translation source configuration", + "type": "object", + "properties": { + "addressLists": { + "description": "A list of address lists (each by BIG-IP AS3 pointer or BIG-IP pathname)", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Firewall_Address_List" + } + }, + "portLists": { + "description": "A list of port lists (each by BIG-IP AS3 pointer or BIG-IP pathname)", + "type": "array", + "items": { + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to firewall port list declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Firewall_Port_List" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP Firewall Port List", + "description": "Pathname of existing BIG-IP firewall port list", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security firewall port-list" + ] + } + } + } + }, + "required": [], + "additionalProperties": false + }, + "NAT_Source_Translation": { + "title": "NAT_Source_Translation", + "description": "Configures a Security network address translation source translation object", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "NAT_Source_Translation" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "addresses": { + "description": "Specifies addresses on which source translation is performed", + "type": "array", + "items": { + "type": "string" + } + }, + "allowEgressInterfaces": { + "description": "Specifies the egress interfaces (tunnels and VLANs) on which source translation is allowed", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Tunnel" + } + }, + "clientConnectionLimit": { + "description": "Maximum number of simultaneous translated connections a client or subscriber is allowed to have", + "type": "integer", + "minimum": 0, + "maximum": 2147483647 + }, + "disallowEgressInterfaces": { + "description": "Specifies the egress interfaces (tunnels and VLANs) on which source translation is not allowed", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Tunnel" + } + }, + "hairpinModeEnabled": { + "type": "boolean", + "description": "Enables or disables hairpinning for incoming connections to active translation end-points" + }, + "inboundMode": { + "description": "Specifies the persistence settings for NAT translation entries", + "type": "string", + "enum": [ + "endpoint-independent-filtering", + "explicit", + "none" + ] + }, + "mapping": { + "$ref": "#/definitions/NAT_Source_Translation_Mapping" + }, + "patMode": { + "description": "Specifies whether the translation address mapping is performed in Network Address Port Translation mode, Deterministic mode, or in Port Block Allocation mode", + "type": "string", + "enum": [ + "napt", + "deterministic", + "pba" + ] + }, + "portBlockAllocation": { + "$ref": "#/definitions/NAT_Source_Translation_PortBlockAllocation" + }, + "ports": { + "description": "Specifies source ports and port ranges on which source translation is performed", + "type": "array", + "items": { + "type": [ + "integer", + "string" + ], + "minimum": 0, + "maximum": 65535 + } + }, + "routeAdvertisement": { + "type": "boolean", + "description": "Specifies that the traffic is advertised to dynamic routing protocols configured in the route domain", + "default": false + }, + "type": { + "description": "Specifies the type of source translation item", + "type": "string", + "enum": [ + "dynamic-pat", + "static-nat", + "static-pat" + ] + }, + "excludeAddresses": { + "description": "Specifies the set of addresses excluded from translation IP addresses available in the pool. This property is available on BIGIP 14.1 and above.", + "type": "array", + "items": { + "oneOf": [ + { + "type": "string" + }, + { + "$ref": "#/definitions/Pointer_Firewall_Address_List" + } + ] + } + } + }, + "dependencies": { + "clientConnectionLimit": { + "properties": { + "type": { + "const": "dynamic-pat" + } + } + }, + "hairpinModeEnabled": { + "properties": { + "type": { + "const": "dynamic-pat" + } + } + }, + "inboundMode": { + "properties": { + "type": { + "const": "dynamic-pat" + } + } + }, + "mapping": { + "properties": { + "type": { + "const": "dynamic-pat" + } + } + }, + "patMode": { + "properties": { + "type": { + "const": "dynamic-pat" + } + } + }, + "portBlockAllocation": { + "properties": { + "type": { + "const": "dynamic-pat" + }, + "patMode": { + "const": "pba" + } + } + }, + "ports": { + "properties": { + "type": { + "enum": [ + "static-pat", + "dynamic-pat" + ] + } + } + } + }, + "if": { + "properties": { + "allowEgressInterfaces": {} + }, + "required": [ + "allowEgressInterfaces" + ] + }, + "then": { + "not": { + "properties": { + "disallowEgressInterfaces": {} + }, + "required": [ + "disallowEgressInterfaces" + ] + } + }, + "required": [ + "type" + ], + "additionalProperties": false + }, + "NAT_Source_Translation_Mapping": { + "description": "Configure the mapping settings for translation entries. It is the preservation of a public-side IP address for a client from session to session. Only available if type is dynamic-pat.", + "type": "object", + "properties": { + "mode": { + "description": "Specifies the mapping mode for translation entries", + "type": "string", + "enum": [ + "address-pooling-paired", + "endpoint-independent-mapping", + "none" + ], + "default": "address-pooling-paired" + }, + "timeout": { + "description": "Specifies the timeout (in seconds) for address and port mapping", + "type": "integer", + "minimum": 0, + "maximum": 2147483647, + "default": 300 + } + }, + "required": [], + "additionalProperties": false + }, + "NAT_Source_Translation_PortBlockAllocation": { + "description": "Configure the port block allocation", + "type": "object", + "properties": { + "blockIdleTimeout": { + "description": "Specifies the amount of time in seconds that an assigned block of ports remains available when idle before it times out", + "type": "integer", + "minimum": 0, + "maximum": 2147483647, + "default": 3600 + }, + "blockLifetime": { + "description": "Specifies the lifetime in seconds of a block of ports", + "type": "integer", + "minimum": 0, + "maximum": 2147483647, + "default": 0 + }, + "blockSize": { + "description": "Specifies the number of ports per block. Each block is assigned to one client. A client can use all ports in a block multiplied by the number of blocks, up to the connection limit, if one is set", + "type": "integer", + "minimum": 0, + "maximum": 2147483647, + "default": 64 + }, + "clientBlockLimit": { + "description": "Specifies the number of blocks that can be assigned to a client", + "type": "integer", + "minimum": 0, + "maximum": 2147483647, + "default": 1 + }, + "zombieTimeout": { + "description": "Specifies the timeout duration for a zombie port block, which is a timed out port block with one or more active connections", + "type": "integer", + "minimum": 0, + "maximum": 2147483647, + "default": 0 + } + }, + "required": [], + "additionalProperties": false + }, + "Protocol_Inspection_Profile": { + "title": "Protocol_Inspection_Profile", + "description": "Protocol Inspection Profile used for configurable BIG-IP AFM intrusion prevention", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Protocol_Inspection_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "collectAVRStats": { + "description": "If true, AVR will collect data from the intrusion prevention profile", + "type": "boolean", + "default": true + }, + "enableComplianceChecks": { + "description": "Specifies whether the compliance checks will be enabled for this profile", + "type": "boolean", + "default": true + }, + "enableSignatureChecks": { + "description": "Specifies whether the signature checks will be enabled for this profile", + "type": "boolean", + "default": true + }, + "autoAddNewInspections": { + "description": "Specifies whether new inspections delivered via IPS IM package will be automatically added to this profile", + "type": "boolean", + "default": false + }, + "autoPublish": { + "description": "Specifies whether the inspections will be automatically updated to the suggested action after the staging period", + "type": "boolean", + "default": false + }, + "defaultFromProfile": { + "description": "Specifies the parent profile. If specified, the new profile will be cloned from the parent", + "type": "string" + }, + "services": { + "description": "Specifies the services and service checks for this profile", + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "description": "The name of the service type", + "type": "string", + "enum": [ + "boxp", + "coap", + "dhcp", + "diameter", + "dns", + "ftp", + "gtp", + "http", + "imap", + "ipsec", + "irc", + "mqtt", + "mysql", + "netbios_ns", + "netbios_ssn", + "nntp", + "oracle", + "other", + "pfcp", + "pop3", + "radius", + "rdp", + "rmi", + "rsh", + "sip", + "smtp", + "snmp", + "ssh", + "ssl", + "sunrpc", + "telnet", + "tftp", + "thrift", + "wins" + ] + }, + "compliance": { + "description": "A list of compliance checks to attach to the Protocol Inspection Profile", + "type": "array", + "items": { + "$ref": "#/definitions/Protocol_Inspection_Profile_Service_Compliance_Check" + } + }, + "signature": { + "description": "A list of signature checks to attach to the Protocol Inspection Profile", + "type": "array", + "items": { + "$ref": "#/definitions/Protocol_Inspection_Profile_Service_Signature_Check" + } + }, + "ports": { + "description": "List of ports to attach to the service.", + "type": "array", + "items": { + "type": "integer", + "minimum": 0, + "maximum": 65535 + } + } + }, + "allOf": [ + { + "if": { + "properties": { + "type": { + "const": "dhcp" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 67, + 68 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "dns" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 53 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "gtp" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 2123, + 2152, + 3386 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "imap" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 143, + 993 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "mqtt" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 1883 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "netbios_ns" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 137 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "nntp" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 119 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "pop3" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 110 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "sip" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 5060, + 5061 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "snmp" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 161, + 162 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "ssl" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 443 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "telnet" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 23 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "wins" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 42 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "diameter" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 3868 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "ftp" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 20, + 21 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "http" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 80, + 8080 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "irc" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 6663, + 6667, + 6668, + 7000 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "mysql" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 3306 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "netbios_ssn" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 139, + 445 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "radius" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 1645, + 1646, + 1812, + 1813 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "smtp" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 25 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "ssh" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 22 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "sunrpc" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 111 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "tftp" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 69 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "coap" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 5683 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "oracle" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 1521 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "pfcp" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 8805 + ] + } + } + } + } + ], + "required": [ + "type" + ], + "additionalProperties": false + } + } + }, + "additionalProperties": false + }, + "Protocol_Inspection_Profile_Service_Compliance_Check": { + "title": "Protocol Inspection Profile Service Compliance Check", + "description": "Defines a compliance check to attach to the Protocol Inspection Profile", + "type": "object", + "properties": { + "check": { + "type": "string", + "description": "The name of the check" + }, + "action": { + "type": "string", + "enum": [ + "accept", + "drop", + "reject" + ], + "description": "Which action to perform on traffic matching the check", + "default": "accept" + }, + "log": { + "type": "boolean", + "description": "Specifies whether to log the check", + "default": true + }, + "value": { + "type": "string", + "description": "Value to use for the check. If a check accepts enumerable values, these should be delimited by spaces." + } + }, + "required": [ + "check" + ], + "additionalProperties": false + }, + "Protocol_Inspection_Profile_Service_Signature_Check": { + "type": "object", + "title": "Protocol Inspection Profile Service Signature Check", + "description": "Defines a signature check to attach to the Protocol Inspection Profile", + "properties": { + "check": { + "type": "string", + "description": "The name of the check" + }, + "action": { + "type": "string", + "enum": [ + "accept", + "drop", + "reject" + ], + "description": "Which action to perform on traffic matching the check", + "default": "accept" + }, + "log": { + "type": "boolean", + "description": "Specifies whether to log the check", + "default": true + } + }, + "required": [ + "check" + ], + "additionalProperties": false + }, + "SSH_Proxy_Profile": { + "title": "SSH_Proxy_Profile", + "description": "SSH Profile used for SSH security", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "SSH_Proxy_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "sshProfileAuthInfo": { + "description": "Specifies the authentication info of public and private keys for this profile", + "type": "array", + "items": { + "$ref": "#/definitions/SSH_Proxy_Profile_Auth_Info_Collection" + } + }, + "sshProfileDefaultActions": { + "description": "Specifies the default action values", + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Default_Action_Collection" + } + ], + "default": {} + }, + "sshProfileRuleSet": { + "description": "The profile's collection of rules, each rule holds a set of actions", + "type": "array", + "items": { + "$ref": "#/definitions/SSH_Proxy_Profile_Rule_Collection" + } + }, + "timeout": { + "description": "User defined timeout value", + "type": "integer", + "default": 0 + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "SSH_Proxy_Profile_Auth_Info_Collection": { + "description": "A collection of authentication info of public and private keys", + "type": "object", + "properties": { + "name": { + "description": "The name of this set of Authorized Info", + "type": "string" + }, + "proxyServerAuth": { + "$ref": "#/definitions/SSH_Proxy_Profile_Proxy_Auth_Info" + }, + "proxyClientAuth": { + "$ref": "#/definitions/SSH_Proxy_Profile_Proxy_Auth_Info" + }, + "realServerAuth": { + "$ref": "#/definitions/SSH_Proxy_Profile_Real_Server_Auth_Info" + } + }, + "additionalProperties": false + }, + "SSH_Proxy_Profile_Proxy_Auth_Info": { + "description": "The keys used to authenticate ssh connections between the big-ip and external sources", + "type": "object", + "properties": { + "privateKey": { + "description": "The private key of the authentication algorithm (rsa, dss, etc...)", + "type": "object", + "properties": { + "allowReuse": { + "description": "If true, other declaration objects may reuse this value", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Secret" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "object" + } + }, + { + "f5PostProcess": { + "tag": "secret" + } + } + ] + }, + "publicKey": { + "description": "The public key of the authentication algorithm (rsa, dss, etc...)", + "type": "string" + } + }, + "additionalProperties": false + }, + "SSH_Proxy_Profile_Real_Server_Auth_Info": { + "description": "Public key that can be used to authenticate real host server to the proxy", + "type": "object", + "properties": { + "publicKey": { + "description": "The public key of the authentication algorithm (rsa, dss, etc...)", + "type": "string" + } + }, + "additionalProperties": false + }, + "SSH_Proxy_Profile_Default_Action_Collection": { + "description": "A collection of actions for the SSH Profile", + "type": "object", + "properties": { + "name": { + "description": "The name of this set of actions", + "type": "string" + }, + "agentAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Default_Action" + } + ], + "default": {} + }, + "localForwardAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Default_Action" + } + ], + "default": {} + }, + "otherAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Default_Action" + } + ], + "default": {} + }, + "remoteForwardAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Default_Action" + } + ], + "default": {} + }, + "rexecAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Default_Action" + } + ], + "default": {} + }, + "scpUpAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Default_Action" + } + ], + "default": {} + }, + "scpDownAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Default_Action" + } + ], + "default": {} + }, + "sftpUpAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Default_Action" + } + ], + "default": {} + }, + "sftpDownAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Default_Action" + } + ], + "default": {} + }, + "shellAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Default_Action" + } + ], + "default": {} + }, + "subSystemAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Default_Action" + } + ], + "default": {} + }, + "x11ForwardAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Default_Action" + } + ], + "default": {} + } + }, + "additionalProperties": false + }, + "SSH_Proxy_Profile_Default_Action": { + "description": "The action an SSH Profile will take. The default value is 'allow'.", + "type": "object", + "properties": { + "control": { + "description": "Indicates the specific action to take", + "type": "string", + "enum": [ + "allow", + "disallow", + "terminate", + "unspecified" + ], + "default": "allow" + }, + "log": { + "description": "Indicates if a log will be created when the action is taken. The default value is false.", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + }, + "SSH_Proxy_Profile_Rule_Collection": { + "description": "User defined rule", + "type": "object", + "properties": { + "name": { + "description": "The name of this set of rules", + "type": "string" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "sshProfileIdUsers": { + "description": "Specifies the rule users identity", + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "sshProfileIdGroups": { + "description": "Specifies the rule groups identity", + "type": "array", + "items": { + "type": "string" + } + }, + "sshProfileRuleActions": { + "description": "The sets of actions in the rule", + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Rule_Action_Collection" + } + ], + "default": {} + } + }, + "anyOf": [ + { + "required": [ + "sshProfileIdUsers" + ] + }, + { + "required": [ + "sshProfileIdGroups" + ] + } + ], + "required": [ + "name" + ], + "additionalProperties": false + }, + "SSH_Proxy_Profile_Rule_Action_Collection": { + "description": "A collection of actions for the SSH Profile", + "type": "object", + "properties": { + "name": { + "description": "The name of this set of actions", + "type": "string" + }, + "agentAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Rule_Action" + } + ], + "default": {} + }, + "localForwardAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Rule_Action" + } + ], + "default": {} + }, + "otherAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Rule_Action" + } + ], + "default": {} + }, + "remoteForwardAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Rule_Action" + } + ], + "default": {} + }, + "rexecAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Rule_Action" + } + ], + "default": {} + }, + "scpUpAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Rule_Action" + } + ], + "default": {} + }, + "scpDownAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Rule_Action" + } + ], + "default": {} + }, + "sftpUpAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Rule_Action" + } + ], + "default": {} + }, + "sftpDownAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Rule_Action" + } + ], + "default": {} + }, + "shellAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Rule_Action" + } + ], + "default": {} + }, + "subSystemAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Rule_Action" + } + ], + "default": {} + }, + "x11ForwardAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Rule_Action" + } + ], + "default": {} + } + }, + "additionalProperties": false + }, + "SSH_Proxy_Profile_Rule_Action": { + "description": "The action an SSH Profile Rule will take. The default value is 'unspecified'.", + "type": "object", + "properties": { + "control": { + "description": "Indicates the specific action to take", + "type": "string", + "enum": [ + "allow", + "disallow", + "terminate", + "unspecified" + ], + "default": "unspecified" + }, + "log": { + "description": "Indicates if a log will be created when the action is taken. The default value is false.", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + }, + "Data_Group": { + "title": "Data_Group", + "description": "Configures a data group object which contains list of data", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Data_Group" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "storageType": { + "title": "Storage Type", + "description": "Toggles whether the data group is internal or external", + "type": "string", + "enum": [ + "internal", + "external" + ], + "default": "internal" + }, + "keyDataType": { + "title": "Data Type", + "description": "Specifies the type of record keys the data group contains. If string, the value will be escaped by default", + "type": "string", + "enum": [ + "integer", + "ip", + "string" + ] + } + }, + "if": { + "properties": { + "storageType": { + "const": "internal" + } + } + }, + "then": { + "allOf": [ + { + "if": { + "properties": { + "keyDataType": { + "const": "string" + } + } + }, + "then": { + "$ref": "#/definitions/Data_Group_Records_String" + } + }, + { + "if": { + "properties": { + "keyDataType": { + "const": "integer" + } + } + }, + "then": { + "$ref": "#/definitions/Data_Group_Records_Integer" + } + }, + { + "if": { + "properties": { + "keyDataType": { + "const": "ip" + } + } + }, + "then": { + "$ref": "#/definitions/Data_Group_Records_IP" + } + } + ], + "required": [ + "class", + "keyDataType", + "records" + ] + }, + "else": { + "properties": { + "externalFilePath": { + "title": "External File Path", + "description": "Specifies the location (URI) from where the records will be copied", + "allOf": [ + { + "$ref": "#/definitions/Resource_URL" + }, + { + "f5PostProcess": { + "tag": "checkResource" + } + } + ] + }, + "separator": { + "title": "Record Key Value Separator", + "description": "Specifies the character(s) that separate the record key and value", + "type": "string", + "default": ":=" + }, + "ignoreChanges": { + "title": "Ignore changes", + "description": "If false (default), the system updates data group in every BIG-IP AS3 declaration deployment. If true, BIG-IP AS3 creates the data group on first deployment, and leaves it untouched afterwards", + "type": "boolean", + "default": false + }, + "dataGroupFile": { + "$ref": "#/definitions/Pointer_Data_Group_File" + } + }, + "oneOf": [ + { + "required": [ + "class", + "keyDataType", + "externalFilePath" + ] + }, + { + "required": [ + "class", + "keyDataType", + "dataGroupFile" + ] + } + ], + "not": { + "required": [ + "externalFilePath", + "dataGroupFile" + ] + } + } + }, + "Data_Group_Records_Base": { + "title": "Data Group - Records", + "description": "Configures data group records to store", + "type": "object", + "properties": { + "records": { + "title": "Records", + "description": "List of records", + "type": "array", + "items": { + "type": "object", + "description": "A record object to store", + "properties": { + "value": { + "title": "Record value", + "description": "Value to store", + "type": "string" + } + } + } + } + } + }, + "Data_Group_Records_String": { + "description": "A specialization of Data_Group_Records_Base where all items in the records property must be strings.", + "allOf": [ + { + "$ref": "#/definitions/Data_Group_Records_Base" + }, + { + "properties": { + "records": { + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "title": "Record Key", + "description": "Record Identifier", + "type": "string" + } + }, + "required": [ + "key" + ] + } + } + } + } + ] + }, + "Data_Group_Records_Integer": { + "description": "A specialization of Data_Group_Records_Base where all items in the records property must be integers.", + "allOf": [ + { + "$ref": "#/definitions/Data_Group_Records_Base" + }, + { + "properties": { + "records": { + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "title": "Record Key", + "description": "Record Identifier", + "type": "integer" + } + }, + "required": [ + "key" + ] + } + } + } + } + ] + }, + "Data_Group_Records_IP": { + "description": "A specialization of Data_Group_Records_Base where all items in the records property must be IP addresses.", + "allOf": [ + { + "$ref": "#/definitions/Data_Group_Records_Base" + }, + { + "properties": { + "records": { + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "title": "Record Key", + "description": "Record Identifier - string can be ip address or ip address with netmask (if not provided, default is /32)", + "type": "string", + "format": "f5ip" + } + }, + "required": [ + "key" + ] + } + } + } + } + ] + }, + "DNS_Cache": { + "title": "DNS_Cache", + "description": "Configures a DNS cache", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "DNS_Cache" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "type": { + "description": "Type of DNS cache", + "type": "string", + "enum": [ + "transparent", + "resolver", + "validating-resolver" + ] + } + }, + "allOf": [ + { + "if": { + "properties": { + "type": { + "const": "transparent" + } + } + }, + "then": { + "$ref": "#/definitions/DNS_Cache_Transparent" + } + }, + { + "if": { + "properties": { + "type": { + "const": "resolver" + } + } + }, + "then": { + "$ref": "#/definitions/DNS_Cache_Resolver" + } + }, + { + "if": { + "properties": { + "type": { + "const": "validating-resolver" + } + } + }, + "then": { + "$ref": "#/definitions/DNS_Cache_Validating_Resolver" + } + } + ], + "required": [ + "class", + "type" + ] + }, + "DNS_Cache_Transparent": { + "description": "Properties for a DNS transparent cache", + "type": "object", + "properties": { + "answerDefaultZones": { + "description": "Specifies whether the system answers DNS queries for the default zones localhost, reverse 127.0.0.1 and ::1, and AS112", + "type": "boolean", + "default": false + }, + "localZones": { + "description": "Configures resource records that a DNS cache uses to resolve matching DNS queries with authoritative DNS responses", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/DNS_Zone_Local" + } + }, + "messageCacheSize": { + "description": "Specifies the maximum size of the message cache in bytes", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 1048576 + }, + "recordCacheSize": { + "description": "Specifies the maximum size of the resource record (RR) cache in bytes", + "type": "integer", + "minimum": 1, + "maximum": 4294967295, + "default": 10485760 + }, + "recordRotationMethod": { + "description": "Specifies the resource record rotation method used within cached responses", + "type": "string", + "enum": [ + "none", + "query-id" + ], + "default": "none" + } + } + }, + "DNS_Profile": { + "title": "DNS_Profile", + "description": "Configures a Domain Name System (DNS) profile", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "DNS_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "parentProfile": { + "description": "Specifies the name of the object to inherit the settings from", + "allOf": [ + { + "$ref": "#/definitions/Pointer_DNS_Profile" + } + ], + "default": { + "bigip": "/Common/dns" + } + }, + "rapidResponseEnabled": { + "description": "When enabled, if the query name matches a GTM wide IP name and GTM is enabled on this profile, the DNS query will bypass Rapid Response. Note: This setting is supported only on physical BIG-IP hardware because it needs a High-Speed Bridge (HSB) to work. When using BIG-IP Virtual Edition, however, the system does not prevent you from selecting an action, even though the setting is ignored.", + "type": "boolean", + "default": false + }, + "rapidResponseLastAction": { + "description": "Specifies what action the system takes when Rapid Response Mode is enabled and the incoming DNS query does not match a DNS Express Zone", + "type": "string", + "enum": [ + "allow", + "drop", + "noerror", + "nxdomain", + "refuse", + "truncate" + ], + "default": "drop" + }, + "hardwareQueryValidationEnabled": { + "description": "On supported platforms, indicates whether the hardware will accelerate query validation", + "type": "boolean", + "default": false + }, + "hardwareResponseCacheEnabled": { + "description": "On supported platforms, indicates whether the hardware will cache responses", + "type": "boolean", + "default": false + }, + "dnssecEnabled": { + "description": "Specifies whether the system signs responses with DNSSEC keys and replies to DNSSEC specific queries (e.g., DNSKEY query type)", + "type": "boolean", + "default": true + }, + "globalServerLoadBalancingEnabled": { + "description": "Specifies whether the system uses Global Traffic Manager to manage the response", + "type": "boolean", + "default": true + }, + "dnsExpressEnabled": { + "description": "Specifies whether the DNS Express engine is enabled. The DNS Express engine receives zone transfers from the authoritative DNS server for the zone. If the Zone Transfer setting is also enabled on this profile, the DNS Express engine also responds to zone transfer requests made by the nameservers configured as zone transfer clients for the DNS Express zone. ", + "type": "boolean", + "default": true + }, + "cacheEnabled": { + "description": "Specifies whether the system caches DNS responses", + "type": "boolean", + "default": false + }, + "cache": { + "$ref": "#/definitions/Pointer_DNS_Cache" + }, + "dns64Mode": { + "description": "Specifies handling of AAAA and A DNS queries and responses", + "type": "string", + "enum": [ + "disabled", + "secondary", + "immediate", + "v4-only" + ], + "default": "disabled" + }, + "dns64Prefix": { + "description": "Specifies the prefix to use for the IPv6-formatted IP addresses that the system converts to IPv4-formatted IP addresses", + "type": "string", + "default": "0:0:0:0:0:0:0:0" + }, + "dns64AdditionalSectionRewrite": { + "description": "Select an option to allow improved network efficiency for both Unicast and Multicast DNS-SD responses", + "type": "string", + "enum": [ + "disabled", + "v6-only", + "v4-only", + "any" + ], + "default": "disabled" + }, + "unhandledQueryAction": { + "description": "Specifies whether the system uses the local BIND server on the BIG-IP system", + "type": "string", + "enum": [ + "allow", + "drop", + "hint", + "noerror", + "reject" + ], + "default": "allow" + }, + "localBindServerEnabled": { + "description": "Specifies whether the system forwards non-wide IP queries to the local BIND server on the BIG-IP system. For best performance, disable this setting when using a DNS cache.", + "type": "boolean", + "default": true + }, + "zoneTransferEnabled": { + "description": "Specifies whether the system answers zone transfer requests for a DNS zone created on the system. The DNS Express and Zone Transfer settings on a DNS profile affect how the system responds to zone transfer requests. ", + "type": "boolean", + "default": false + }, + "recursionDesiredEnabled": { + "description": "Specifies whether to process client-side DNS packets with Recursion Desired set in the header. If set to Disabled, processing of the packet is subject to the unhandled-query-action option.", + "type": "boolean", + "default": true + }, + "securityEnabled": { + "description": "Specifies whether DNS firewall capability is enabled.", + "type": "boolean", + "default": true + }, + "securityProfile": { + "$ref": "#/definitions/Pointer_DNS_Security_Profile" + }, + "loggingEnabled": { + "description": "Specifies whether to process client-side DNS packets with Recursion Desired set in the header. If set to Disabled, processing of the packet is subject to the unhandled-query-action option.", + "type": "boolean", + "default": true + }, + "loggingProfile": { + "$ref": "#/definitions/Pointer_DNS_Logging_Profile" + }, + "statisticsSampleRate": { + "description": "Sets AVR DNS statistics sampling rate. A value of 0 (zero) means that no query will be sent to the analytics database. A value of 1 means that every query will be sent. A value of n means that every nth query will be sent, and that the analytics database will count that query n times. When sampling rate is greater than one, the statistics will be inaccurate if the traffic volume is low. However, when the traffic volume is high, the system performance will benefit from sampling and the inaccuracy will be negligible. DNS statistics contain query name, query type, virtual server IP and client IP. ", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 0 + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "DNS_TSIG_Key": { + "title": "DNS_TSIG_Key", + "description": "Configures a TSIG key", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "DNS_TSIG_Key" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "algorithm": { + "description": "Specifies the algorithm the system uses to authenticate AXFR zone transfer requests as coming from an approved DNS nameserver, or to authenticate AXFR zone transfers as coming from an approved back-end DNS authoritative server. The algorithm involves a cryptographic hash function in combination with a secret, which is specified in the Secret field. The default is HMAC MD5 (the Hash-based Message Authentication Code MD5).", + "type": "string", + "enum": [ + "hmacmd5", + "hmacsha1", + "hmacsha256" + ], + "default": "hmacmd5" + }, + "secret": { + "description": "Specifies the secret used with the algorithm in the verification process. The secret must be generated by a third-party tool such as BIND's keygen utility; the BIG-IP system does not generate the TSIG key secret.", + "type": "object", + "properties": { + "allowReuse": { + "description": "If true, other declaration objects may reuse this value", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Secret" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "object" + } + }, + { + "f5PostProcess": { + "tag": "secret" + } + } + ] + } + }, + "required": [ + "class", + "secret" + ], + "additionalProperties": false + }, + "DNS_Zone": { + "title": "DNS_Zone", + "description": "Configures a DNS zone", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "DNS_Zone" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "dnsExpress": { + "$ref": "#/definitions/DNS_Zone_DNS_Express" + }, + "responsePolicyEnabled": { + "description": "Specifies if this is a response policy zone. If this is set to yes, this zone may be assigned as an RPZ to a DNS Cache", + "type": "boolean", + "default": false + }, + "serverTsigKey": { + "$ref": "#/definitions/Pointer_DNS_TSIG_Key" + }, + "transferClients": { + "description": "Specifies the DNS nameservers to which the system sends NOTIFY messages. The system allows only the DNS nameservers in the Active column to initiate AXFR zone transfers for this DNS zone.", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_DNS_Nameserver" + } + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "DNS_Zone_DNS_Express": { + "description": "Configure zone DNS Express settings", + "type": "object", + "properties": { + "enabled": { + "description": "Specifies whether DNS Express is enabled to process queries for this zone", + "type": "boolean", + "default": true + }, + "nameserver": { + "description": "Specifies the back-end authoritative DNS server from which the BIG-IP system receives AXFR zone transfers for the DNS Express zone. The options are None and user-defined nameservers.", + "allOf": [ + { + "$ref": "#/definitions/Pointer_DNS_Nameserver" + } + ] + }, + "notifyAction": { + "description": "Specifies the action the system takes when a NOTIFY message is received for this DNS Express zone. NOTIFY responses are assumed to be sent by the authoritative nameserver for the zone, except when the action is Consume, and then DNS Express generates the response. Note: If a TSIG key is configured for the zone, the signature is only validated for Consume and Repeat actions.", + "type": "string", + "enum": [ + "consume", + "bypass", + "repeat" + ], + "default": "consume" + }, + "allowNotifyFrom": { + "description": "Specifies the IP addresses from which the system accepts NOTIFY messages for this DNS Express zone", + "type": "array", + "items": { + "type": "string", + "format": "f5ip" + } + }, + "verifyNotifyTsig": { + "description": "Specifies whether the system verifies the identity of the authoritative nameserver that sends updated information for this DNS Express zone", + "type": "boolean", + "default": true + } + }, + "required": [ + "nameserver" + ], + "additionalProperties": false + }, + "DNS_Zone_Local": { + "description": "Configures resource records that a DNS cache uses to resolve matching DNS queries with authoritative DNS responses", + "type": "object", + "properties": { + "type": { + "description": "Describes how the cache handles a non-matching query for the local zone", + "type": "string", + "enum": [ + "deny", + "redirect", + "refuse", + "static", + "transparent", + "type-transparent" + ], + "default": "transparent" + }, + "records": { + "description": "A or AAAA record entry", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "DNS_Zone_Forward": { + "description": "Manage the set of Forward Zones used by DNS Cache", + "type": "object", + "properties": { + "nameservers": { + "description": "An array of nameservers and ports", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "DNS_Nameserver": { + "title": "DNS_Nameserver", + "description": "Configures a DNS nameserver", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "DNS_Nameserver" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "address": { + "description": "Specifies the IP address on which the DNS nameserver (client) or back-end DNS authoritative server (DNS Express server) listens for DNS messages", + "type": "string", + "default": "127.0.0.1", + "format": "f5ip" + }, + "port": { + "description": "Specifies the service port on which the DNS nameserver (client) or back-end DNS authoritative server (DNS Express server) listens for DNS messages", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 53 + }, + "routeDomain": { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Route_Domain" + } + ], + "default": { + "bigip": "/Common/0" + } + }, + "tsigKey": { + "$ref": "#/definitions/Pointer_DNS_TSIG_Key" + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "DNS_Cache_Resolver": { + "description": "DNS Cache with recursive resolver", + "type": "object", + "properties": { + "allowedQueryTime": { + "description": "The time allowed for a query to stay in the queue before replaced by a new query when the number of concurrent distinct queries exceeds the limit. The default value is 200 milliseconds.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 200 + }, + "answerDefaultZones": { + "description": "Specifies whether the system answers DNS queries for the default zones localhost, reverse 127.0.0.1 and ::1, and AS112", + "type": "boolean", + "default": false + }, + "localZones": { + "description": "Configures resource records that a DNS cache uses to resolve matching DNS queries with authoritative DNS responses", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/DNS_Zone_Local" + } + }, + "maxConcurrentQueries": { + "description": "Maximum number of concurrent queries used by the resolver. The default value is 1024", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 1024 + }, + "maxConcurrentTcp": { + "description": "Maximum number of concurrent TCP flows used by the resolver. The default value is 20", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 20 + }, + "maxConcurrentUdp": { + "description": "Maximum number of concurrent UDP flows used by the resolver. The default value is 8192", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 8192 + }, + "msgCacheSize": { + "description": "Number of bytes allocated for the message cache. The default value is 1m", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 1048576 + }, + "nameserverCacheCount": { + "description": "Number of DNS nameservers to cache. The default value is 16k", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 16536 + }, + "randomizeQueryNameCase": { + "description": "Enables resolver to randomize the case of query names. The default value is yes", + "type": "boolean", + "default": true + }, + "forwardZones": { + "description": "Manage the set of Forward Zones used by this DNS Cache", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/DNS_Zone_Forward" + } + }, + "rootHints": { + "description": "List of IP addresses to use for root name servers. Defaults are known Internet root servers.", + "type": "array", + "items": { + "type": "string" + } + }, + "routeDomain": { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Route_Domain" + } + ], + "default": { + "bigip": "/Common/0" + } + }, + "recordCacheSize": { + "description": "Number of bytes allocated for the resource record set cache. The default value is 10m", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 10485760 + }, + "recordRotationMethod": { + "description": "Select which resource record set rotation method should be used on cache responses", + "type": "string", + "enum": [ + "none", + "query-id" + ], + "default": "none" + }, + "unwantedQueryReplyThreshold": { + "description": "The threshold count of unsolicited query replies which triggers an alert (potential DOS attack underway). The default value is 0 (or off)", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 0 + }, + "useIpv4": { + "description": "Enables resolver to issue IPv4 queries. The default value is yes", + "type": "boolean", + "default": true + }, + "useIpv6": { + "description": "Enables resolver to issue IPv6 queries. The default value is yes", + "type": "boolean", + "default": true + }, + "useTcp": { + "description": "Enables resolver to issue tcp queries. The default value is yes", + "type": "boolean", + "default": true + }, + "useUdp": { + "description": "Enables resolver to issue udp queries. The default value is yes", + "type": "boolean", + "default": true + } + } + }, + "DNS_Cache_Validating_Resolver": { + "description": "DNS Cache with recursive resolver and DNSSEC validation", + "type": "object", + "properties": { + "allowedQueryTime": { + "description": "The time allowed for a query to stay in the queue before replaced by a new query when the number of concurrent distinct queries exceeds the limit. The default value is 200 milliseconds.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 200 + }, + "answerDefaultZones": { + "description": "Specifies whether the system answers DNS queries for the default zones localhost, reverse 127.0.0.1 and ::1, and AS112", + "type": "boolean", + "default": false + }, + "ignoreCd": { + "description": "Ignore client queries setting of checking-disabled. Perform validation anyway and only return secure answers. The default value is no", + "type": "boolean", + "default": false + }, + "keyCacheSize": { + "description": "Number of bytes allocated for the DNSKEY cache. The default value is 1m", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 1048576 + }, + "localZones": { + "description": "Configures resource records that a DNS cache uses to resolve matching DNS queries with authoritative DNS responses", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/DNS_Zone_Local" + } + }, + "maxConcurrentQueries": { + "description": "Maximum number of concurrent queries used by the resolver. The default value is 1024", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 1024 + }, + "maxConcurrentTcp": { + "description": "Maximum number of concurrent TCP flows used by the resolver. The default value is 20", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 20 + }, + "maxConcurrentUdp": { + "description": "Maximum number of concurrent UDP flows used by the resolver. The default value is 8192", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 8192 + }, + "msgCacheSize": { + "description": "Number of bytes allocated for the message cache. The default value is 1m", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 1048576 + }, + "nameserverCacheCount": { + "description": "Number of DNS nameservers to cache. The default value is 16k", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 16536 + }, + "prefetchKey": { + "description": "Fetch DNSKEY early in validation process. The default value is yes", + "type": "boolean", + "default": true + }, + "randomizeQueryNameCase": { + "description": "Enables resolver to randomize the case of query names. The default value is yes", + "type": "boolean", + "default": true + }, + "forwardZones": { + "description": "Manage the set of Forward Zones used by this DNS Cache", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/DNS_Zone_Forward" + } + }, + "rootHints": { + "description": "List of IP addresses to use for root name servers. Defaults are known Internet root servers.", + "type": "array", + "items": { + "type": "string" + } + }, + "routeDomain": { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Route_Domain" + } + ], + "default": { + "bigip": "/Common/0" + } + }, + "recordCacheSize": { + "description": "Number of bytes allocated for the resource record set cache. The default value is 10m", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 10485760 + }, + "recordRotationMethod": { + "description": "Select which resource record set rotation method should be used on cache responses", + "type": "string", + "enum": [ + "none", + "query-id" + ], + "default": "none" + }, + "trustAnchors": { + "description": "List of DNSKEY or DS resource records used to establish DNSSEC validator trust. Specified in string form (e.g. dig or drill format). The default is none", + "type": "array", + "items": { + "type": "string" + } + }, + "unwantedQueryReplyThreshold": { + "description": "The threshold count of unsolicited query replies which triggers an alert (potential DOS attack underway). The default value is 0 (or off)", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 0 + }, + "useIpv4": { + "description": "Enables resolver to issue IPv4 queries. The default value is yes", + "type": "boolean", + "default": true + }, + "useIpv6": { + "description": "Enables resolver to issue IPv6 queries. The default value is yes", + "type": "boolean", + "default": true + }, + "useTcp": { + "description": "Enables resolver to issue tcp queries. The default value is yes", + "type": "boolean", + "default": true + }, + "useUdp": { + "description": "Enables resolver to issue udp queries. The default value is yes", + "type": "boolean", + "default": true + } + } + }, + "DOS_Profile": { + "title": "DOS_Profile", + "description": "Configures a Denial of Service (DOS) profile", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm", + "asm" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "DOS_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "application": { + "description": "Application security sub-profile", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "asm" + ] + } + }, + { + "$ref": "#/definitions/DOS_Profile_Application" + } + ] + }, + "network": { + "description": "Network security sub-profile", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + } + }, + { + "$ref": "#/definitions/DOS_Profile_Network" + } + ] + }, + "protocolDNS": { + "description": "DNS protocol security sub-profile", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + } + }, + { + "$ref": "#/definitions/DOS_Profile_Protocol_DNS" + } + ] + }, + "protocolSIP": { + "description": "SIP protocol security sub-profile", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + } + }, + { + "$ref": "#/definitions/DOS_Profile_Protocol_SIP" + } + ] + }, + "allowlist": { + "description": "Specifies the default allowlist address list for the system to use to determine which IP addresses are legitimate. The system does not examine traffic from the IP addresses in the list when performing DoS prevention. This property is available on BIGIP 14.1 and above.", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Address_List" + } + ] + }, + "whitelist": { + "description": "Deprecated. Replaced with functionally equivalent allowlist. Specifies the default allowlist address list for the system to use to determine which IP addresses are legitimate. The system does not examine traffic from the IP addresses in the list when performing DoS prevention. This property is available on BIGIP 14.1 and above.", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Address_List" + } + ] + }, + "applicationAllowlist": { + "description": "Specifies the IP addresses and subnets allowlist configuration for Application Security (Overrides the global allowlist)", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "asm" + ] + } + }, + { + "$ref": "#/definitions/Pointer_Address_List" + } + ] + }, + "applicationWhitelist": { + "description": "Deprecated. Replaced with functionally equivalent applicationAllowlist. Specifies the IP addresses and subnets allowlist configuration for Application Security (Overrides the global allowlist)", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "asm" + ] + } + }, + { + "$ref": "#/definitions/Pointer_Address_List" + } + ] + } + }, + "additionalProperties": false, + "f5aliases": { + "allowlist": "whitelist", + "applicationAllowlist": "applicationWhitelist" + } + }, + "DOS_Auto_Denylist_Settings": { + "description": "Adds the source IP address to the denylist category assigned to the Denial-of-Service (DoS) vector", + "type": "object", + "properties": { + "enabled": { + "description": "Specifies if automatic denylist management should be used", + "type": "boolean", + "default": false + }, + "category": { + "description": "Specifies the denylist category assigned to the DoS vector. The settings for this category determine IP Intelligence actions, logging settings, and denylist publisher settings.", + "default": { + "bigip": "/Common/denial_of_service" + }, + "allOf": [ + { + "$ref": "#/definitions/Pointer_Denylist_Category" + } + ] + }, + "attackDetectionTime": { + "description": "Specifies the time in seconds before a vector is denylisted", + "type": "integer", + "minimum": 1, + "maximum": 4294967295, + "default": 60 + }, + "categoryDuration": { + "description": "Specifies the time in seconds before the denylist entry is removed", + "type": "integer", + "minimum": 60, + "maximum": 4294967295, + "default": 14400 + }, + "externalAdvertisementEnabled": { + "description": "Specifies that addresses that are identified for denylisting are advertised to BGP routers, as configured per denylist category in Blacklist Publisher", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + }, + "DOS_Bad_Actor_Detection_Settings": { + "description": "Bad actor detection allows automatic detection, logging, and rate limiting of specific IP addresses that appear to be the source of an attack, based on criteria you configure.", + "type": "object", + "properties": { + "enabled": { + "description": "Specifies that Bad Actor detection is enabled", + "type": "boolean", + "default": false + }, + "sourceDetectionThreshold": { + "description": "Specifies the number of packets per second to identify an IP address as a bad actor", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 4294967295 + }, + "sourceMitigationThreshold": { + "description": "Specifies the rate limit applied to a source IP that is identified as a bad actor", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 4294967295 + } + }, + "additionalProperties": false + }, + "DOS_Profile_Application_Heavy_URL": { + "description": "Heavy URLs are a small number of site URLs that might consume considerable server resources per request. Heavy URLs respond with low latency most of the time, but may easily reach high latency under specific conditions. Heavy URLs are not necessarily heavy all the time, but are potentially heavy, especially during DoS attacks. It only takes a low rate of requests to heavy URLs in order to cause DoS attacks. When an attack is suspected, the system protects the heavy URLs using the by URL methods that you enabled in TPS-based Detection and Behavioral & Stress-based Detection. If no URL-based methods are enabled there, the system only reports attacks.", + "type": "object", + "properties": { + "automaticDetectionEnabled": { + "description": "Mark a URL as heavy if its portion of transactions with latency above the specified threshold is higher than usual for this site", + "type": "boolean", + "default": true + }, + "detectionThreshold": { + "description": "Specifies the latency threshold for automatic heavy URL detection (in milliseconds)", + "type": "integer", + "minimum": 16, + "maximum": 4294967295, + "default": 1000 + }, + "excludeList": { + "description": "URLs the system should not consider heavy even if the system automatically detects them as being heavy. This list may contain prefix wildcards.", + "type": "array", + "items": { + "type": "string" + } + }, + "protectList": { + "description": "URLs you expect to be heavy even if the system does not automatically detect them as being heavy", + "type": "array", + "items": { + "type": "object", + "properties": { + "url": { + "description": "URL to protect", + "type": "string" + }, + "threshold": { + "description": "Threshold for detection in requests per second", + "type": "integer", + "minimum": 0, + "maximum": 4294967295 + } + }, + "additionalProperties": false, + "required": [ + "url", + "threshold" + ] + } + } + }, + "additionalProperties": false + }, + "DOS_Profile_Application_Captcha": { + "description": "Specifies the text the system sends, during a suspected DoS event, to users after it challenges users with the first CAPTCHA response, and the text the system sends to users after they fail a CAPTCHA response.", + "type": "object", + "properties": { + "first": { + "description": "Specifies the content that the system displays to a user the first time the user is asked to respond to a CAPTCHA", + "type": "string", + "maxLength": 65520 + }, + "failure": { + "description": "Specifies the content the system displays to a user after the user fails to correctly answer a CAPTCHA", + "type": "string", + "maxLength": 65520 + } + }, + "additionalProperties": false + }, + "DOS_Profile_Application_Bot_Defense": { + "description": "BIG-IP AS3 provides defense against bot attacks by detecting and stopping them before the attacks start to grow, by performing the following:\n\n* The system sends a client-side JavaScript challenge to the browser.\n* If the challenge is met, the system adds a cookie to the second request. This cookie is active until the session ends, and the system does not add any more cookies to further requests during that session.\n* The system drops requests sent by browsers that do not answer the system’s initial JavaScript challenge, assuming they are bots that do not support JavaScript.\n\nNote: This feature requires browsers to allow JavaScript.\n\nImportant: The proactive bot defense feature works also in Transparent mode. This means that the system will replace responses with client side JavaScript also in Transparent mode, and if the client cannot run JavaScript, it will not be able to receive the server responses.\n\nImportant: If you enable Proactive Bot Defense and your web site uses CORS (Cross-Origin Resource Sharing), we recommend that you add the CORS URLs to the proactive bot URL allowlist.\n\nThis method is intended to complement, not replace, the other mitigation methods.", + "type": "object", + "properties": { + "mode": { + "description": "Specifies the conditions under which bots are detected and blocked", + "type": "string", + "enum": [ + "off", + "during-attacks", + "always" + ], + "default": "off" + }, + "blockSuspiscousBrowsers": { + "$comment": "maps to application.bot-defense.browser-legit-enabled", + "description": "Detect and block requests from highly suspicious browsers", + "type": "boolean", + "default": true + }, + "issueCaptchaChallenge": { + "$comment": "maps to application.bot-defense.browser-legit-captcha", + "description": "Issue CAPTCHA challenges to moderately suspicious browsers", + "type": "boolean", + "default": true + }, + "gracePeriod": { + "description": "The length of time (in seconds) before the system blocks suspected bots. The grace period allows web application pages with both HTML and non-HTML (like images, JS, and CSS) to load completely without being blocked. The grace period starts after client validation, a configuration change, or when proactive bot defense is activated as a result of a detected attack or high latency. This property is available on BIGIP 14.1 and above.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 300 + }, + "crossDomainRequests": { + "description": "Specifies how the system responds when receiving a request for non-HTML resources (images, CSS, XML, JavaScript, and Flash) without a valid cookie, and has a Referer header with a different domain than the host domain. This property is available on BIGIP 14.1 and above.", + "type": "string", + "enum": [ + "allow-all", + "validate-bulk", + "validate-upon-request" + ], + "default": "allow-all" + }, + "siteDomains": { + "description": "Specifies how the system responds when receiving a request for non-HTML resources (images, CSS, XML, JavaScript, and Flash) without a valid cookie, and has a Referer header with a different domain than the host domain. This property is available on BIGIP 14.1 and above.", + "type": "array", + "items": { + "type": "string" + } + }, + "externalDomains": { + "description": "Specifies the external referring domains (that are not part of your website) that are allowed to link to resources in your website. These domains are not protected with proactive bot defense, but the system allows them if they pass the system's redirect-cookie challenge. This property is available on BIGIP 14.1 and above.", + "type": "array", + "items": { + "type": "string" + } + }, + "urlAllowlist": { + "description": "Specifies excluded URLs. Requests to these URLs will not be blocked by Proactive Bot Defense, although they may still be blocked by the TPS-based / Stress-based attack mitigation", + "type": "array", + "items": { + "type": "string" + } + }, + "urlWhitelist": { + "description": "Deprecated. Replaced with functionally equivalent urlAllowlist. Specifies excluded URLs. Requests to these URLs will not be blocked by Proactive Bot Defense, although they may still be blocked by the TPS-based / Stress-based attack mitigation", + "type": "array", + "items": { + "type": "string" + } + } + }, + "f5aliases": { + "urlAllowlist": "urlWhitelist" + }, + "dependencies": { + "issueCaptchaChallenge": { + "if": { + "properties": { + "issueCaptchaChallenge": { + "const": true + } + } + }, + "then": { + "properties": { + "blockSuspiscousBrowsers": { + "const": true + } + } + } + }, + "siteDomains": { + "properties": { + "crossDomainRequests": { + "enum": [ + "validate-bulk", + "validate-upon-request" + ] + } + } + }, + "externalDomains": { + "properties": { + "crossDomainRequests": { + "enum": [ + "validate-bulk", + "validate-upon-request" + ] + } + } + } + }, + "additionalProperties": false + }, + "DOS_Profile_Application_Bot_Signatures": { + "description": "This feature automatically detects well known bots according to their HTTP characteristics. Malicious bots can be configured to be blocked, while benign bots can be configured to pass through the anti-bot defense mechanisms.", + "type": "object", + "properties": { + "checkingEnabled": { + "description": "Specifies the system uses signatures to check whether a bot is benign or malicious", + "type": "boolean", + "default": false + }, + "blockedCategories": { + "description": "The system blocks and reports requests that match signatures in this list of categories", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Bot_Signature_Category" + } + }, + "reportedCategories": { + "description": "The system logs requests that match signatures in this list of categories and counts them in the DoS reports", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Bot_Signature_Category" + } + }, + "disabledSignatures": { + "description": "A list of signatures the system ignores when it matches requests with configured bot signatures", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Bot_Signature" + } + } + }, + "additionalProperties": false + }, + "DOS_Profile_Application_Mobile_Defense": { + "description": "When enabled, requests from mobile applications built with the Anti-Bot Mobile SDK will be detected and handled according to the setting configured here. When disabled, these requests will be handled like any other request, meaning that they may let attacks in or cause false positives. Mobile application traffic will be treated differently than other clients, e.g. browsers, in security policies. For this reason, even when DoS protection is not required in a security policy, you still must set a DoS profile with mobile application protection enabled.", + "type": "object", + "properties": { + "enabled": { + "description": "When enabled, requests from mobile applications built with Anti-Bot Mobile SDK will be detected and handled according to the settings below. When disabled, these requests will be handled like any other request which may let attacks in, or cause false positives.", + "type": "boolean", + "default": false + }, + "allowAndroidPublishers": { + "description": "Publisher certificates to allow. All others are blocked. An empty list allows all publishers.", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_SSL_Certificate" + } + }, + "allowAndroidRootedDevice": { + "description": "Select to allow traffic from rooted Android devices", + "type": "boolean", + "default": false + }, + "allowIosPackageNames": { + "description": "Package names to allow. All others are blocked. An empty list allows all package names.", + "type": "array", + "items": { + "type": "string" + } + }, + "allowJailbrokenDevices": { + "description": "Select to allow traffic from jailbroken iOS devices", + "type": "boolean", + "default": false + }, + "allowEmulators": { + "description": "Select to allow traffic from applications run on emulators", + "type": "boolean", + "default": false + }, + "clientSideChallengeMode": { + "description": "Specifies the action to take when a CAPTCHA or Client Side Integrity challenge needs to be presented", + "type": "string", + "enum": [ + "pass", + "challenge" + ], + "default": "pass" + } + }, + "additionalProperties": false + }, + "DOS_Profile_Application_Detection_IP": { + "description": "Specifies the criteria that determines when the system treats a source IP address as an attacker", + "type": "object", + "properties": { + "minimumTps": { + "description": "The minimum number of transactions per second before a source can be considered an attacking entity. This condition and the increase rate condition must be met for a source to be considered an attacking entity.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 40 + }, + "tpsIncreaseRate": { + "description": "The transactions per second increase (as a percentage) that must occur before a source can be considered an attacking entity. This condition and the minimum TPS condition must be met for a source to be considered an attacking entity.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 500 + }, + "maximumTps": { + "description": "The maximum number of transactions per second before a source is always considered an attacking entity", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 200 + }, + "minimumAutoTps": { + "description": "Minimum number of transactions per second of an auto-calculated threshold before a source is considered an attacking entity", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 5 + }, + "maximumAutoTps": { + "description": "Maximum number of transactions per second of an auto-calculated threshold before a source is considered an attacking entity", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 5000 + }, + "clientSideDefenseEnabled": { + "description": "Specifies, when enabled, that if traffic meets the detection conditions, the system issues a client-side integrity challenge that will consume computation resources from the client and slow its attack rate. The system issues a client-side integrity challenge to determine whether the client is a legal browser or an illegal script by sending a JavaScript challenge and waiting for a response. (Legal browsers are able to respond, while illegal scripts cannot.)", + "type": "boolean", + "default": false + }, + "captchaChallengeEnabled": { + "description": "Specifies, when enabled, that if traffic meets the detection conditions, the system issues a CAPTCHA challenge to determine whether the client is a legal browser with a human user behind it, or an illegal script. (Legal browsers with human users behind them are able to respond, while illegal scripts cannot.)", + "type": "boolean", + "default": false + }, + "rateLimitingEnabled": { + "description": "Specifies, when enabled, that if traffic meets the detection conditions, the system applies rate limiting to the traffic", + "type": "boolean", + "default": true + }, + "rateLimitingMode": { + "description": "Specifies if rate limiting should block all traffic ('block-all') or apply normal rate limiting ('rate-limit').", + "type": "string", + "enum": [ + "rate-limit", + "block-all" + ], + "default": "rate-limit" + } + }, + "additionalProperties": false + }, + "DOS_Profile_Application_Detection_Device": { + "description": "Specifies the criteria that determines when the system treats a device as an attacker", + "type": "object", + "properties": { + "minimumTps": { + "description": "The minimum number of transactions per second before a source can be considered an attacking entity. This condition and the increase rate condition must be met for a source to be considered an attacking entity.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 40 + }, + "tpsIncreaseRate": { + "description": "The transactions per second increase (as a percentage) that must occur before a source can be considered an attacking entity. This condition and the minimum TPS condition must be met for a source to be considered an attacking entity.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 500 + }, + "maximumTps": { + "description": "The maximum number of transactions per second before a source is always considered an attacking entity", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 200 + }, + "minimumAutoTps": { + "description": "Minimum number of transactions per second of an auto-calculated threshold before a source is considered an attacking entity", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 5 + }, + "maximumAutoTps": { + "description": "Maximum number of transactions per second of an auto-calculated threshold before a source is considered an attacking entity", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 5000 + }, + "clientSideDefenseEnabled": { + "description": "Specifies, when enabled, that if traffic meets the detection conditions, the system issues a client-side integrity challenge that will consume computation resources from the client and slow its attack rate. The system issues a client-side integrity challenge to determine whether the client is a legal browser or an illegal script by sending a JavaScript challenge and waiting for a response. (Legal browsers are able to respond, while illegal scripts cannot.)", + "type": "boolean", + "default": false + }, + "captchaChallengeEnabled": { + "description": "Specifies, when enabled, that if traffic meets the detection conditions, the system issues a CAPTCHA challenge to determine whether the client is a legal browser with a human user behind it, or an illegal script. (Legal browsers with human users behind them are able to respond, while illegal scripts cannot.)", + "type": "boolean", + "default": false + }, + "rateLimitingEnabled": { + "description": "Specifies, when enabled, that if traffic meets the detection conditions, the system applies rate limiting to the traffic", + "type": "boolean", + "default": false + }, + "rateLimitingMode": { + "description": "Specifies if rate limiting should block all traffic ('block-all') or apply normal rate limiting ('rate-limit').", + "type": "string", + "enum": [ + "rate-limit", + "block-all" + ], + "default": "rate-limit" + } + }, + "additionalProperties": false + }, + "DOS_Profile_Application_Detection_Geolocation": { + "description": "Specifies the criteria that determines when the system treats a geolocation as an attacker", + "type": "object", + "properties": { + "minimumShare": { + "description": "The minimum share of traffic (as a percentage) before a source can be considered an attacking entity. This condition and the share increase rate condition must be met for a source to be considered an attacking entity.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 10 + }, + "shareIncreaseRate": { + "description": "The share increase (as a percentage) that must occur before a source can be considered an attacking entity. This condition and the minimum share condition must be met for a source to be considered an attacking entity.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 500 + }, + "minimumAutoTps": { + "description": "Minimum number of transactions per second of an auto-calculated threshold before a source is considered an attacking entity", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 50 + }, + "maximumAutoTps": { + "description": "Maximum number of transactions per second of an auto-calculated threshold before a source is considered an attacking entity", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 20000 + }, + "clientSideDefenseEnabled": { + "description": "Specifies, when enabled, that if traffic meets the detection conditions, the system issues a client-side integrity challenge that will consume computation resources from the client and slow its attack rate. The system issues a client-side integrity challenge to determine whether the client is a legal browser or an illegal script by sending a JavaScript challenge and waiting for a response. (Legal browsers are able to respond, while illegal scripts cannot.)", + "type": "boolean", + "default": false + }, + "captchaChallengeEnabled": { + "description": "Specifies, when enabled, that if traffic meets the detection conditions, the system issues a CAPTCHA challenge to determine whether the client is a legal browser with a human user behind it, or an illegal script. (Legal browsers with human users behind them are able to respond, while illegal scripts cannot.)", + "type": "boolean", + "default": false + }, + "rateLimitingEnabled": { + "description": "Specifies, when enabled, that if traffic meets the detection conditions, the system applies rate limiting to the traffic", + "type": "boolean", + "default": false + }, + "rateLimitingMode": { + "description": "Specifies if rate limiting should block all traffic ('block-all') or apply normal rate limiting ('rate-limit').", + "type": "string", + "enum": [ + "rate-limit", + "block-all" + ], + "default": "rate-limit" + } + }, + "additionalProperties": false + }, + "DOS_Profile_Application_Detection_URL": { + "description": "Specifies the criteria that determines when the system treats a URL as an attacker", + "type": "object", + "properties": { + "minimumTps": { + "description": "The minimum number of transactions per second before a source can be considered an attacking entity. This condition and the increase rate condition must be met for a source to be considered an attacking entity.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 200 + }, + "tpsIncreaseRate": { + "description": "The transactions per second increase (as a percentage) that must occur before a source can be considered an attacking entity. This condition and the minimum TPS condition must be met for a source to be considered an attacking entity.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 500 + }, + "maximumTps": { + "description": "The maximum number of transactions per second before a source is always considered an attacking entity", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 1000 + }, + "minimumAutoTps": { + "description": "Minimum number of transactions per second of an auto-calculated threshold before a source is considered an attacking entity", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 5 + }, + "maximumAutoTps": { + "description": "Maximum number of transactions per second of an auto-calculated threshold before a source is considered an attacking entity", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 5000 + }, + "heavyURLProtectionEnabled": { + "description": "Specifies, when enabled, that heavy URL protection should be enabled", + "type": "boolean", + "default": true + }, + "clientSideDefenseEnabled": { + "description": "Specifies, when enabled, that if traffic meets the detection conditions, the system issues a client-side integrity challenge that will consume computation resources from the client and slow its attack rate. The system issues a client-side integrity challenge to determine whether the client is a legal browser or an illegal script by sending a JavaScript challenge and waiting for a response. (Legal browsers are able to respond, while illegal scripts cannot.)", + "type": "boolean", + "default": false + }, + "captchaChallengeEnabled": { + "description": "Specifies, when enabled, that if traffic meets the detection conditions, the system issues a CAPTCHA challenge to determine whether the client is a legal browser with a human user behind it, or an illegal script. (Legal browsers with human users behind them are able to respond, while illegal scripts cannot.)", + "type": "boolean", + "default": false + }, + "rateLimitingEnabled": { + "description": "Specifies, when enabled, that if traffic meets the detection conditions, the system applies rate limiting to the traffic", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false + }, + "DOS_Profile_Application_Detection_Site": { + "description": "Specifies the criteria that determines when the system treats a site as an attacker", + "type": "object", + "properties": { + "minimumTps": { + "description": "The minimum number of transactions per second before a source can be considered an attacking entity. This condition and the increase rate condition must be met for a source to be considered an attacking entity.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 2000 + }, + "tpsIncreaseRate": { + "description": "The transactions per second increase (as a percentage) that must occur before a source can be considered an attacking entity. This condition and the minimum TPS condition must be met for a source to be considered an attacking entity.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 500 + }, + "maximumTps": { + "description": "The maximum number of transactions per second before a source is always considered an attacking entity", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 10000 + }, + "minimumAutoTps": { + "description": "Minimum number of transactions per second of an auto-calculated threshold before a source is considered an attacking entity", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 5 + }, + "maximumAutoTps": { + "description": "Maximum number of transactions per second of an auto-calculated threshold before a source is considered an attacking entity", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 20000 + }, + "clientSideDefenseEnabled": { + "description": "Specifies, when enabled, that if traffic meets the detection conditions, the system issues a client-side integrity challenge that will consume computation resources from the client and slow its attack rate. The system issues a client-side integrity challenge to determine whether the client is a legal browser or an illegal script by sending a JavaScript challenge and waiting for a response. (Legal browsers are able to respond, while illegal scripts cannot.)", + "type": "boolean", + "default": false + }, + "captchaChallengeEnabled": { + "description": "Specifies, when enabled, that if traffic meets the detection conditions, the system issues a CAPTCHA challenge to determine whether the client is a legal browser with a human user behind it, or an illegal script. (Legal browsers with human users behind them are able to respond, while illegal scripts cannot.)", + "type": "boolean", + "default": false + }, + "rateLimitingEnabled": { + "description": "Specifies, when enabled, that if traffic meets the detection conditions, the system applies rate limiting to the traffic", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + }, + "DOS_Profile_Application_Rate_Based_Detection": { + "description": "Configure the system to prevent DoS attacks based on the client side transactions per second (TPS-based detection mode). The system considers traffic to be a DoS attack based on the following calculations:\n\n* Transaction rate detection interval: The average number of requests per second sent. This is the TPS value that triggered the attack. This number is calculated by the system, by default, every ten seconds.\n* Transaction rate history interval: The average number of requests per second sent. This number is the average number of transactions for the past hour, and it is updated every 10 seconds.\n\nIn TPS-based detection mode, if the ratio of the transaction rate detection interval to the transaction rate history interval is greater than the specific percentage configured, the system detects the URL/site to be under attack, or the IP address/geolocation to be attacking. In order to stop the attack, the system blocks some, or all, requests from the detected IP address/geolocation and/to the attacked URL/site, depending on the configuration of the DoS profile.", + "type": "object", + "properties": { + "operationMode": { + "description": "Specifies how the system reacts when it detects an attack", + "type": "string", + "enum": [ + "off", + "transparent", + "blocking" + ], + "default": "off" + }, + "thresholdsMode": { + "description": "Specifies what type of thresholds to use", + "type": "string", + "enum": [ + "manual", + "automatic" + ], + "default": "manual" + }, + "escalationPeriod": { + "description": "Specifies the minimum time spent in each mitigation step before the system moves to the next mitigation step when preventing a DoS attack. After the system detects a DoS attack, it performs attack prevention for the amount of time specified here for every method that is enabled. If after this period the attack has not been fully stopped, the system escalates to the next enabled prevention step.", + "type": "integer", + "minimum": 1, + "maximum": 3600, + "default": 120 + }, + "deEscalationPeriod": { + "description": "When preventing a DoS attack, specifies the time spent since the mitigation started until retrying the steps from the beginning of the enabled methods. If the value is 0, no de-escalation occurs.", + "type": "integer", + "minimum": 0, + "maximum": 86400, + "default": 7200 + }, + "sourceIP": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Detection_IP" + } + ], + "default": {} + }, + "deviceID": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Detection_Device" + } + ], + "default": {} + }, + "geolocation": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Detection_Geolocation" + } + ], + "default": {} + }, + "url": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Detection_URL" + } + ], + "default": {} + }, + "site": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Detection_Site" + } + ], + "default": {} + } + }, + "additionalProperties": false + }, + "DOS_Profile_Application_Stress_Based_Detection_Bad_Actor": { + "description": "Specifies properties of Behavioral Detection in Stress-based anomaly.\n\nThe following mitigation options are available:\n\n* Conservative protection: If detectionEnabled is true, slows down and rate limits requests from anomalous IP addresses based on its anomaly detection confidence and the server's health. If signatureDetectionEnabled is true, blocks requests that match the attack signatures.\n* Standard protection: If detectionEnabled is true, slows down requests from anomalous IP addresses based on its anomaly detection confidence and the server's health. Rate limits requests from anomalous IP addresses and, if necessary, rate limits all requests based on the server's health. Limits the number of concurrent connections from anomalous IP addresses and, if necessary, limits the number of all concurrent connections based on the server's health. If signatureDetectionEnabled is true, blocks requests that match the attack signatures.\n* Aggressive protection: If detectionEnabled is true, slows down requests from anomalous IP addresses based on its anomaly detection confidence and the server's health. Rate limits requests from anomalous IP addresses and, if necessary, rate limits all requests based on the server's health. Limits the number of concurrent connections from anomalous IP addresses and, if necessary, limits the number of all concurrent connections based on the server's health. Proactively performs all protection actions (even before an attack). Increases the impact of the protection techniques. If signatureDetectionEnabled is true, blocks requests that match the attack signatures. Increases the impact of blocked requests.", + "type": "object", + "properties": { + "detectionEnabled": { + "description": "Enables traffic behavior, server's capacity learning, and anomaly detection", + "type": "boolean", + "default": false + }, + "signatureDetectionEnabled": { + "description": "Enables request signature detection", + "type": "boolean", + "default": false + }, + "useApprovedSignaturesOnly": { + "description": "Limits request signature detection to approved signatures only", + "type": "boolean", + "default": false + }, + "mitigationMode": { + "description": "Specifies mitigation impact on suspicious bad actors/requests", + "type": "string", + "enum": [ + "none", + "conservative", + "standard", + "aggressive" + ], + "default": "none" + }, + "acceleratedSignaturesEnabled": { + "description": "Enables signature detection before the connection establishment", + "type": "boolean", + "default": false + }, + "tlsSignaturesEnabled": { + "description": "Enables tls signature detection before the connection establishment. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + }, + "DOS_Profile_Application_Stress_Based_Detection": { + "description": "Configure the system to prevent DoS attacks based on the server’s health condition. An attack is detected if the system finds the server to be under stress and either of the TPS thresholds are crossed.", + "type": "object", + "properties": { + "operationMode": { + "description": "Specifies how the system reacts when it detects an attack", + "type": "string", + "enum": [ + "off", + "transparent", + "blocking" + ], + "default": "off" + }, + "thresholdsMode": { + "description": "Specifies what type of thresholds to use", + "type": "string", + "enum": [ + "manual", + "automatic" + ], + "default": "manual" + }, + "escalationPeriod": { + "description": "Specifies the minimum time spent in each mitigation step before the system moves to the next mitigation step when preventing a DoS attack. After the system detects a DoS attack, it performs attack prevention for the amount of time specified here for every method that is enabled. If after this period the attack has not been fully stopped, the system escalates to the next enabled prevention step.", + "type": "integer", + "minimum": 1, + "maximum": 3600, + "default": 120 + }, + "deEscalationPeriod": { + "description": "When preventing a DoS attack, specifies the time spent since the mitigation started until retrying the steps from the beginning of the enabled methods. If the value is 0, no de-escalation occurs.", + "type": "integer", + "minimum": 0, + "maximum": 86400, + "default": 7200 + }, + "sourceIP": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Detection_IP" + } + ], + "default": {} + }, + "deviceID": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Detection_Device" + } + ], + "default": {} + }, + "geolocation": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Detection_Geolocation" + } + ], + "default": {} + }, + "url": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Detection_URL" + } + ], + "default": {} + }, + "site": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Detection_Site" + } + ], + "default": {} + }, + "badActor": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Stress_Based_Detection_Bad_Actor" + } + ], + "default": {} + } + }, + "additionalProperties": false + }, + "DOS_Profile_Application_TCP_Dump": { + "description": "Configure settings to record traffic (perform a TCP dump) when a DoS attack is underway, in order to diagnose the attack vectors and attackers, observe whether and how it was mitigated, and draw conclusions for changing the DoS profile configuration.", + "type": "object", + "properties": { + "recordTrafficEnabled": { + "description": "Enables the recording of traffic during attacks", + "type": "boolean", + "default": false + }, + "maximumDuration": { + "description": "Configures the maximum time for each TCP dump recording cycle", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 30 + }, + "maximumSize": { + "description": "Configures the maximum size (in MB) for each TCP dump recording cycle", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 10 + }, + "repetitionInterval": { + "description": "Allow multiple TCP dumps to be recorded during a single DoS attack", + "oneOf": [ + { + "type": "string", + "const": "once-per-attack" + }, + { + "type": "integer", + "minimum": 0, + "maximum": 4294967295 + } + ], + "default": 120 + } + }, + "additionalProperties": false + }, + "DOS_Profile_Application": { + "description": "Specifies the conditions for determining that your application is under a DoS attack, and how the system reacts to a suspected attack.", + "type": "object", + "properties": { + "heavyURLProtection": { + "description": "Configure Heavy URL include list, automatic detection, and exclude list", + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Heavy_URL" + } + ], + "default": {} + }, + "denylistedGeolocations": { + "description": "Override the DoS profile’s geolocation rate based threshold settings by selecting countries from which to block traffic during a DoS attack", + "type": "array", + "items": { + "type": "string" + } + }, + "blacklistedGeolocations": { + "description": "Deprecated. Replaced with functionally equivalent denylistedGeolocations. Override the DoS profile’s geolocation rate based threshold settings by selecting countries from which to block traffic during a DoS attack", + "type": "array", + "items": { + "type": "string" + } + }, + "allowlistedGeolocations": { + "description": "Override the DoS profile’s geolocation rate based threshold settings by selecting countries from which to allow traffic during a DoS attack", + "type": "array", + "items": { + "type": "string" + } + }, + "whitelistedGeolocations": { + "description": "Deprecated. Replaced with functionally equivalent allowlistedGeolocations. Override the DoS profile’s geolocation rate based threshold settings by selecting countries from which to allow traffic during a DoS attack", + "type": "array", + "items": { + "type": "string" + } + }, + "captchaResponse": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Captcha" + } + ], + "default": {} + }, + "triggerIRule": { + "description": "Specifies that the system activates an Application DoS iRule event", + "type": "boolean", + "default": false + }, + "singlePageApplicationEnabled": { + "description": "Specifies that your website is a Single Page Application, meaning a web application that loads new content without triggering a full page-reload. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + }, + "scrubbingDuration": { + "description": "Specifies the BGP route advertisement duration in seconds for Traffic Scrubbing during attacks. This requires configuration of the Scrubber Profile, and will function even when the Operation Mode is set to Transparent. A value of 0 disables Traffic Scrubbing. Requires the AFM module and if this property is unspecified it will be disabled.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + } + }, + "remoteTriggeredBlackHoleDuration": { + "description": "Specifies the BGP route advertisement duration in seconds for Remote Triggered Black Hole of attacking IPs. This requires configuration of the Blacklist Publisher, and will function even when the Operation Mode is set to Transparent. A value of 0 disables Remote Triggered Black Hole. Requires the AFM module and if this property is unspecified it will be disabled.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + } + }, + "profileAcceleration": { + "description": "Select a TCP fastL4 profile to be used as a fast-path for acceleration", + "allOf": [ + { + "$ref": "#/definitions/Pointer_L4_Profile" + } + ] + }, + "botDefense": { + "description": "This feature proactively detects bots and scripts, and prevents them from accessing the site. It may be used to prevent DDoS, Web Scraping, and Brute Force attacks. Enabling this feature requires JavaScript support from the browsers.", + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Bot_Defense" + } + ], + "default": {} + }, + "botSignatures": { + "description": "This feature automatically detects well known bots according to their HTTP characteristics. Malicious bots can be configured to be blocked, while benign bots can be configured to pass through the anti-bot defense mechanisms", + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Bot_Signatures" + } + ], + "default": {} + }, + "mobileDefense": { + "description": "This feature detects mobile applications built with the Anti-Bot Mobile SDK and defines how requests from these mobile application clients are handled", + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Mobile_Defense" + } + ], + "default": {} + }, + "rateBasedDetection": { + "description": "Configures the detection of DoS attacks based on high volume of incoming traffic", + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Rate_Based_Detection" + } + ], + "default": {} + }, + "stressBasedDetection": { + "description": "Configures the detection of DoS attacks based on server stress. The system automatically detects an increase in server stress and mitigates DoS attacks causing it. ", + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Stress_Based_Detection" + } + ], + "default": {} + }, + "recordTraffic": { + "description": "This feature allows automatic recording of traffic during DoS attacks, and storing the recordings as TCP Dump files. The files are placed in the system file path /shared/dosl7/tcpdumps.", + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_TCP_Dump" + } + ], + "default": {} + } + }, + "additionalProperties": false, + "f5aliases": { + "allowlistedGeolocations": "whitelistedGeolocations", + "denylistedGeolocations": "blacklistedGeolocations" + } + }, + "DOS_Profile_Network_Dynamic_Signatures": { + "description": "", + "type": "object", + "properties": { + "detectionMode": { + "description": "Select the enforcement state for dynamic signatures. To enable enforcement of dynamic DoS vectors, select enabled. When enforcement is enabled, all thresholds and threshold actions are applied. Select disabled to apply no action or thresholds to dynamic Vectors. Select learn-only to track dynamic vector statistics, without enforcing any thresholds or limits.", + "type": "string", + "enum": [ + "disabled", + "learn-only", + "enabled" + ], + "default": "disabled" + }, + "mitigationMode": { + "description": "Specify the mitigation sensitivity for dynamic signatures", + "type": "string", + "enum": [ + "none", + "low", + "medium", + "high" + ], + "default": "none" + }, + "scrubbingEnabled": { + "description": "Specify whether to enable redirection and scrubbing of IP addresses identified by dynamic vectors. This enables handling of the dynamic vector hits by an IP intelligence category.", + "type": "boolean", + "default": false + }, + "scrubbingCategory": { + "description": "Specifies the IP intelligence denylist category to which scrubbed IPs are sent", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Denylist_Category" + } + ] + }, + "scrubbingDuration": { + "description": "Specify the duration in seconds for which an IP address is added to the denylist category", + "type": "integer", + "minimum": 60, + "maximum": 4294967295, + "default": 500 + } + }, + "additionalProperties": false + }, + "DOS_Profile_Network": { + "description": "", + "type": "object", + "properties": { + "dynamicSignatures": { + "default": {}, + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Network_Dynamic_Signatures" + } + ] + }, + "vectors": { + "description": "A list of configured network DoS vectors", + "type": "array", + "items": { + "$ref": "#/definitions/DOS_Network_Vector" + } + } + }, + "additionalProperties": false + }, + "DOS_Network_Vector": { + "description": "Network Denial-of-Service (DoS) vector", + "type": "object", + "properties": { + "type": { + "description": "Specifies the name of the DoS attack vector whose thresholds you are configuring", + "type": "string", + "enum": [ + "ext-hdr-too-large", + "hop-cnt-low", + "host-unreachable", + "icmpv4-flood", + "icmpv6-flood", + "icmp-frag", + "ip-frag-flood", + "ip-low-ttl", + "ip-opt-frames", + "ipv6-ext-hdr-frames", + "ipv6-frag-flood", + "non-tcp-connection", + "opt-present-with-illegal-len", + "sweep", + "tcp-half-open", + "tcp-opt-overruns-tcp-hdr", + "tcp-psh-flood", + "tcp-rst-flood", + "tcp-syn-flood", + "tcp-synack-flood", + "tcp-syn-oversize", + "tcp-bad-urg", + "tcp-window-size", + "tidcmp", + "too-many-ext-hdrs", + "udp-flood", + "unk-tcp-opt-type" + ] + }, + "state": { + "description": "Specifies how to enforce protection for that attack type: mitigate (watch, learn, alert, and mitigate), detect-only (watch, learn, and alert), learn-only (collect stats, no mitigation), or Disabled (no stat collection, no mitigation).", + "type": "string", + "enum": [ + "disabled", + "learn-only", + "detect-only", + "mitigate" + ], + "default": "mitigate" + }, + "thresholdMode": { + "description": "Specifies how thresholds are set for this vector", + "type": "string", + "enum": [ + "manual", + "stress-based-mitigation", + "fully-automatic" + ], + "default": "manual" + }, + "badActorSettings": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Bad_Actor_Detection_Settings" + } + ], + "default": {} + }, + "autoDenylistSettings": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Auto_Denylist_Settings" + } + ] + }, + "autoBlacklistSettings": { + "description": "Deprecated. Replaced with functionally equivalent autoDenylistSettings.", + "allOf": [ + { + "$ref": "#/definitions/DOS_Auto_Denylist_Settings" + } + ], + "default": {} + }, + "autoAttackFloor": { + "description": "Specifies packets per second to identify an attack. These settings provide an absolute minimum of packets to allow before the attack is identified. As the automatic detection thresholds adjust to traffic and CPU usage on the system over time, this attack floor becomes less relevant.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 100 + }, + "autoAttackCeiling": { + "description": "Specifies the absolute maximum allowable for packets of this type. This setting rate limits packets to the packets per second setting, when specified. To set no hard limit and allow automatic thresholds to manage all rate limiting, set this to 4294967295.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 4294967295 + }, + "rateThreshold": { + "description": "Specify how many packets per second the system must discover in traffic in order to detect this attack", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 4294967295 + }, + "rateIncreaseThreshold": { + "description": "Specify percent of rate increase the system must discover in traffic in order to detect this attack", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 500 + }, + "rateLimit": { + "description": "Specify the maximum number of this type of packet per second the system allows for a vector. The system drops packets once the traffic level exceeds the rate limit.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 4294967295 + }, + "simulateAutoThresholdEnabled": { + "description": "Specifies that results of the current automatic thresholds are logged, though manual thresholds are enforced, and no action is taken on automatic thresholds", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false, + "f5aliases": { + "autoDenylistSettings": "autoBlacklistSettings" + } + }, + "DOS_Profile_Protocol_DNS": { + "description": "", + "type": "object", + "properties": { + "vectors": { + "description": "A list of configured DNS DoS vectors", + "type": "array", + "items": { + "$ref": "#/definitions/DOS_DNS_Vector" + } + } + }, + "additionalProperties": false + }, + "DOS_DNS_Vector": { + "description": "Protocol DNS Denial-of-Service (DoS) vector", + "type": "object", + "properties": { + "type": { + "description": "Specifies the name of the DoS attack vector whose thresholds you are configuring", + "type": "string", + "enum": [ + "a", + "aaaa", + "any", + "axfr", + "cname", + "ixfr", + "mx", + "ns", + "nxdomain", + "other", + "ptr", + "qdcount", + "soa", + "srv", + "txt", + "malformed" + ] + }, + "state": { + "description": "Specifies how to enforce protection for that attack type: mitigate (watch, learn, alert, and mitigate), detect-only (watch, learn, and alert), learn-only (collect stats, no mitigation), or Disabled (no stat collection, no mitigation).", + "type": "string", + "enum": [ + "disabled", + "learn-only", + "detect-only", + "mitigate" + ], + "default": "mitigate" + }, + "thresholdMode": { + "description": "Specifies how thresholds are set for this vector", + "type": "string", + "enum": [ + "manual", + "stress-based-mitigation", + "fully-automatic" + ], + "default": "manual" + }, + "badActorSettings": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Bad_Actor_Detection_Settings" + } + ], + "default": {} + }, + "autoDenylistSettings": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Auto_Denylist_Settings" + } + ] + }, + "autoBlacklistSettings": { + "description": "Deprecated. Replaced with functionally equivalent autoDenylistSettings.", + "allOf": [ + { + "$ref": "#/definitions/DOS_Auto_Denylist_Settings" + } + ], + "default": {} + }, + "autoAttackFloor": { + "description": "Specifies packets per second to identify an attack. These settings provide an absolute minimum of packets to allow before the attack is identified. As the automatic detection thresholds adjust to traffic and CPU usage on the system over time, this attack floor becomes less relevant.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 100 + }, + "autoAttackCeiling": { + "description": "Specifies the absolute maximum allowable for packets of this type. This setting rate limits packets to the packets per second setting, when specified. To set no hard limit and allow automatic thresholds to manage all rate limiting, set this to 4294967295.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 4294967295 + }, + "rateThreshold": { + "description": "Specify how many packets per second the system must discover in traffic in order to detect this attack", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 4294967295 + }, + "rateIncreaseThreshold": { + "description": "Specify percent of rate increase the system must discover in traffic in order to detect this attack", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 500 + }, + "rateLimit": { + "description": "Specify the maximum number of this type of packet per second the system allows for a vector. The system drops packets once the traffic level exceeds the rate limit.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 4294967295 + }, + "simulateAutoThresholdEnabled": { + "description": "Specifies that results of the current automatic thresholds are logged, though manual thresholds are enforced, and no action is taken on automatic thresholds", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false, + "required": [ + "type" + ], + "f5aliases": { + "autoDenylistSettings": "autoBlacklistSettings" + } + }, + "DOS_Profile_Protocol_SIP": { + "description": "", + "type": "object", + "properties": { + "vectors": { + "description": "A list of configured SIP DoS vectors", + "type": "array", + "items": { + "$ref": "#/definitions/DOS_SIP_Vector" + } + } + }, + "additionalProperties": false + }, + "DOS_SIP_Vector": { + "description": "Protocol SIP Denial-of-Service (DoS) vector", + "type": "object", + "properties": { + "type": { + "description": "Specifies the name of the DoS attack vector whose thresholds you are configuring", + "type": "string", + "enum": [ + "ack", + "cancel", + "message", + "options", + "prack", + "register", + "bye", + "invite", + "notify", + "other", + "publish", + "subscribe", + "uri-limit", + "malformed" + ] + }, + "state": { + "description": "Specifies how to enforce protection for that attack type: mitigate (watch, learn, alert, and mitigate), detect-only (watch, learn, and alert), learn-only (collect stats, no mitigation), or Disabled (no stat collection, no mitigation).", + "type": "string", + "enum": [ + "disabled", + "learn-only", + "detect-only", + "mitigate" + ], + "default": "mitigate" + }, + "thresholdMode": { + "description": "Specifies how thresholds are set for this vector", + "type": "string", + "enum": [ + "manual", + "stress-based-mitigation", + "fully-automatic" + ], + "default": "manual" + }, + "badActorSettings": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Bad_Actor_Detection_Settings" + } + ], + "default": {} + }, + "autoDenylistSettings": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Auto_Denylist_Settings" + } + ] + }, + "autoBlacklistSettings": { + "description": "Deprecated. Replaced with functionally equivalent autoDenylistSettings.", + "allOf": [ + { + "$ref": "#/definitions/DOS_Auto_Denylist_Settings" + } + ], + "default": {} + }, + "autoAttackFloor": { + "description": "Specifies packets per second to identify an attack. These settings provide an absolute minimum of packets to allow before the attack is identified. As the automatic detection thresholds adjust to traffic and CPU usage on the system over time, this attack floor becomes less relevant.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 100 + }, + "autoAttackCeiling": { + "description": "Specifies the absolute maximum allowable for packets of this type. This setting rate limits packets to the packets per second setting, when specified. To set no hard limit and allow automatic thresholds to manage all rate limiting, set this to 4294967295.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 4294967295 + }, + "rateThreshold": { + "description": "Specify how many packets per second the system must discover in traffic in order to detect this attack", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 4294967295 + }, + "rateIncreaseThreshold": { + "description": "Specify percent of rate increase the system must discover in traffic in order to detect this attack", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 500 + }, + "rateLimit": { + "description": "Specify the maximum number of this type of packet per second the system allows for a vector. The system drops packets once the traffic level exceeds the rate limit.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 4294967295 + }, + "simulateAutoThresholdEnabled": { + "description": "Specifies that results of the current automatic thresholds are logged, though manual thresholds are enforced, and no action is taken on automatic thresholds", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false, + "required": [ + "type" + ], + "f5aliases": { + "autoDenylistSettings": "autoBlacklistSettings" + } + }, + "Enum_ISP": { + "description": "Enum values for Internet Service Providers (ISP)", + "type": "string", + "enum": [ + "AOL", + "BeijingCNC", + "ChinaEducationNetwork", + "ChinaMobilNetwork", + "ChinaRailwayTelcom", + "ChinaTelecom", + "ChinaUnicom", + "CNC", + "Comcast", + "Earthlink", + "ShanghaiCNC", + "ShanghaiTelecom" + ] + }, + "Enum_Continent_Code_Alpha_2": { + "description": "Enum values for Alpha-2 continent codes based on ISO 3166. Use two dashes (--) if Unknown", + "type": "string", + "enum": [ + "--", + "AF", + "AN", + "AS", + "EU", + "NA", + "OC", + "SA" + ] + }, + "Enum_Country_Code_Alpha_2": { + "description": "Enum values for Alpha-2 country codes based on ISO 3166. Use two dashes (--) if Unknown", + "type": "string", + "enum": [ + "--", + "A1", + "A2", + "AD", + "AE", + "AF", + "AG", + "AI", + "AL", + "AM", + "AN", + "AO", + "AP", + "AQ", + "AR", + "AS", + "AT", + "AU", + "AW", + "AX", + "AZ", + "BA", + "BB", + "BD", + "BE", + "BF", + "BG", + "BH", + "BI", + "BJ", + "BL", + "BM", + "BN", + "BO", + "BQ", + "BR", + "BS", + "BT", + "BV", + "BW", + "BY", + "BZ", + "CA", + "CC", + "CD", + "CF", + "CG", + "CH", + "CI", + "CK", + "CL", + "CM", + "CN", + "CO", + "CR", + "CU", + "CV", + "CX", + "CY", + "CZ", + "DE", + "DJ", + "DK", + "DM", + "DO", + "DZ", + "EC", + "EE", + "EG", + "EH", + "ER", + "ES", + "ET", + "EU", + "FI", + "FJ", + "FK", + "FM", + "FO", + "FR", + "FX", + "GA", + "GB", + "GD", + "GE", + "GF", + "GG", + "GH", + "GI", + "GL", + "GM", + "GN", + "GP", + "GQ", + "GR", + "GS", + "GT", + "GU", + "GW", + "GY", + "HK", + "HM", + "HN", + "HR", + "HT", + "HU", + "ID", + "IE", + "IL", + "IM", + "IN", + "IO", + "IQ", + "IR", + "IS", + "IT", + "JE", + "JM", + "JO", + "JP", + "KE", + "KG", + "KH", + "KI", + "KM", + "KN", + "KP", + "KR", + "KW", + "KY", + "KZ", + "LA", + "LB", + "LC", + "LI", + "LK", + "LR", + "LS", + "LT", + "LU", + "LV", + "LY", + "MA", + "MC", + "MD", + "ME", + "MF", + "MG", + "MH", + "MK", + "ML", + "MM", + "MN", + "MO", + "MP", + "MQ", + "MR", + "MS", + "MT", + "MU", + "MV", + "MW", + "MX", + "MY", + "MZ", + "NA", + "NC", + "NE", + "NF", + "NG", + "NI", + "NL", + "NO", + "NP", + "NR", + "NU", + "NZ", + "O1", + "OM", + "PA", + "PE", + "PF", + "PG", + "PH", + "PK", + "PL", + "PM", + "PN", + "PR", + "PS", + "PT", + "PW", + "PY", + "QA", + "RE", + "RO", + "RS", + "RU", + "RW", + "SA", + "SB", + "SC", + "SD", + "SE", + "SG", + "SH", + "SI", + "SJ", + "SK", + "SL", + "SM", + "SN", + "SO", + "SR", + "ST", + "SV", + "SY", + "SZ", + "TC", + "TD", + "TF", + "TG", + "TH", + "TJ", + "TK", + "TL", + "TM", + "TN", + "TO", + "TR", + "TT", + "TV", + "TW", + "TZ", + "UA", + "UG", + "UM", + "US", + "UY", + "UZ", + "VA", + "VC", + "VE", + "VG", + "VI", + "VN", + "VU", + "WF", + "WS", + "YE", + "YT", + "ZA", + "ZM", + "ZW" + ] + }, + "Enum_Protocols_Idle_Timeout_Policy": { + "description": "Enum values for Idle_Timeout_Policy protocols", + "type": "string", + "enum": [ + "3pc", + "a/n", + "ah", + "all-other", + "argus", + "aris", + "ax.25", + "bbn-rcc", + "bna", + "br-sat-mon", + "cbt", + "cftp", + "chaos", + "compaq-peer", + "cphb", + "cpnx", + "crdup", + "crtp", + "dccp", + "dcn", + "ddp", + "ddx", + "dgp", + "dsr", + "egp", + "eigrp", + "emcon", + "encap", + "esp", + "etherip", + "fc", + "fire", + "ggp", + "gmtp", + "gre", + "hip", + "hmp", + "hopopt", + "i-nlsp", + "iatp", + "icmp", + "idpr", + "idpr-cmtp", + "idrp", + "ifmp", + "igmp", + "igp", + "il", + "ip", + "ipcomp", + "ipcv", + "ipencap", + "ipip", + "iplt", + "ippc", + "ipv4", + "ipv6", + "ipv6-auth", + "ipv6-crypt", + "ipv6-frag", + "ipv6-icmp", + "ipv6-nonxt", + "ipv6-opts", + "ipv6-route", + "ipx-in-ip", + "irtp", + "isis", + "iso-ip", + "iso-tp4", + "kryptolan", + "l2tp", + "larp", + "leaf-1", + "leaf-2", + "manet", + "merit-inp", + "mfe-nsp", + "micp", + "mobile", + "mobility-header", + "mpls-in-ip", + "mtp", + "mux", + "narp", + "netblt", + "nsfnet-igp", + "nvp", + "ospf", + "pgm", + "pim", + "pipe", + "pnni", + "prm", + "ptp", + "pup", + "pvp", + "qnx", + "rdp", + "rohc", + "rsvp", + "rspv-e2e-ignore", + "rvd", + "sat-expak", + "sat-mon", + "scc-sp", + "scps", + "sctp", + "sdrp", + "secure-vmtp", + "shim6", + "skip", + "sm", + "smp", + "snp", + "sprite-rpc", + "sps", + "srp", + "sscopmce", + "st", + "stp", + "sun-nd", + "swipe", + "tcf", + "tcp", + "tlsp", + "tp++", + "trunk-1", + "trunk-2", + "ttp", + "udp", + "udplite", + "uti", + "vines", + "visa", + "vmtp", + "vrrp", + "wb-expak", + "wb-mon", + "wesp", + "wsn", + "xnet", + "xns-idp", + "xtp" + ] + }, + "GSLB_Domain": { + "title": "GSLB_Domain", + "description": "Configures GSLB (Global Server Load Balancing) settings for a domain.", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "GSLB_Domain" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "domainName": { + "title": "Domain Name", + "description": "The name of the domain for the site content you are load balancing. If you have many domains, you can use two different wildcard characters, * and ?, to represent one or more characters in the domain alias, which reduces the number of aliases you have to add to the configuration", + "type": "string", + "minLength": 3 + }, + "aliases": { + "title": "Aliases", + "description": "List of alternate domain names. Each may include wildcard characters.", + "type": "array", + "items": { + "title": "GSLB domain name", + "type": "string", + "minLength": 3 + } + }, + "enabled": { + "title": "Enabled", + "description": "When true (default), the system can use the domain and its resources for load balancing requests", + "type": "boolean", + "default": true + }, + "resourceRecordType": { + "title": "Resource Record (RR) Type", + "description": "Specifies the type of resource records for this domain", + "type": "string", + "enum": [ + "A", + "AAAA", + "CNAME", + "MX" + ] + }, + "pools": { + "title": "Pools", + "description": "Specifies the pools that this domain uses for load balancing. The system evaluates the pools in the order in which they are listed, until it finds a matching pool", + "type": "array", + "items": { + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to GSLB Pool declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "GSLB_Pool" + } + }, + "required": [ + "class" + ] + } + } + }, + "ratio": { + "title": "Ratio weight", + "description": "Ratio weight assigned to GSLB pool", + "type": "integer", + "default": 1 + } + }, + "additionalProperties": false, + "dependencies": { + "ratio": { + "minProperties": 2, + "maxProperties": 2 + }, + "use": { + "minProperties": 1, + "maxProperties": 2 + } + } + } + }, + "poolsCname": { + "title": "Pools Cname", + "description": "Specifies the cname pools this domain uses for load balancing. The system evaluates the pools in the order in which they are listed, until it finds a matching pool", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_GSLB_Pool" + } + }, + "poolLbMode": { + "title": "Pool Load Balancing Mode", + "description": "Specifies the load balancing method used to select a pool in this domain", + "type": "string", + "enum": [ + "global-availability", + "ratio", + "round-robin", + "topology" + ], + "default": "round-robin" + }, + "lastResortPool": { + "title": "Last Resort Pool", + "description": "Specifies the pools this domain uses for load balancing. The system evaluates the pools in the order in which they are listed, until it finds a matching pool", + "$ref": "#/definitions/Pointer_GSLB_Pool" + }, + "lastResortPoolType": { + "title": "Last Resort Pool type", + "description": "This is used to specify the type of pool being used for the lastResortPool", + "type": "string", + "enum": [ + "A", + "AAAA", + "CNAME", + "MX" + ] + }, + "iRules": { + "title": "iRules", + "description": "List of GSLB iRules for this GSLB Domain (order is significant)", + "type": "array", + "items": { + "title": "iRule", + "description": "BIG-IP AS3 pointer to GSLB_iRule (declared separately)", + "if": { + "type": "string" + }, + "then": { + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "GSLB_iRule" + } + }, + "required": [ + "class" + ] + } + } + }, + "else": { + "type": "object", + "properties": { + "bigip": { + "title": "BIG-IP GTM iRule", + "description": "Pathname of existing BIG-IP GTM iRule", + "type": "string", + "format": "f5bigip" + }, + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to GSLB_iRule (declared separately)", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "GSLB_iRule" + } + }, + "required": [ + "class" + ] + } + } + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query gtm rule" + ] + } + } + }, + "$comment": "uniqueItems: true" + }, + "persistenceEnabled": { + "title": "Persistence", + "description": "Specifies that when a local DNS server makes repetitive requests on behalf of a client, the system reconnects the client to the same resource as previous requests. Set to true to enable.", + "type": "boolean", + "default": false + }, + "persistCidrIpv4": { + "title": "PersistCidrIpv4", + "description": "Specifies a mask used to group IPv4 LDNS addresses.", + "type": "integer", + "minimum": 0, + "maximum": 32, + "default": 32 + }, + "persistCidrIpv6": { + "title": "PersistCidrIpv6", + "description": "Specifies a mask used to group IPv6 LDNS addresses.", + "type": "integer", + "minimum": 0, + "maximum": 128, + "default": 128 + }, + "ttlPersistence": { + "title": "TTL Persistence", + "description": "Specifies, in seconds, the length of time for which a persistence entry is valid.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 3600 + }, + "clientSubnetPreferred": { + "title": "Client Subnet Preferred", + "description": "Specifies that this domain should use the edns0 client subnet option when using topology load balancing. If the query does not contain a client subnet option, the system will fall back to the default option of using the source address.", + "type": "boolean", + "default": false, + "f5PostProcess": { + "tag": "minVersion", + "data": "14.1" + } + } + }, + "if": { + "properties": { + "pools": {} + }, + "required": [ + "pools" + ] + }, + "then": { + "not": { + "properties": { + "poolsCname": {} + }, + "required": [ + "poolsCname" + ] + } + }, + "required": [ + "resourceRecordType", + "domainName" + ] + }, + "GSLB_Domain_A": { + "description": "Configures GSLB (Global Server Load Balancing) settings for A domain.", + "allOf": [ + { + "$ref": "#/definitions/GSLB_Domain" + } + ] + }, + "GSLB_Domain_AAAA": { + "description": "Configures GSLB (Global Server Load Balancing) settings for AAAA domain.", + "allOf": [ + { + "$ref": "#/definitions/GSLB_Domain" + } + ] + }, + "GSLB_Domain_CNAME": { + "description": "Configures GSLB (Global Server Load Balancing) settings for CNAME domain.", + "allOf": [ + { + "$ref": "#/definitions/GSLB_Domain" + } + ] + }, + "GSLB_Domain_MX": { + "description": "Configures GSLB (Global Server Load Balancing) settings for MX domain.", + "allOf": [ + { + "$ref": "#/definitions/GSLB_Domain" + } + ] + }, + "GSLB_iRule": { + "title": "GSLB_iRule", + "description": "Specifies or configures an iRule for use in GSLB Domains", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "GSLB_iRule" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "expand": { + "title": "Expand", + "description": "If true (default), expand backquoted variables in iRule", + "type": "boolean", + "default": true + }, + "iRule": { + "$ref": "#/definitions/IRule_Core" + } + }, + "additionalProperties": false, + "required": [ + "class", + "iRule" + ] + }, + "GSLB_Monitor": { + "title": "GSLB_Monitor", + "description": "Declares a monitor that verifies the availability and/or performance status of a particular protocol, service, or application", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "GSLB_Monitor" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "monitorType": { + "title": "Monitor Type", + "description": "Specifies the type of monitor", + "type": "string", + "enum": [ + "http", + "https", + "gateway-icmp", + "tcp", + "udp", + "external" + ] + }, + "target": { + "title": "Target (Address:Port)", + "description": "Specifies the IP address and service port of the resource that is the destination of this monitor. Format is ip:port", + "type": "string", + "default": "*:*" + }, + "interval": { + "title": "Interval", + "description": "Specifies, in seconds, the frequency at which the system issues the monitor check when either the resource is down or the status of the resource is unknown", + "type": "integer", + "minimum": 0, + "maximum": 86399, + "default": 30 + }, + "timeout": { + "title": "Timeout", + "description": "Specifies the number of seconds the target has in which to respond to the monitor request", + "type": "integer", + "minimum": 0, + "maximum": 86400, + "default": 120 + }, + "probeTimeout": { + "title": "Probe Timeout", + "description": "Specifies the number of seconds after which the system times out the probe request to the system", + "type": "integer", + "minimum": 0, + "default": 5 + }, + "ignoreDownResponseEnabled": { + "title": "Ignore Down Response", + "description": "Specifies whether the monitor immediately marks an object down when it receives a down response. If enabled, the monitor ignores the down response for the duration of timeout. The default is false (disabled)", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "gtm" + ] + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "http" + } + } + }, + "then": { + "$ref": "#/definitions/GSLB_Monitor_HTTP" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "https" + } + } + }, + "then": { + "$ref": "#/definitions/GSLB_Monitor_HTTPS" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "gateway-icmp" + } + } + }, + "then": { + "$ref": "#/definitions/GSLB_Monitor_ICMP" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "udp" + } + } + }, + "then": { + "$ref": "#/definitions/GSLB_Monitor_UDP" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "tcp" + } + } + }, + "then": { + "$ref": "#/definitions/GSLB_Monitor_TCP" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "external" + } + } + }, + "then": { + "$ref": "#/definitions/GSLB_Monitor_External" + } + } + ], + "required": [ + "class", + "monitorType" + ] + }, + "GSLB_Monitor_External": { + "description": "Additional Monitor class properties available when monitorType = external", + "type": "object", + "properties": { + "pathname": { + "title": "pathname", + "description": "Tmsh object path name of an imported existing external monitor (e.g. /Common/arg_example)", + "type": "string", + "minLength": 2, + "f5PostProcess": { + "tag": "expand" + } + }, + "expand": { + "title": "Expand", + "description": "If true (default), expand backquoted variables in script", + "type": "boolean", + "default": true + }, + "script": { + "title": "External monitor script", + "description": "Bash(1) script which implements external monitor", + "allOf": [ + { + "$ref": "#/definitions/F5string" + }, + { + "f5PostProcess": { + "tag": "expand", + "data": { + "when": "1/expand" + } + } + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "string" + } + } + ] + }, + "arguments": { + "title": "Arguments", + "description": "Arguments to specified external monitor (will be backquote-expanded)", + "type": "string", + "default": "", + "f5PostProcess": { + "tag": "expand" + } + }, + "environmentVariables": { + "description": "Specifies user defined command line parameters that the external program requires.", + "type": "object", + "additionalProperties": { + "type": "string" + }, + "default": {} + } + }, + "oneOf": [ + { + "required": [ + "pathname" + ] + }, + { + "required": [ + "script" + ] + } + ] + }, + "GSLB_Monitor_HTTP": { + "description": "Additional Monitor class properties available when monitorType = http", + "type": "object", + "properties": { + "reverseEnabled": { + "title": "Reverse Enabled", + "description": "When enabled, a successful check marks the monitored object down instead of up. You can use the Reverse mode only if you configure both the send and receive options", + "type": "boolean", + "default": false + }, + "send": { + "title": "Send String", + "description": "Specifies the text string that the monitor sends to the target object. If you do not specify a value for both the send and receive options, the monitor performs a simple service check and connect only", + "type": "string", + "default": "HEAD / HTTP/1.0\\r\\n\\r\\n", + "f5PostProcess": { + "tag": "expand" + } + }, + "receive": { + "title": "Receive String", + "description": "Specifies the text string that the monitor looks for in the returned resource. If you do not specify a value for both the send and receive options, the monitor performs a simple service check and connect only", + "type": "string", + "default": "HTTP/1.", + "f5PostProcess": { + "tag": "expand" + } + }, + "transparent": { + "title": "Transparent", + "description": "Enables monitoring of pool members through firewalls. The default value is false (disabled)", + "type": "boolean", + "default": false + } + } + }, + "GSLB_Monitor_HTTPS": { + "description": "Additional Monitor class properties available when monitorType = https", + "type": "object", + "allOf": [ + { + "properties": { + "ciphers": { + "title": "Ciphers", + "description": "Ciphersuite selection string", + "type": "string", + "default": "DEFAULT" + }, + "clientCertificate": { + "title": "Client certificate", + "description": "BIG-IP AS3 pointer to client Certificate declaration, for TLS authentication (optional)", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Certificate" + } + }, + "required": [ + "class" + ] + } + } + } + } + }, + { + "$ref": "#/definitions/GSLB_Monitor_HTTP" + } + ] + }, + "GSLB_Monitor_ICMP": { + "description": "Additional Monitor class properties available when monitorType = gateway-icmp", + "type": "object", + "properties": { + "probeInterval": { + "title": "Probe Interval", + "description": "Specifies the frequency at which the BIG-IP system probes the host server", + "type": "integer", + "minimum": 0, + "default": 1 + }, + "probeAttempts": { + "title": "Probe Attempts", + "description": "Specifies the number of times the BIG-IP system attempts to probe the host server, after which the BIG-IP system considers the host server down or unavailable", + "type": "integer", + "minimum": 0, + "default": 3 + }, + "transparent": { + "title": "Transparent", + "description": "Enables monitoring of pool members through firewalls. The default value is false (disabled)", + "type": "boolean", + "default": false + } + } + }, + "GSLB_Monitor_TCP": { + "description": "Additional Monitor class properties available when monitorType = tcp", + "type": "object", + "properties": { + "reverseEnabled": { + "title": "Reverse Enabled", + "description": "When enabled, a successful check marks the monitored object down instead of up. You can use the Reverse mode only if you configure both the send and receive options", + "type": "boolean", + "default": false + }, + "send": { + "title": "Send String", + "description": "Specifies the text string that the monitor sends to the target object. If you do not specify a value for both the send and receive options, the monitor performs a simple service check and connect only", + "type": "string", + "default": "" + }, + "receive": { + "title": "Receive String", + "description": "Specifies the text string that the monitor looks for in the returned resource. If you do not specify a value for both the send and receive options, the monitor performs a simple service check and connect only", + "type": "string", + "default": "" + }, + "transparent": { + "title": "Transparent", + "description": "Enables monitoring of pool members through firewalls. The default value is false (disabled)", + "type": "boolean", + "default": false + } + } + }, + "GSLB_Monitor_UDP": { + "description": "Additional Monitor class properties available when monitorType = udp", + "type": "object", + "properties": { + "debugEnabled": { + "title": "Debug Enabled", + "description": "When enabled, the monitor sends error messages and additional information to a log file created and labeled specifically for this monitor. The default is false (disabled)", + "type": "boolean", + "default": false + }, + "probeAttempts": { + "title": "Probe Attempts", + "description": "Specifies the number of times the BIG-IP system attempts to probe the host server, after which the BIG-IP system considers the host server down or unavailable", + "type": "integer", + "minimum": 0, + "default": 3 + }, + "probeInterval": { + "title": "Probe Interval", + "description": "Specifies the frequency at which the BIG-IP system probes the host server", + "type": "integer", + "minimum": 0, + "default": 1 + }, + "reverseEnabled": { + "title": "Reverse Enabled", + "description": "When enabled, a successful check marks the monitored object down instead of up. You can use the Reverse mode only if you configure both the send and receive options", + "type": "boolean", + "default": false + }, + "send": { + "title": "Send String", + "description": "Specifies the text string that the monitor sends to the target object. If you do not specify a value for both the send and receive options, the monitor performs a simple service check and connect only", + "type": "string", + "default": "default send string" + }, + "receive": { + "title": "Receive String", + "description": "Specifies the text string that the monitor looks for in the returned resource. If you do not specify a value for both the send and receive options, the monitor performs a simple service check and connect only", + "type": "string", + "default": "" + }, + "transparent": { + "title": "Transparent", + "description": "Enables monitoring of pool members through firewalls. The default value is false (disabled)", + "type": "boolean", + "default": false + } + } + }, + "GSLB_Pool": { + "title": "GSLB_Pool", + "description": "Declares a pool to use for load balancing", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "GSLB_Pool" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "resourceRecordType": { + "title": "Resource Record (RR) Type", + "description": "Specifies the type of resource records for this domain", + "type": "string", + "enum": [ + "A", + "AAAA", + "CNAME", + "MX" + ] + }, + "enabled": { + "title": "Enabled", + "description": "Specifies whether the pool and its resources are available for load balancing", + "type": "boolean", + "default": true + }, + "lbModePreferred": { + "title": "Preferred LB Mode", + "description": "Preferred Load Balancing mode", + "type": "string", + "enum": [ + "completion-rate", + "cpu", + "drop-packet", + "fallback-ip", + "fewest-hops", + "global-availability", + "kilobytes-per-second", + "least-connections", + "lowest-round-trip-time", + "packet-rate", + "quality-of-service", + "ratio", + "return-to-dns", + "round-robin", + "static-persistence", + "topology", + "virtual-server-capacity", + "virtual-server-score" + ], + "default": "round-robin" + }, + "lbModeAlternate": { + "title": "Alternate LB Mode", + "description": "Alternate Load Balancing mode", + "type": "string", + "enum": [ + "drop-packet", + "fallback-ip", + "global-availability", + "packet-rate", + "ratio", + "return-to-dns", + "round-robin", + "static-persistence", + "topology", + "virtual-server-capacity", + "virtual-server-score", + "none" + ], + "default": "round-robin" + }, + "lbModeFallback": { + "title": "Fallback LB mode", + "description": "Fallback Load Balancing mode", + "type": "string", + "enum": [ + "completion-rate", + "cpu", + "drop-packet", + "fallback-ip", + "fewest-hops", + "global-availability", + "kilobytes-per-second", + "least-connections", + "lowest-round-trip-time", + "packet-rate", + "quality-of-service", + "ratio", + "return-to-dns", + "round-robin", + "static-persistence", + "topology", + "virtual-server-capacity", + "virtual-server-score", + "none" + ], + "default": "return-to-dns" + }, + "manualResumeEnabled": { + "title": "Manual Resume Enabled", + "description": "Specifies whether you must manually restart a pool member that goes down", + "type": "boolean", + "default": false + }, + "ttl": { + "title": "Time-to-Live (TTL)", + "description": "Specifies the number of seconds the IP address, once found, is valid. Once the time-to-live (TTL) expires, the client has to request the IP address resolution again ", + "type": "integer", + "default": 30, + "minimum": 0, + "maximum": 4294967295 + }, + "verifyMemberEnabled": { + "title": "Verify Member Availability Enabled", + "description": "Specifies the system verifies the availability of the pool members before sending a connection to those resources", + "type": "boolean", + "default": true + } + }, + "allOf": [ + { + "if": { + "properties": { + "resourceRecordType": { + "const": "MX" + } + } + }, + "then": { + "properties": { + "maxAnswersReturned": { + "title": "Maximum Number of Answers Returned", + "description": "Specifies the maximum number of available virtual servers that the system lists in a response", + "type": "integer", + "minimum": 1, + "default": 1, + "maximum": 500 + }, + "members": { + "title": "Members", + "description": "Specifies the members of this pool", + "type": "array", + "items": { + "$ref": "#/definitions/GSLB_Pool_Member_MX" + } + } + } + } + }, + { + "if": { + "properties": { + "resourceRecordType": { + "const": "CNAME" + } + } + }, + "then": { + "allOf": [ + { + "properties": { + "members": { + "title": "Members", + "description": "Specifies the members of this pool", + "type": "array", + "items": { + "$ref": "#/definitions/GSLB_Pool_Member_CNAME" + } + } + } + }, + { + "not": { + "required": [ + "maxAnswersReturned", + "monitors" + ] + } + } + ] + } + }, + { + "if": { + "properties": { + "resourceRecordType": { + "const": "A" + } + } + }, + "then": { + "properties": { + "maxAnswersReturned": { + "title": "Maximum Number of Answers Returned", + "description": "Specifies the maximum number of available virtual servers that the system lists in a response", + "type": "integer", + "minimum": 1, + "default": 1, + "maximum": 500 + }, + "members": { + "title": "Members", + "description": "Specifies the members of this pool", + "type": "array", + "items": { + "$ref": "#/definitions/GSLB_Pool_Member_A" + } + } + } + } + }, + { + "if": { + "properties": { + "resourceRecordType": { + "const": "AAAA" + } + } + }, + "then": { + "properties": { + "maxAnswersReturned": { + "title": "Maximum Number of Answers Returned", + "description": "Specifies the maximum number of available virtual servers the system lists in a response", + "type": "integer", + "minimum": 1, + "default": 1, + "maximum": 500 + }, + "members": { + "title": "Members", + "description": "Specifies the members of this pool", + "type": "array", + "items": { + "$ref": "#/definitions/GSLB_Pool_Member_AAAA" + } + } + } + } + }, + { + "if": { + "anyOf": [ + { + "properties": { + "resourceRecordType": { + "const": "A" + } + } + }, + { + "properties": { + "resourceRecordType": { + "const": "AAAA" + } + } + } + ] + }, + "then": { + "properties": { + "monitors": { + "title": "Monitors", + "description": "Specifies the health monitors the system uses to determine whether it can use this pool for load balancing", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_GSLB_Monitor" + } + }, + "fallbackIP": { + "title": "Fallback IP", + "description": "Specifies the IP address of the server to which the system directs requests when it cannot use one of its pools to do so. Note that the system uses the fallback IP only if you select a Fallback load balancing method", + "type": "string", + "format": "f5ip" + }, + "bpsLimit": { + "title": "Maximum Bits Per Second", + "description": "The maximum allowable data throughput rate, in bits per second, for the virtual servers in the pool. If the network traffic volume exceeds this value, the system marks the pool as unavailable", + "type": "integer", + "default": 0, + "minimum": 0 + }, + "bpsLimitEnabled": { + "title": "Maximum Bits Per Second - Limit Enabled", + "description": "Enables or disables the maximum Bits Per Second (BPS) option for this pool. The default value is false (disabled)", + "type": "boolean", + "default": false + }, + "ppsLimit": { + "title": "Maximum Packets Per Second", + "description": "The maximum allowable data transfer rate, in packets per second, for the virtual servers in the pool. If the network traffic volume exceeds this value, the system marks the pool as unavailable", + "type": "integer", + "default": 0, + "minimum": 0 + }, + "ppsLimitEnabled": { + "title": "Maximum Packets Per Second - Limit Enabled", + "description": "Enables or disables the maximum Packets Per Second (PPS) option for this pool. The default value is false (disabled)", + "type": "boolean", + "default": false + }, + "connectionsLimit": { + "title": "Maximum Current Connections Per Second", + "description": "The number of current connections allowed for the virtual servers in the pool. If the current connections exceed this value, the system marks the pool as unavailable", + "type": "integer", + "default": 0, + "minimum": 0 + }, + "connectionsLimitEnabled": { + "title": "Maximum Current Connections Per Second - Limit Enabled", + "description": "Enables or disables the maximum current connections option for this pool. The default value is false (disabled)", + "type": "boolean", + "default": false + } + } + } + }, + { + "if": { + "anyOf": [ + { + "properties": { + "lbModePreferred": { + "const": "quality-of-service" + } + } + }, + { + "properties": { + "lbModeFallback": { + "const": "quality-of-service" + } + } + } + ] + }, + "then": { + "properties": { + "qosHitRatio": { + "title": "Quality of Service (QOS) Hit Ratio", + "description": "Assigns a weight to the Hit Ratio performance factor for the Quality of Service dynamic load balancing mode", + "type": "integer", + "minimum": 0, + "default": 5 + }, + "qosHops": { + "title": "Quality of Service (QOS) Hops", + "description": "Assigns a weight to the Hops performance factor for the Quality of Service dynamic load balancing mode", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "qosKbps": { + "title": "Quality of Service (QOS) Kilobytes per Second (Kbps)", + "description": "Assigns a weight to the Kilobytes per Second performance factor for the Quality of Service dynamic load balancing mode", + "type": "integer", + "minimum": 0, + "default": 3 + }, + "qosLinkCapacity": { + "title": "Quality of Service (QOS) Link Capacity", + "description": "Assigns a weight to the Link Capacity performance factor for the Quality of Service dynamic load balancing mode", + "type": "integer", + "minimum": 0, + "default": 30 + }, + "qosPacketRate": { + "title": "Quality of Service (QOS) Packet Rate", + "description": "Assigns a weight to the Packet Rate performance factor for the Quality of Service dynamic load balancing mode", + "type": "integer", + "minimum": 0, + "default": 1 + }, + "qosRoundTripTime": { + "title": "Quality of Service (QOS) Round Trip Time", + "description": "Assigns a weight to the Round Trip Time performance factor for the Quality of Service dynamic load balancing mode", + "type": "integer", + "minimum": 0, + "default": 50 + }, + "qosTopology": { + "title": "Quality of Service (QOS) Topology", + "description": "Assigns a weight to the Topology performance factor for the Quality of Service dynamic load balancing mode", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "qosVirtualServerCapacity": { + "title": "Quality of Service (QOS) Virtual Server Capacity", + "description": "Assigns a weight to the Virtual Server performance factor for the Quality of Service dynamic load balancing mode", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "qosVirtualServerScore": { + "title": "Quality of Service (QOS) Virtual Server Score", + "description": "Assigns a weight to the Virtual Server Score performance factor for the Quality of Service dynamic load balancing mode", + "type": "integer", + "minimum": 0, + "default": 0 + } + } + } + } + ], + "required": [ + "class", + "resourceRecordType" + ] + }, + "GSLB_Pool_Member_A": { + "title": "GSLB A rrType Pool Member", + "description": "Declares member of the GSLB pool", + "type": "object", + "properties": { + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "server": { + "$ref": "#/definitions/Pointer_GSLB_Server" + }, + "virtualServer": { + "description": "Specifies that the Global Traffic Manager assigns connection requests to virtual servers based on a user-defined ranking system.", + "oneOf": [ + { + "type": "string" + }, + { + "$ref": "#/definitions/Pointer_Service" + } + ] + }, + "ratio": { + "title": "Ratio", + "description": "Specifies the ratio weight assigned to the pool member. This weight determines the frequency at which the pool member is selected for load balancing", + "type": "integer", + "default": 1, + "minimum": 0, + "maximum": 65535 + }, + "enabled": { + "title": "Enabled", + "description": "When true (default), the system can use the pool member and its resources for load balancing requests", + "type": "boolean", + "default": true + }, + "dependsOn": { + "description": "Specifies the name of the virtual server on which this pool member depends.", + "type": [ + "string", + "array" + ], + "oneOf": [ + { + "type": "string", + "const": "none" + }, + { + "type": "array", + "items": { + "type": "string", + "pattern": "^/Common/Shared/.*:.*" + } + } + ] + } + }, + "additionalProperties": false, + "required": [ + "server", + "virtualServer" + ] + }, + "GSLB_Pool_Member_AAAA": { + "title": "GSLB AAAA rrType Pool Member", + "description": "Declares member of the GSLB pool", + "type": "object", + "properties": { + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "server": { + "$ref": "#/definitions/Pointer_GSLB_Server" + }, + "virtualServer": { + "description": "Specifies that the Global Traffic Manager assigns connection requests to virtual servers based on a user-defined ranking system.", + "oneOf": [ + { + "type": "string" + }, + { + "$ref": "#/definitions/Pointer_Service" + } + ] + }, + "ratio": { + "title": "Ratio", + "description": "Specifies the ratio weight assigned to the pool member. This weight determines the frequency at which the pool member is selected for load balancing", + "type": "integer", + "default": 1, + "minimum": 0, + "maximum": 65535 + }, + "enabled": { + "title": "Enabled", + "description": "When true (default), the system can use the pool member and its resources for load balancing requests", + "type": "boolean", + "default": true + }, + "dependsOn": { + "description": "Specifies the name of the virtual server on which this pool member depends.", + "type": [ + "string", + "array" + ], + "oneOf": [ + { + "type": "string", + "const": "none" + }, + { + "type": "array", + "items": { + "type": "string", + "pattern": "^/Common/Shared/.*:.*" + } + } + ] + } + }, + "additionalProperties": false, + "required": [ + "server", + "virtualServer" + ] + }, + "GSLB_Pool_Member_CNAME": { + "title": "GSLB CNAME rrType Pool Member", + "description": "Declares member of the GSLB pool", + "type": "object", + "properties": { + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "ratio": { + "title": "Ratio", + "description": "Specifies the ratio weight assigned to the pool member. This weight determines the frequency at which the pool member is selected for load balancing", + "type": "integer", + "default": 1, + "minimum": 0, + "maximum": 65535 + }, + "enabled": { + "title": "Enabled", + "description": "When true (default), the system can use the pool member and its resources for load balancing requests", + "type": "boolean", + "default": true + }, + "domainName": { + "title": "Domain Name", + "description": "Specifies the domain name for this pool member", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/definitions/Pointer_GSLB_Domain_A" + }, + { + "$ref": "#/definitions/Pointer_GSLB_Domain_AAAA" + }, + { + "$ref": "#/definitions/Pointer_GSLB_Domain_CNAME" + }, + { + "$ref": "#/definitions/Pointer_GSLB_Domain_MX" + } + ] + }, + "isDomainNameStatic": { + "title": "Static DomainName/ Static Target", + "description": "Specifies that the member's name specifies a static domain name rather than a name linked to a domain defined on the system. This might be required if the target domainName is not owned by the organization or configured on the BIG-IP. One side-effect of using a static target is that the member is always considered available for load balancing. The default is (false) disabled", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false, + "required": [ + "domainName" + ] + }, + "GSLB_Pool_Member_MX": { + "title": "GSLB MX rrType Pool Member", + "description": "Declares member of the GSLB pool", + "type": "object", + "properties": { + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "enabled": { + "title": "Enabled", + "description": "When true (default), the system can use the pool member and its resources for load balancing requests", + "type": "boolean", + "default": true + }, + "domainName": { + "title": "Domain Name", + "description": "Specifies the domain name for this pool member", + "anyOf": [ + { + "$ref": "#/definitions/Pointer_GSLB_Domain_A" + }, + { + "$ref": "#/definitions/Pointer_GSLB_Domain_AAAA" + } + ] + }, + "priority": { + "title": "Priority", + "description": "Specifies the MX resource record priority", + "type": "integer", + "default": 10, + "minimum": 0, + "maximum": 65535 + }, + "ratio": { + "title": "Ratio", + "description": "Specifies the ratio weight assigned to the pool member. This weight determines the frequency at which the pool member is selected for load balancing", + "type": "integer", + "default": 1, + "minimum": 0, + "maximum": 65535 + } + }, + "additionalProperties": false, + "required": [ + "domainName" + ] + }, + "GSLB_Server": { + "title": "GSLB_Server", + "description": "Declares a GSLB server object which contains configuration for a load balancer or a host server", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "GSLB_Server" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "enabled": { + "title": "Enabled", + "description": "Specifies whether the server is enabled or disabled", + "type": "boolean", + "default": true + }, + "serverType": { + "title": "Server Type", + "description": "Specifies the server type. The server type determines the metrics that the system can collect from the server", + "type": "string", + "enum": [ + "bigip", + "generic-host" + ], + "default": "bigip" + }, + "proberPreferred": { + "title": "Prober Preferred", + "description": "Specifies the type of prober to use to monitor servers defined in this data center. The default value is inside-data-center. Note: Prober pools are not used by the bigip monitor", + "type": "string", + "enum": [ + "inherit", + "inside-datacenter", + "outside-datacenter", + "pool" + ], + "default": "inherit" + }, + "proberFallback": { + "title": "Prober Fallback", + "description": "Specifies the type of prober to use to monitor servers defined in this data center when the preferred type is not available. The default value is any-available", + "type": "string", + "enum": [ + "inherit", + "any-available", + "inside-datacenter", + "none", + "outside-datacenter", + "pool" + ], + "default": "inherit" + }, + "dataCenter": { + "$ref": "#/definitions/Pointer_GSLB_Data_Center" + }, + "devices": { + "title": "Device List", + "description": "Specifies the actual device(s) that are represented by this server object", + "type": "array", + "items": { + "$ref": "#/definitions/GSLB_Server_Device" + }, + "minItems": 1 + }, + "virtualServers": { + "title": "Virtual Server List", + "description": "Specifies the virtual server(s) that are resources on this server object", + "type": "array", + "items": { + "$ref": "#/definitions/GSLB_Virtual_Server" + } + }, + "virtualServerDiscoveryMode": { + "title": "Virtual Server Auto Discovery Mode", + "description": "Specifies virtual server auto-discovery settings. Use 'enabled' (add, modify, delete), 'enabled-no-delete' (add, modify) or the default 'disabled' (manual configuration)", + "type": "string", + "enum": [ + "disabled", + "enabled", + "enabled-no-delete" + ], + "default": "disabled" + }, + "exposeRouteDomainsEnabled": { + "title": "Expose Route Domains Enabled", + "description": "Allows virtual servers from all route domains to be auto-discovered. The default setting is false", + "type": "boolean", + "default": false + }, + "monitors": { + "title": "Monitor List", + "description": "Specifies the health monitors the system uses to determine whether it can use this server for load balancing", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_GSLB_Monitor" + }, + "default": [ + { + "bigip": "/Common/bigip" + } + ] + }, + "bpsLimit": { + "title": "Maximum Bits Per Second", + "description": "Specifies the maximum allowable data throughput rate, in bits per second, for the virtual servers on the server. If the network traffic volume exceeds this limit, the system marks the server as unavailable", + "type": "integer", + "default": 0, + "minimum": 0 + }, + "bpsLimitEnabled": { + "title": "Maximum Bits Per Second - Limit Enabled", + "description": "Enables or disables the maximum Bits Per Second (BPS) option for the virtual servers on the server. The default value is false (disabled)", + "type": "boolean", + "default": false + }, + "ppsLimit": { + "title": "Maximum Packets Per Second", + "description": "The maximum allowable data transfer rate, in packets per second, for the virtual servers on the server. If the network traffic volume exceeds this value, the system marks the server as unavailable", + "type": "integer", + "default": 0, + "minimum": 0 + }, + "ppsLimitEnabled": { + "title": "Maximum Packets Per Second - Limit Enabled", + "description": "Enables or disables the maximum Packets Per Second (PPS) option for the virtual servers on the server. The default value is false (disabled)", + "type": "boolean", + "default": false + }, + "connectionsLimit": { + "title": "Maximum Current Connections Per Second", + "description": "The number of current connections allowed for the virtual servers on the server. If the current connections exceed this value, the system marks the server as unavailable", + "type": "integer", + "default": 0, + "minimum": 0 + }, + "connectionsLimitEnabled": { + "title": "Maximum Current Connections Per Second - Limit Enabled", + "description": "Enables or disables the maximum current connections option for the virtual servers on the server. The default value is false (disabled)", + "type": "boolean", + "default": false + }, + "cpuUsageLimit": { + "title": "Maximum CPU Percent Usage", + "description": "Specifies the percent of CPU usage. If percent of CPU usage goes above the limit, the system marks the server as unavailable", + "type": "integer", + "minimum": 0 + }, + "cpuUsageLimitEnabled": { + "title": "Maximum CPU Percent Usage - Limit Enabled", + "description": "Enables or disables the CPU Usage limit option for this pool. The default value is false (disabled)", + "type": "boolean" + }, + "memoryLimit": { + "title": "Memory Available (KB)", + "description": "Specifies the available memory in kilobytes required by the virtual servers on the server. If available memory falls below this limit, the system marks the server as unavailable", + "type": "integer", + "minimum": 0 + }, + "memoryLimitEnabled": { + "title": "Memory Available - Limit Enabled", + "description": "Enables or disables the maximum Bits Per Second (BPS) option for this pool. The default value is false (disabled)", + "type": "boolean" + }, + "serviceCheckProbeEnabled": { + "title": "Path Probe - Enabled", + "description": "Specifies whether this BIG-IP device will be used to conduct a service check probe before traffic will be delegated to it. The default value is (true) enabled ", + "type": "boolean" + }, + "pathProbeEnabled": { + "title": "Service Check Probe - Enabled", + "description": "Specifies whether this BIG-IP device will be used to conduct a path probe before traffic will be delegated to it. The default value is (true) enabled ", + "type": "boolean" + }, + "snmpProbeEnabled": { + "title": "SNMP Probe - Enabled", + "description": "Specifies whether this BIG-IP device will be used to conduct a SNMP probe before traffic will be delegated to it. The default value is (true) enabled ", + "type": "boolean" + }, + "proberPool": { + "$ref": "#/definitions/Pointer_GSLB_Prober_Pool" + } + }, + "dependencies": { + "cpuUsageLimit": { + "properties": { + "serverType": { + "const": "generic-host" + } + } + }, + "cpuUsageLimitEnabled": { + "properties": { + "serverType": { + "const": "generic-host" + } + } + }, + "memoryLimit": { + "properties": { + "serverType": { + "const": "generic-host" + } + } + }, + "memoryLimitEnabled": { + "properties": { + "serverType": { + "const": "generic-host" + } + } + }, + "serviceCheckProbeEnabled": { + "properties": { + "serverType": { + "const": "bigip" + } + } + }, + "pathProbeEnabled": { + "properties": { + "serverType": { + "const": "bigip" + } + } + }, + "snmpProbeEnabled": { + "properties": { + "serverType": { + "const": "bigip" + } + } + }, + "proberPreferred": { + "if": { + "properties": { + "proberPreferred": { + "const": "pool" + } + } + }, + "then": { + "required": [ + "proberPool" + ] + } + }, + "proberFallback": { + "if": { + "properties": { + "proberFallback": { + "const": "pool" + } + } + }, + "then": { + "required": [ + "proberPool" + ] + } + } + }, + "allOf": [ + { + "if": { + "required": [ + "serverType" + ], + "properties": { + "serverType": { + "const": "generic-host" + } + } + }, + "then": { + "properties": { + "devices": { + "maxItems": 1 + }, + "cpuUsageLimit": { + "default": 0 + }, + "cpuUsageLimitEnabled": { + "default": false + }, + "memoryLimit": { + "default": 0 + }, + "memoryLimitEnabled": { + "default": false + } + } + } + }, + { + "if": { + "required": [ + "serverType" + ], + "properties": { + "serverType": { + "const": "bigip" + } + } + }, + "then": { + "properties": { + "serviceCheckProbeEnabled": { + "default": true + }, + "pathProbeEnabled": { + "default": true + }, + "snmpProbeEnabled": { + "default": true + } + } + } + } + ], + "required": [ + "class", + "dataCenter", + "devices" + ], + "additionalProperties": false + }, + "GSLB_Server_Device": { + "description": "Configures a device for the GSLB Server", + "type": "object", + "properties": { + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "address": { + "title": "Address", + "type": "string", + "description": " Specifies an external (public) address for the device. If BIG-IP DNS configuration synchronization is enabled and all existing addresses for a device are being replaced, new addresses should be added and synchronized before old addresses are removed, otherwise the changes may fail to synchronize. Alternatively, the address configuration changes can be performed on each BIG-IP DNS system", + "format": "f5ip" + }, + "addressTranslation": { + "title": "Address Translation", + "type": "string", + "description": "Specifies the internal (private) address that corresponds to the external address", + "format": "f5ip" + } + }, + "required": [ + "address" + ] + }, + "GSLB_Data_Center": { + "title": "GSLB_Data_Center", + "description": "Declares a GSLB Data Center configuration", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "GSLB_Data_Center" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "enabled": { + "title": "Enabled", + "description": "Specifies whether the data center is enabled or disabled", + "type": "boolean", + "default": true + }, + "location": { + "title": "Location", + "description": "Specifies the location of the data center", + "type": "string" + }, + "contact": { + "title": "Contact", + "description": "Specifies the name of the administrator or the name of the department that manages the data center", + "type": "string" + }, + "proberPreferred": { + "title": "Prober Preferred", + "description": "Specifies the type of prober to use to monitor servers defined in this data center. The default value is inside-data-center. Note: Prober pools are not used by the bigip monitor", + "type": "string", + "enum": [ + "inside-datacenter", + "outside-datacenter", + "pool" + ], + "default": "inside-datacenter" + }, + "proberFallback": { + "title": "Prober Fallback", + "description": "Specifies the type of prober to use to monitor servers defined in this data center when the preferred type is not available. The default value is any-available", + "type": "string", + "enum": [ + "any-available", + "inside-datacenter", + "none", + "outside-datacenter", + "pool" + ], + "default": "any-available" + }, + "proberPool": { + "$ref": "#/definitions/Pointer_GSLB_Prober_Pool" + } + }, + "dependencies": { + "proberPool": { + "anyOf": [ + { + "properties": { + "proberPreferred": { + "const": "pool" + } + } + }, + { + "properties": { + "proberFallback": { + "const": "pool" + } + } + } + ] + } + }, + "additionalProperties": false, + "required": [ + "class" + ] + }, + "GSLB_Virtual_Server": { + "title": "GSLB virtual server", + "description": "GSLB virtual server", + "type": "object", + "properties": { + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "enabled": { + "title": "Enabled", + "description": "Specifies whether the virtual server is enabled or disabled", + "type": "boolean", + "default": true + }, + "port": { + "title": "Port", + "description": "L4 port for service (like 443 for HTTPS)", + "type": "integer", + "minimum": 0, + "maximum": 65535 + }, + "address": { + "title": "Address", + "description": "Format of address for virtual server (such as IPv4)", + "type": "string", + "format": "f5ip" + }, + "addressTranslation": { + "title": "Address Translation", + "description": "Specifies the public address that this virtual server translates into when the GSLB provider communicates between the network and the Internet. The default value is disabled", + "type": "string", + "format": "f5ip" + }, + "addressTranslationPort": { + "title": "Address Translation Port", + "description": "L4 port for service (like 443 for HTTPS)", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 0 + }, + "monitors": { + "title": "Monitors", + "description": "Specifies the health monitors that the system uses to determine whether it can use this linked virtual server for load balancing", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_GSLB_Monitor" + } + }, + "name": { + "title": "Name", + "description": "Specifies the name of the Virtual Server", + "type": "string" + } + }, + "required": [ + "address", + "port" + ], + "additionalProperties": false + }, + "GSLB_Prober_Pool": { + "title": "GSLB_Prober_Pool", + "description": "Declares a pool of BIG-IP devices that will monitor server resources for health and performance. Note: Prober pools are not used by the bigip monitor", + "f5PostProcess": { + "tag": "modules", + "data": [ + "gtm" + ] + }, + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "GSLB_Prober_Pool" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "enabled": { + "title": "Enabled", + "description": "Specifies whether this pool is available for conducting probes", + "type": "boolean", + "default": true + }, + "lbMode": { + "title": "Load Balancing Mode", + "description": "Specifies the load balancing mode the system uses to select the members of this pool", + "type": "string", + "enum": [ + "global-availability", + "round-robin" + ] + }, + "members": { + "title": "Members", + "description": "Specifies the members of the prober pool", + "type": "array", + "items": { + "$ref": "#/definitions/GSLB_Prober_Pool_Member" + } + } + } + }, + "GSLB_Prober_Pool_Member": { + "title": "GSLB Prober Pool Member", + "description": "Declares member of the GSLB prober pool", + "type": "object", + "properties": { + "enabled": { + "title": "Prober Pool Member Enabled", + "description": "Specifies whether the server can be used as a member of a prober pool", + "type": "boolean", + "default": true + }, + "memberOrder": { + "title": "Prober Pool Member Order", + "description": "Specifies the order in which this server appears in the prober pool", + "type": "integer", + "default": 0, + "minimum": 0, + "maximum": 65535 + } + } + }, + "GSLB_Topology_Records": { + "title": "GSLB_Topology_Records", + "description": "Defines GSLB Topology records", + "type": "object", + "properties": { + "label": { + "$ref": "#/definitions/Label" + }, + "class": { + "title": "Class", + "type": "string", + "const": "GSLB_Topology_Records" + }, + "longestMatchEnabled": { + "title": "Longest Match Algorithm Enabled", + "description": "Enables the algorithm that requires the system to evaluate all records in the topology statement and use the record that most completely matches the source IP address of the name resolution request. If true, the order of the records as they appear in the array will not be preserved", + "type": "boolean", + "default": true + }, + "records": { + "title": "Record List", + "description": "Specifies the actual device(s) that are represented by this server object", + "type": "array", + "items": { + "$ref": "#/definitions/GSLB_Topology_Record" + }, + "minItems": 1 + } + }, + "required": [ + "class", + "records" + ] + }, + "GSLB_Topology_Record": { + "type": "object", + "properties": { + "source": { + "title": "Request Source", + "description": "Specifies the origination section of the topology record, the local DNS", + "allOf": [ + { + "$ref": "#/definitions/GSLB_Topology_Condition" + } + ] + }, + "destination": { + "title": "Request Destination", + "description": "Specifies where the system directs the incoming DNS request", + "allOf": [ + { + "$ref": "#/definitions/GSLB_Topology_Condition" + } + ] + }, + "weight": { + "title": "Record Weight", + "description": "Specifies the weight for the topology record. The system load balances to the server object and DNS that matches the record with the highest topology weight", + "type": "integer", + "default": 1, + "minimum": 0, + "maximum": 4294967295 + } + }, + "allOf": [ + { + "not": { + "properties": { + "source": { + "properties": { + "matchType": { + "const": "pool" + } + } + } + } + } + }, + { + "not": { + "properties": { + "source": { + "properties": { + "matchType": { + "const": "datacenter" + } + } + } + } + } + } + ], + "required": [ + "source", + "destination" + ] + }, + "GSLB_Topology_Region": { + "title": "GSLB_Topology_Region", + "description": "Defines a GSLB Topology region", + "type": "object", + "properties": { + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "class": { + "title": "Class", + "type": "string", + "const": "GSLB_Topology_Region" + }, + "members": { + "title": "Region Member List", + "description": "Configures the list of members for this region", + "type": "array", + "items": { + "$ref": "#/definitions/GSLB_Topology_Condition" + } + } + }, + "required": [ + "class" + ] + }, + "GSLB_Topology_Condition": { + "type": "object", + "properties": { + "matchType": { + "title": "Match Type", + "description": "Specifies the type/category of match to perform", + "type": "string", + "enum": [ + "continent", + "country", + "datacenter", + "geoip-isp", + "isp", + "pool", + "region", + "state", + "subnet" + ] + }, + "matchOperator": { + "title": "Match Operator", + "description": "Specifies the operation to perform a match. Default value is equals (matches)", + "type": "string", + "enum": [ + "equals", + "not-equals" + ], + "default": "equals" + }, + "matchValue": { + "title": "Match Value", + "description": "Specifies the value to match", + "type": [ + "string", + "object" + ] + } + }, + "allOf": [ + { + "if": { + "properties": { + "matchType": { + "const": "continent" + } + } + }, + "then": { + "properties": { + "matchValue": { + "$ref": "#/definitions/Enum_Continent_Code_Alpha_2" + } + } + } + }, + { + "if": { + "properties": { + "matchType": { + "const": "country" + } + } + }, + "then": { + "properties": { + "matchValue": { + "$ref": "#/definitions/Enum_Country_Code_Alpha_2" + } + } + } + }, + { + "if": { + "properties": { + "matchType": { + "const": "datacenter" + } + } + }, + "then": { + "properties": { + "matchValue": { + "$ref": "#/definitions/Pointer_GSLB_Data_Center" + } + } + } + }, + { + "if": { + "properties": { + "matchType": { + "const": "geoip-isp" + } + } + }, + "then": { + "properties": { + "matchValue": { + "type": "string" + } + } + } + }, + { + "if": { + "properties": { + "matchType": { + "const": "isp" + } + } + }, + "then": { + "properties": { + "matchValue": { + "$ref": "#/definitions/Enum_ISP" + } + } + } + }, + { + "if": { + "properties": { + "matchType": { + "const": "pool" + } + } + }, + "then": { + "properties": { + "matchValue": { + "$ref": "#/definitions/Pointer_GSLB_Pool" + } + } + } + }, + { + "if": { + "properties": { + "matchType": { + "const": "region" + } + } + }, + "then": { + "properties": { + "matchValue": { + "$ref": "#/definitions/Pointer_GSLB_Topology_Region" + } + } + } + }, + { + "if": { + "properties": { + "matchType": { + "const": "state" + } + } + }, + "then": { + "properties": { + "matchValue": { + "description": "State value in the format /, for example: US/Washington", + "type": "string", + "minLength": 4 + } + } + } + }, + { + "if": { + "properties": { + "matchType": { + "const": "subnet" + } + } + }, + "then": { + "properties": { + "matchValue": { + "type": "string", + "format": "f5ip" + } + } + } + } + ], + "required": [ + "matchType", + "matchValue" + ] + }, + "GSLB_Pool_A": { + "description": "Pointer to a Pool A object", + "allOf": [ + { + "$ref": "#/definitions/GSLB_Pool" + } + ] + }, + "GSLB_Pool_AAAA": { + "description": "Pointer to a Pool AAAA object", + "allOf": [ + { + "$ref": "#/definitions/GSLB_Pool" + } + ] + }, + "GSLB_Pool_CNAME": { + "description": "Pointer to a Pool CNAME object", + "allOf": [ + { + "$ref": "#/definitions/GSLB_Pool" + } + ] + }, + "GSLB_Pool_MX": { + "description": "Pointer to a Pool MX object", + "allOf": [ + { + "$ref": "#/definitions/GSLB_Pool" + } + ] + }, + "ALG_Log_Profile": { + "type": "object", + "title": "ALG_Log_Profile", + "description": "Configures an application layer gateway log profle", + "f5PostProcess": { + "tag": "modules", + "data": [ + "cgnat" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "ALG_Log_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "csvFormat": { + "description": "Generate entries in comma-separated-values (csv) format", + "type": "boolean", + "default": false + }, + "startControlChannel": { + "description": "Event for start of control channel connection", + "type": "object", + "properties": { + "action": { + "description": "Specify the logging action to be taken when a particular event is encountered. If 'enabled' logging is enabled for the event, regardless of how the flow is created. If 'disabled' logging is disabled for the event. If 'backup-allocation-only' logging is enabled for the event when the ALG is proxy with a LSN, and translation is taken from the backup pool member only.", + "type": "string", + "enum": [ + "enabled", + "disabled", + "backup-allocation-only" + ], + "default": "disabled" + }, + "includeDestination": { + "description": "Include destination address/port in the log message", + "type": "boolean", + "default": false + } + }, + "default": { + "action": "disabled", + "includeDestination": false + }, + "additionalProperties": false + }, + "endControlChannel": { + "description": "Event for end of control channel connection", + "type": "object", + "properties": { + "action": { + "description": "Specify the logging action to be taken when a particular event is encountered. If 'enabled' logging is enabled for the event, regardless of how the flow is created. If 'disabled' logging is disabled for the event. If 'backup-allocation-only' logging is enabled for the event when the ALG is proxy with a LSN, and translation is taken from the backup pool member only.", + "type": "string", + "enum": [ + "enabled", + "disabled", + "backup-allocation-only" + ], + "default": "enabled" + }, + "includeDestination": { + "description": "Include destination address/port in the log message", + "type": "boolean", + "default": false + } + }, + "default": { + "action": "enabled", + "includeDestination": false + }, + "additionalProperties": false + }, + "startDataChannel": { + "description": "Event for start of data channel connection", + "type": "object", + "properties": { + "action": { + "description": "Specify the logging action to be taken when a particular event is encountered. If 'enabled' logging is enabled for the event, regardless of how the flow is created. If 'disabled' logging is disabled for the event. If 'backup-allocation-only' logging is enabled for the event when the ALG is proxy with a LSN, and translation is taken from the backup pool member only.", + "type": "string", + "enum": [ + "enabled", + "disabled", + "backup-allocation-only" + ], + "default": "disabled" + }, + "includeDestination": { + "description": "Include destination address/port in the log message", + "type": "boolean", + "default": false + } + }, + "default": { + "action": "disabled", + "includeDestination": false + }, + "additionalProperties": false + }, + "endDataChannel": { + "description": "Event for end of data channel connection", + "type": "object", + "properties": { + "action": { + "description": "Specify the logging action to be taken when a particular event is encountered. If 'enabled' logging is enabled for the event, regardless of how the flow is created. If 'disabled' logging is disabled for the event. If 'backup-allocation-only' logging is enabled for the event when the ALG is proxy with a LSN, and translation is taken from the backup pool member only.", + "type": "string", + "enum": [ + "enabled", + "disabled", + "backup-allocation-only" + ], + "default": "enabled" + }, + "includeDestination": { + "description": "Include destination address/port in the log message", + "type": "boolean", + "default": false + } + }, + "default": { + "action": "enabled", + "includeDestination": false + }, + "additionalProperties": false + }, + "inboundTransaction": { + "description": "Generates event log entries of SIP messages. Triggered by inbound connection to the BIG-IP system", + "type": "object", + "properties": { + "action": { + "description": "Specify the logging action to be taken when a particular event is encountered. If 'enabled' logging is enabled for the event, regardless of how the flow is created. If 'disabled' logging is disabled for the event. Inbound transaction log entry could contain both incoming and outgoing messages.", + "type": "string", + "enum": [ + "enabled", + "disabled" + ], + "default": "disabled" + } + }, + "default": { + "action": "disabled" + } + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "Security_Log_Profile": { + "type": "object", + "title": "Security_Log_Profile", + "description": "Configures a Security log profile", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm", + "asm" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Security_Log_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "application": { + "$ref": "#/definitions/Security_Log_Profile_Application" + }, + "botDefense": { + "$ref": "#/definitions/Security_Log_Profile_Bot_Defense" + }, + "classification": { + "$ref": "#/definitions/Security_Log_Profile_Classification" + }, + "dosApplication": { + "$ref": "#/definitions/Security_Log_Profile_Dos_Application" + }, + "dosNetwork": { + "$ref": "#/definitions/Security_Log_Profile_Dos_Network" + }, + "ipIntelligence": { + "$ref": "#/definitions/Security_Log_Profile_Ip_Intelligence" + }, + "nat": { + "$ref": "#/definitions/Security_Log_Profile_Nat" + }, + "network": { + "$ref": "#/definitions/Security_Log_Profile_Network" + }, + "protocolDns": { + "$ref": "#/definitions/Security_Log_Profile_Protocol_Dns" + }, + "protocolDnsDos": { + "$ref": "#/definitions/Security_Log_Profile_Protocol_Dns_Dos" + }, + "protocolInspection": { + "$ref": "#/definitions/Security_Log_Profile_Protocol_Inspection" + }, + "protocolSip": { + "$ref": "#/definitions/Security_Log_Profile_Protocol_Sip" + }, + "protocolSipDos": { + "$ref": "#/definitions/Security_Log_Profile_Protocol_Sip_Dos" + }, + "protocolTransfer": { + "$ref": "#/definitions/Security_Log_Profile_Protocol_Transfer" + }, + "sshProxy": { + "$ref": "#/definitions/Security_Log_Profile_Ssh_Proxy" + } + }, + "required": [ + "class" + ], + "dependencies": { + "application": { + "not": { + "oneOf": [ + { + "required": [ + "protocolDns" + ] + }, + { + "required": [ + "protocolSip" + ] + }, + { + "required": [ + "sshProxy" + ] + } + ] + } + }, + "protocolDns": { + "not": { + "required": [ + "application" + ] + } + }, + "protocolSip": { + "not": { + "required": [ + "application" + ] + } + }, + "sshProxy": { + "not": { + "required": [ + "application" + ] + } + } + } + }, + "Security_Log_Profile_Application": { + "description": "When enabled, specifies the system logs events from applications.", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "asm" + ] + }, + "properties": { + "facility": { + "description": "Specifies the facility category of the logged traffic", + "type": "string", + "enum": [ + "local0", + "local1", + "local2", + "local3", + "local4", + "local5", + "local6", + "local7" + ], + "default": "local0" + }, + "storageFilter": { + "description": "Adds, deletes, or replaces a set of request filters", + "type": "object", + "properties": { + "logicalOperation": { + "description": "Specifies the logical operation on associated filters", + "type": "string", + "enum": [ + "and", + "or" + ], + "default": "or" + }, + "requestType": { + "description": "Specifies which kind of requests the system or server will log", + "type": "string", + "enum": [ + "all", + "illegal", + "illegal-including-staged-signatures" + ], + "default": "illegal" + }, + "protocols": { + "description": "Specifies if request logging is dependent on the protocols", + "type": "array", + "items": { + "type": "string", + "enum": [ + "http", + "https", + "ws", + "wss" + ] + } + }, + "responseCodes": { + "description": "Specifies whether request logging is dependent on the response status codes", + "type": "array", + "items": { + "type": "string", + "enum": [ + "100", + "101", + "102", + "200", + "201", + "202", + "203", + "204", + "205", + "206", + "207", + "300", + "301", + "302", + "303", + "304", + "305", + "306", + "307", + "400", + "401", + "402", + "403", + "404", + "405", + "406", + "407", + "408", + "409", + "410", + "411", + "412", + "413", + "414", + "415", + "416", + "417", + "422", + "423", + "424", + "500", + "501", + "502", + "503", + "504", + "505", + "507", + "510" + ] + } + }, + "httpMethods": { + "description": "Specifies whether request logging is dependent on the HTTP methods", + "type": "array", + "items": { + "type": "string", + "enum": [ + "ACL", + "BDELETE", + "BMOVE", + "BPROPFIND", + "BPROPPATCH", + "CHECKIN", + "CHECKOUT", + "CONNECT", + "COPY", + "DELETE", + "GET", + "HEAD", + "LINK", + "LOCK", + "MERGE", + "MKCOL", + "MKWORKSPACE", + "MOVE", + "NOTIFY", + "OPTIONS", + "PATCH", + "POLL", + "POST", + "PROPFIND", + "PROPPATCH", + "PUT", + "REPORT", + "RPC_IN_DATA", + "RPC_OUT_DATA", + "SEARCH", + "SUBSCRIBE", + "TRACE", + "TRACK", + "UNLINK", + "UNLOCK", + "UNSUBSCRIBE", + "VERSION_CONTROL", + "X-MS-ENUMATTS" + ] + } + }, + "requestContains": { + "description": "Specifies whether the request logging is dependent on s specific string and where to look for that string", + "type": "object", + "properties": { + "searchIn": { + "description": "Where to look for the specified string", + "type": "string", + "enum": [ + "search-in-headers", + "search-in-post-data", + "search-in-query-string", + "search-in-request", + "search-in-uri" + ] + }, + "value": { + "description": "The specified string to look for", + "type": "string", + "minLength": 1 + } + }, + "required": [ + "searchIn", + "value" + ], + "additionalProperties": false + }, + "loginResults": { + "description": "Specifies whether the request logging is dependent on the login results", + "type": "array", + "items": { + "type": "string", + "enum": [ + "login-result-successful", + "login-result-failed", + "login-result-unknown" + ] + } + } + }, + "default": {}, + "additionalProperties": false + }, + "storageFormat": { + "description": "Specifies a storage format", + "anyOf": [ + { + "description": "Specifies a user string", + "type": "string", + "minLength": 1 + }, + { + "type": "object", + "properties": { + "fields": { + "description": "Replaces a set of fields when predefined storage format. Order is important - the server will display the selected items in the log sequentially according to this", + "type": "array", + "items": { + "type": "string", + "enum": [ + "attack_type", + "avr_id", + "blocking_exception_reason", + "captcha_result", + "client_type", + "date_time", + "dest_ip", + "dest_port", + "device_id", + "fragment", + "geo_location", + "headers", + "http_class_name", + "ip_address_intelligence", + "ip_client", + "ip_with_route_domain", + "is_truncated", + "logic_result", + "management_ip_address", + "management_ip_address_2", + "method", + "mobile_application_name", + "mobile_application_version", + "password", + "policy_apply_date", + "policy_name", + "protocol", + "query_string", + "request", + "request_status", + "response", + "response_code", + "route_domain", + "salt", + "session_id", + "severity", + "sig_ids", + "sig_names", + "sig_set_names", + "slot_number", + "src_port", + "staged_sig_names", + "staged_sig_set_names", + "staged_threat_campaign_names", + "sub_violations", + "support_id", + "threat_campaign_names", + "unit_hostname", + "uri", + "username", + "violation_details", + "violation_rating", + "violations", + "virus_name", + "websocket_direction", + "websocket_message_type", + "x_forwarded_for_header_value" + ] + } + }, + "delimiter": { + "description": "Specifies a delimiter when predefined storage format", + "type": "string", + "default": ",", + "minLength": 1 + } + }, + "required": [ + "fields" + ], + "additionalProperties": false + } + ] + }, + "guaranteeLoggingEnabled": { + "description": "Indicates whether to guarantee local logging", + "type": "boolean", + "default": false + }, + "guaranteeResponseLoggingEnabled": { + "description": "Indicates whether to guarantee local response logging. guaranteeLoggingEnabled must be true and responseLogging must be illegal or all", + "type": "boolean", + "default": false + }, + "localStorage": { + "description": "Enables or disabled local storage", + "type": "boolean", + "default": true + }, + "maxEntryLength": { + "description": "Specifies the maximum entry length", + "type": "string", + "enum": [ + "1k", + "2k", + "10k", + "64k" + ], + "default": "2k" + }, + "maxHeaderSize": { + "description": "Specifies the maximum headers size", + "type": "integer", + "minimum": 1, + "maximum": 2048 + }, + "maxQuerySize": { + "description": "Specifies the maximum query string size", + "type": "integer", + "minimum": 1, + "maximum": 2048 + }, + "maxRequestSize": { + "description": "Specifies the maximum request size", + "type": "integer", + "minimum": 1, + "maximum": 2048 + }, + "protocol": { + "description": "Specifies the protocol supported by the remote server", + "type": "string", + "enum": [ + "udp", + "tcp", + "tcp-rfc3195" + ], + "default": "tcp" + }, + "remoteStorage": { + "description": "Specifies a remote storage type", + "type": "string", + "enum": [ + "remote", + "splunk", + "arcsight", + "bigiq" + ] + }, + "reportAnomaliesEnabled": { + "description": "Indicates whether to report detected anomalies", + "type": "boolean", + "default": false + }, + "responseLogging": { + "description": "Specifies a response logging type", + "type": "string", + "enum": [ + "none", + "illegal", + "all" + ], + "default": "none" + }, + "servers": { + "description": "Adds, deletes, or replaces a set of remote servers", + "type": "array", + "items": { + "type": "object", + "properties": { + "address": { + "description": "The IP address", + "type": "string" + }, + "port": { + "description": "The service port", + "type": "string" + } + }, + "required": [ + "address", + "port" + ], + "additionalProperties": false + } + } + }, + "additionalProperties": false + }, + "Security_Log_Profile_Bot_Defense": { + "title": "Bot Defense Log Profile", + "description": "Specifies, when enabled, the system logs events from the Proactive Bot Defense mechanism.", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "asm" + ] + }, + "properties": { + "localPublisher": { + "description": "Specifies, when enabled, a Log Publisher to log events to (Note: This publisher should have a single local-database destination)", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Log_Publisher" + } + ] + }, + "remotePublisher": { + "description": "Enables selecting a Log Publisher that has Splunk enabled", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Log_Publisher" + } + ] + }, + "logBotSignatureMatchedRequests": { + "description": "This option enables or disables the logging of reported bot signature requests", + "type": "boolean", + "default": false + }, + "logCaptchaChallengedRequests": { + "description": "This option enables or disables the logging of captcha challenged requests", + "type": "boolean", + "default": false + }, + "logChallengedRequests": { + "description": "This option enables or disables the logging of challenged requests", + "type": "boolean", + "default": false + }, + "logIllegalRequests": { + "description": "This option enables or disables the logging of illegal requests", + "type": "boolean", + "default": true + }, + "logLegalRequests": { + "description": "This option enables or disables the logging of legal requests", + "type": "boolean", + "default": false + }, + "logAlarm": { + "description": "This option enables or disables the logging of requests with alarm mitigation. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + }, + "logBlock": { + "description": "This option enables or disables the logging of requests with block mitigation. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + }, + "logBrowser": { + "description": "This option enables or disables the logging of requests with browser classification. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + }, + "logBrowserVerificationAction": { + "description": "This option enables or disables the logging of requests by browser verification action. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + }, + "logCaptcha": { + "description": "This option enables or disables the logging of requests with captcha mitigation. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + }, + "logDeviceIdCollectionRequest": { + "description": "This option enables or disables the logging of requests by device ID collection. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + }, + "logMaliciousBot": { + "description": "This option enables or disables the logging of requests with malicious bot classification. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + }, + "logMobileApplication": { + "description": "This option enables or disables the logging of requests with mobile application classification. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + }, + "logNone": { + "description": "This option enables or disables the logging of requests with no mitigation. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + }, + "logRateLimit": { + "description": "This option enables or disables the logging of requests with rate limit mitigation. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + }, + "logSuspiciousBrowser": { + "description": "This option enables or disables the logging of requests with suspicious browser classification. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + }, + "logTcpReset": { + "description": "This option enables or disables the logging of requests with TCP reset mitigation. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + }, + "logTrustedBot": { + "description": "This option enables or disables the logging of requests with trusted bot classification. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + }, + "logUnknown": { + "description": "This option enables or disables the logging of requests with unknown classification. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": true + }, + "logUntrustedBot": { + "description": "This option enables or disables the logging of requests with untrusted bot classification. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + }, + "logHoneyPotPage": { + "description": "This option enables or disables the logging of requests with honey pot page mitigation. This property is available on BIGIP 15.0 and above.", + "type": "boolean", + "default": false + }, + "logRedirectToPool": { + "description": "This option enables or disables the logging of requests with redirect to pool mitigation. This property is available on BIGIP 15.0 and above.", + "type": "boolean", + "default": false + }, + "logChallengeFailureRequest": { + "description": "This option enables or disables the logging of requests by challenge failure. This property is available on BIGIP 15.0 and above.", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + }, + "Security_Log_Profile_Classification": { + "title": "Classification Log Profile", + "description": "Specifies, when enabled, that the system logs events from the Classification engine.", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + }, + "properties": { + "publisher": { + "description": "Specifies where the system sends log messages", + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to log publisher declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Log_Publisher" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP log publisher", + "description": "Pathname of existing BIG-IP log publisher", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys log-config publisher" + ] + } + }, + "logAllMatches": { + "description": "This option enables or disables the logging of all matches", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + }, + "Security_Log_Profile_Dos_Application": { + "title": "DoS Application Log Profile", + "description": "Specifies, when enabled, that the system logs detected application DoS attacks", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "asm" + ] + }, + "properties": { + "localPublisher": { + "description": "Specifies the local log publisher used for Application DoS attacks (Note: This publisher should have a single local-database destination)", + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to log publisher declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Log_Publisher" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP log publisher", + "description": "Pathname of existing BIG-IP log publisher", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys log-config publisher" + ] + } + }, + "remotePublisher": { + "description": "Specifies the remote log publisher used for Application DoS attacks (Note: This publisher should have ArcSight or Splunk destinations)", + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to log publisher declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Log_Publisher" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP log publisher", + "description": "Pathname of existing BIG-IP log publisher", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys log-config publisher" + ] + } + } + }, + "additionalProperties": false + }, + "Security_Log_Profile_Dos_Network": { + "title": "DoS Network Log Profile", + "description": "Specifies, when enabled, that the system logs detected network DoS attacks", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm", + "dos", + "em" + ] + }, + "properties": { + "publisher": { + "description": "Specifies the name of the log publisher used for logging Network DoS events", + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to log publisher declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Log_Publisher" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP log publisher", + "description": "Pathname of existing BIG-IP log publisher", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys log-config publisher" + ] + } + } + }, + "additionalProperties": false + }, + "Security_Log_Profile_Nat": { + "title": "Network Address Translation Log Profile", + "description": "Specifies, when enabled, that the system logs Firewall NAT events", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + }, + "properties": { + "publisher": { + "description": "Specifies the name of the log publisher used for logging Network Address Translation events", + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to log publisher declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Log_Publisher" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP log publisher", + "description": "Pathname of existing BIG-IP log publisher", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys log-config publisher" + ] + } + }, + "logErrors": { + "description": "Generates event log entries when a NAT translation errors occur", + "type": "boolean", + "default": false + }, + "logSubscriberId": { + "description": "Logs the subscriber ID associated with a subscriber IP address", + "type": "boolean", + "default": false + }, + "logQuotaExceeded": { + "description": "Generates event log entries when a NAT client exceeds allocated resources", + "type": "boolean", + "default": false + }, + "logStartInboundSession": { + "description": "Generates event log entries at the start of the incoming connection event for a translated endpoint. Triggered when the system creates the inbound session.", + "type": "boolean", + "default": false + }, + "logEndInboundSession": { + "description": "Generates event log entries at the end of the incoming connection event for a translated endpoint. Triggered when the system frees the inbound session.", + "type": "boolean", + "default": false + }, + "logStartOutboundSession": { + "description": "Generates event log entries at start of the translation event for a NAT client. Triggered when the system creates the outbound session.", + "type": "boolean", + "default": false + }, + "logStartOutboundSessionDestination": { + "description": "Include destination address and port with log entry for the start of the translation event for a NAT client. This is applicable only if lsn-legacy-mode is enabled", + "type": "boolean", + "default": false + }, + "logEndOutboundSession": { + "description": "Generates event log entries at end of translation event for a NAT client. Triggered when the system frees the outbound session.", + "type": "boolean", + "default": false + }, + "logEndOutboundSessionDestination": { + "description": "Include destination address and port with log entry for the end of the translation event for a NAT client. This is applicable only if lsn-legacy-mode is enabled", + "type": "boolean", + "default": false + }, + "lsnLegacyMode": { + "description": "This option specifies whether translation events (and other NAT events) are logged in existing CGNAT/LSN formats (for backward compatibility with LSN events).", + "type": "boolean", + "default": false + }, + "rateLimitAggregate": { + "description": " This option sets the aggregate rate for all the Firewall NAT log events that the system can log per second", + "type": "integer", + "default": 4294967295 + }, + "rateLimitErrors": { + "description": "This option rate limits the errors the system logs per second", + "type": "integer", + "default": 4294967295 + }, + "rateLimitQuotaExceeded": { + "description": "This option rate limits the quota exceeded log events per second", + "type": "integer", + "default": 4294967295 + }, + "rateLimitStartInboundSession": { + "description": "This option rate limits the start inbound session log events per second", + "type": "integer", + "default": 4294967295 + }, + "rateLimitEndInboundSession": { + "description": "This option rate limits the end inbound session log events per second", + "type": "integer", + "default": 4294967295 + }, + "rateLimitStartOutboundSession": { + "description": "This option rate limits the start outbound session log events per second", + "type": "integer", + "default": 4294967295 + }, + "rateLimitEndOutboundSession": { + "description": "This option rate limits the end outbound session log events per second", + "type": "integer", + "default": 4294967295 + }, + "formatErrors": { + "$ref": "#/definitions/Security_Log_Profile_Nat_Storage_Format" + }, + "formatQuotaExceeded": { + "$ref": "#/definitions/Security_Log_Profile_Nat_Storage_Format" + }, + "formatStartInboundSession": { + "$ref": "#/definitions/Security_Log_Profile_Nat_Storage_Format" + }, + "formatEndInboundSession": { + "$ref": "#/definitions/Security_Log_Profile_Nat_Storage_Format" + }, + "formatStartOutboundSession": { + "$ref": "#/definitions/Security_Log_Profile_Nat_Storage_Format" + }, + "formatEndOutboundSession": { + "$ref": "#/definitions/Security_Log_Profile_Nat_Storage_Format" + } + }, + "required": [ + "publisher" + ], + "additionalProperties": false, + "dependencies": { + "logStartOutboundSessionDestination": { + "if": { + "properties": { + "logStartOutboundSessionDestination": { + "const": true + } + } + }, + "then": { + "properties": { + "logStartOutboundSession": { + "const": true + } + } + } + }, + "logEndOutboundSessionDestination": { + "if": { + "properties": { + "logEndOutboundSessionDestination": { + "const": true + } + } + }, + "then": { + "properties": { + "logEndOutboundSession": { + "const": true + } + } + } + } + } + }, + "Security_Log_Profile_Nat_Storage_Format": { + "description": "Specifies the format type for log messages", + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "object", + "properties": { + "fields": { + "description": "Replaces a set of fields in the predefined storage format", + "type": "array", + "items": { + "type": "string", + "enum": [ + "context-name", + "duration", + "route-domain", + "sub-id", + "translated-dest-port", + "translated-src-port", + "dest-ip", + "event-name", + "src-ip", + "timestamp", + "translated-route-domain", + "dest-port", + "protocol", + "src-port", + "translated-dest-ip", + "translated-src-ip" + ] + } + }, + "delimiter": { + "description": "Specifies a field delimiter in the predefined storage format", + "type": "string", + "default": "." + } + }, + "required": [ + "fields" + ], + "additionalProperties": false + } + ] + }, + "Security_Log_Profile_Network": { + "title": "Network Log Profile", + "description": "Specifies, when enabled, that the system logs ACL rule matches, TCP events, and/or TCP/IP errors sent to the network firewall", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm", + "em" + ] + }, + "properties": { + "publisher": { + "description": "Specifies the name of the log publisher used for logging Network events", + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to log publisher declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Log_Publisher" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP log publisher", + "description": "Pathname of existing BIG-IP log publisher", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys log-config publisher" + ] + } + }, + "logRuleMatchAccepts": { + "description": "Specifies, when enabled, that the system logs packets that match ACL rules configured with action = Accept", + "type": "boolean", + "default": false + }, + "logRuleMatchDrops": { + "description": "Specifies, when enabled, that the system logs packets that match ACL rules configured with action = Drop", + "type": "boolean", + "default": false + }, + "logRuleMatchRejects": { + "description": "Specifies, when enabled, that the system logs packets that match ACL rules configured with action = Reject", + "type": "boolean", + "default": false + }, + "logIpErrors": { + "description": "Specifies, when enabled, that the system logs IP error packets", + "type": "boolean", + "default": false + }, + "logTcpErrors": { + "description": "Specifies, when enabled, that the system logs TCP error packets", + "type": "boolean", + "default": false + }, + "logTcpEvents": { + "description": "Specifies, when enabled, that the system logs TCP events (open and close of TCP sessions)", + "type": "boolean", + "default": false + }, + "logTranslationFields": { + "description": "Specifies, when enabled, that the system logs translation values if and when it logs a network firewall event", + "type": "boolean", + "default": false + }, + "alwaysLogRegion": { + "description": "Specifies, when enabled, that when a geolocation event causes a network firewall event, the system logs the associated IP address", + "type": "boolean", + "default": false + }, + "rateLimitRuleMatchAccepts": { + "description": "This option sets rate limits for the logging of packets that match ACL rules configured with action = Accept or action = Accept Decisively", + "type": "integer", + "default": 4294967295 + }, + "rateLimitRuleMatchDrops": { + "description": "This option sets rate limits for the logging of packets that match ACL rules configured with action = Accept or action = Accept Decisively", + "type": "integer", + "default": 4294967295 + }, + "rateLimitRuleMatchRejects": { + "description": "This option sets rate limits for the logging of packets that match ACL rules configured with action = Reject", + "type": "integer", + "default": 4294967295 + }, + "rateLimitIpErrors": { + "description": "This option enables or disables the logging of IP error packets", + "type": "integer", + "default": 4294967295 + }, + "rateLimitTcpErrors": { + "description": "This option sets rate limits for the logging of TCP error packets", + "type": "integer", + "default": 4294967295 + }, + "rateLimitTcpEvents": { + "description": "This option sets rate limits for the logging of TCP events on client side", + "type": "integer", + "default": 4294967295 + }, + "rateLimitAggregate": { + "description": "This option sets the aggregate rate limit that applies to any network logging message", + "type": "integer", + "default": 4294967295 + }, + "storageFormat": { + "description": "Specifies the format type for log messages. If it is a string it is user-defined", + "anyOf": [ + { + "description": "Use this for user-defined storage format", + "type": "string", + "minLength": 1 + }, + { + "type": "object", + "properties": { + "fields": { + "description": "Replaces a set of fields in the predefined storage format", + "type": "array", + "items": { + "type": "string", + "enum": [ + "acl-policy-name", + "acl-policy-type", + "acl-rule-name", + "action", + "bigip-hostname", + "context-name", + "context-type", + "date-time", + "dest-ip", + "dest-port", + "drop-reason", + "management-ip-address", + "protocol", + "route-domain", + "sa-translation-pool", + "sa-translation-type", + "src-ip", + "src-port", + "translated-dest-ip", + "translated-dest-port", + "translated-ip-protocol", + "translated-route-domain", + "translated-src-ip", + "translated-src-port", + "translated-vlan", + "vlan" + ] + } + }, + "delimiter": { + "description": "Specifies a field delimiter in the predefined storage format", + "type": "string", + "default": "." + } + }, + "required": [ + "fields" + ], + "additionalProperties": false + } + ] + } + }, + "additionalProperties": false + }, + "Security_Log_Profile_Ip_Intelligence": { + "title": "IP Intelligence Log Profile", + "description": "Specifies, when enabled, that the system logs IP Intelligence events", + "type": "object", + "properties": { + "publisher": { + "description": "Specifies the name of the log publisher used for logging IP Intelligence events", + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to log publisher declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Log_Publisher" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP log publisher", + "description": "Pathname of existing BIG-IP log publisher", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys log-config publisher" + ] + } + }, + "logTranslationFields": { + "description": "Specifies, when enabled, that the system logs translation values if and when it logs a network firewall event", + "type": "boolean", + "default": false + }, + "rateLimitAggregate": { + "description": "Defines a rate limit for all combined IP intelligence log messages per second", + "type": "integer", + "default": 4294967295 + } + }, + "additionalProperties": false + }, + "Security_Log_Profile_Protocol_Dns": { + "title": "Protocol DNS Log Profile", + "description": "Specifies, when enabled, that the system logs DNS security events", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm", + "em" + ] + }, + "properties": { + "publisher": { + "description": "Specifies the name of the log publisher used for logging DNS security events", + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to log publisher declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Log_Publisher" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP log publisher", + "description": "Pathname of existing BIG-IP log publisher", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys log-config publisher" + ] + } + }, + "logDroppedRequests": { + "description": "Specifies, when enabled, that the system logs dropped DNS requests", + "type": "boolean", + "default": false + }, + "logFilteredDroppedRequests": { + "description": "Specifies, when enabled, that the system logs DNS requests dropped due to DNS query/header-opcode filtering. The system does not log DNS requests dropped due to errors in the way the system processes DNS packets.", + "type": "boolean", + "default": false + }, + "logMalformedRequests": { + "description": "Specifies, when enabled, that the system logs malformed DNS requests", + "type": "boolean", + "default": false + }, + "logRejectedRequests": { + "description": "Specifies, when enabled, that the system logs rejected DNS requests", + "type": "boolean", + "default": false + }, + "logMaliciousRequests": { + "description": "Specifies, when enabled, that the system logs malicious DNS requests", + "type": "boolean", + "default": false + }, + "storageFormat": { + "description": "Specifies the format type for log messages", + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "object", + "properties": { + "fields": { + "description": "Replaces a set of fields in the predefined storage format", + "type": "array", + "items": { + "type": "string", + "enum": [ + "action", + "attack-type", + "context-name", + "date-time", + "dest-ip", + "dest-port", + "dns-query-name", + "dns-query-type", + "src-ip", + "src-port", + "vlan", + "route-domain" + ] + } + }, + "delimiter": { + "description": "Specifies a field delimiter in the predefined storage format", + "type": "string", + "default": "." + } + }, + "required": [ + "fields" + ], + "additionalProperties": false + } + ] + } + }, + "additionalProperties": false + }, + "Security_Log_Profile_Protocol_Sip_Dos": { + "title": "Protocol SIP DoS Log Profile", + "description": "Specifies, when enabled, that the system logs detected SIP DoS attacks", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm", + "em" + ] + }, + "properties": { + "publisher": { + "description": "Specifies the name of the log publisher used for logging SIP DoS events", + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to log publisher declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Log_Publisher" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP log publisher", + "description": "Pathname of existing BIG-IP log publisher", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys log-config publisher" + ] + } + } + }, + "additionalProperties": false + }, + "Security_Log_Profile_Protocol_Sip": { + "title": "Protocol SIP Log Profile", + "description": "Specifies, when enabled, that the system logs SIP protocol security events", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm", + "em" + ] + }, + "properties": { + "publisher": { + "description": "Specifies the name of the log publisher used for logging SIP protocol security events", + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to log publisher declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Log_Publisher" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP log publisher", + "description": "Pathname of existing BIG-IP log publisher", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys log-config publisher" + ] + } + }, + "logDroppedRequests": { + "description": "Specifies, when enabled, that the system logs dropped requests", + "type": "boolean", + "default": false + }, + "logGlobalFailures": { + "description": "Specifies, when enabled, that the system logs global failures", + "type": "boolean", + "default": false + }, + "logMalformedRequests": { + "description": "Specifies, when enabled, that the system logs malformed requests", + "type": "boolean", + "default": false + }, + "logRedirectedResponses": { + "description": "Specifies, when enabled, that the system logs redirection responses", + "type": "boolean", + "default": false + }, + "logRequestFailures": { + "description": "Specifies, when enabled, that the system logs request failures", + "type": "boolean", + "default": false + }, + "logServerErrors": { + "description": "Specifies, when enabled, that the system logs server errors", + "type": "boolean", + "default": false + }, + "storageFormat": { + "description": "Specifies the format type for log messages", + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "object", + "properties": { + "fields": { + "description": "Replaces a set of fields in the predefined storage format", + "type": "array", + "items": { + "type": "string", + "enum": [ + "action", + "context-name", + "date-time", + "dest-ip", + "dest-port", + "sip-method-type", + "sip-caller", + "sip-callee", + "src-ip", + "src-port", + "vlan", + "route-domain" + ] + } + }, + "delimiter": { + "description": "Specifies a field delimiter in the predefined storage format", + "type": "string", + "default": "." + } + }, + "required": [ + "fields" + ], + "additionalProperties": false + } + ] + } + }, + "additionalProperties": false + }, + "Security_Log_Profile_Protocol_Dns_Dos": { + "title": "Protocol DNS DoS Log Profile", + "description": "Specifies, when enabled, that the system logs detected DNS DoS attacks", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm", + "em" + ] + }, + "properties": { + "publisher": { + "description": "Specifies the name of the log publisher used for logging DNS DoS events", + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to log publisher declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Log_Publisher" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP log publisher", + "description": "Pathname of existing BIG-IP log publisher", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys log-config publisher" + ] + } + } + }, + "additionalProperties": false + }, + "Security_Log_Profile_Protocol_Inspection": { + "title": "Protocol Inspection Log Profile", + "description": "Specifies, when enabled, that the system logs events from the Protocol Inspection engine", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm", + "em" + ] + }, + "properties": { + "publisher": { + "$ref": "#/definitions/Pointer_Log_Publisher" + }, + "logPacketPayloadEnabled": { + "description": "Enable logging of the packet payload for Protocol Inspection events", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + }, + "Security_Log_Profile_Protocol_Transfer": { + "title": "Protocol Transfer Log Profile", + "description": "Specifies, when enabled, that the system logs HTTP, FTP, and SMTP protocol security events", + "type": "object", + "properties": { + "publisher": { + "description": "Specifies where the system sends log messages", + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to log publisher declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Log_Publisher" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP log publisher", + "description": "Pathname of existing BIG-IP log publisher", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys log-config publisher" + ] + } + } + }, + "additionalProperties": false + }, + "Security_Log_Profile_Ssh_Proxy": { + "title": "SSH Proxy Security Log Profile", + "description": "Specifies, when enabled, that the system logs SSH Proxy events", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm", + "em" + ] + }, + "properties": { + "publisher": { + "description": "Specifies the name of the log publisher used for logging SSH Proxy events", + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to log publisher declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Log_Publisher" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP log publisher", + "description": "Pathname of existing BIG-IP log publisher", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys log-config publisher" + ] + } + }, + "logClientAuthFail": { + "description": "Specifies the name of the log publisher used for logging SSH Proxy events", + "type": "boolean", + "default": false + }, + "logClientAuthSuccess": { + "description": "Specifies, when enabled, that the system logs client auth success events", + "type": "boolean", + "default": false + }, + "logClientAuthPartial": { + "description": "Specifies, when enabled, that the system logs client auth partial events", + "type": "boolean", + "default": false + }, + "logServerAuthFail": { + "description": "Specifies, when enabled, that the system logs server auth failure events", + "type": "boolean", + "default": false + }, + "logServerAuthSuccess": { + "description": "Specifies, when enabled, that the system logs server auth failure events", + "type": "boolean", + "default": false + }, + "logServerAuthPartial": { + "description": "Specifies, when enabled, that the system logs server auth partial events", + "type": "boolean", + "default": false + }, + "logDisallowedChannelAction": { + "description": "Specifies, when enabled, that the system logs disallowed channel actions", + "type": "boolean", + "default": false + }, + "logAllowedChannelAction": { + "description": "Specifies, when enabled, that the system logs allowed channel actions", + "type": "boolean", + "default": false + }, + "logSshTimeout": { + "description": "Specifies, when enabled, that the system logs SSH timeouts", + "type": "boolean", + "default": false + }, + "logNonSshTraffic": { + "description": "Specifies, when enabled, that the system logs non-SSH traffic events", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + }, + "Traffic_Log_Profile": { + "title": "Traffic_Log_Profile", + "description": "A traffic log profile", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Traffic_Log_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "parentProfile": { + "description": "Specifies the name of the object to inherit the settings from", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Traffic_Log_Profile" + } + ], + "default": { + "bigip": "/Common/request-log" + } + }, + "requestSettings": { + "description": "The request settings for the profile", + "allOf": [ + { + "$ref": "#/definitions/Traffic_Log_Profile_Request_Settings" + } + ], + "default": {} + }, + "responseSettings": { + "description": "The response settings for the profile", + "allOf": [ + { + "$ref": "#/definitions/Traffic_Log_Profile_Response_Settings" + } + ], + "default": {} + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "Traffic_Log_Profile_Response_Settings": { + "description": "A traffic log profiles response settings", + "type": "object", + "properties": { + "byDefaultEnabled": { + "description": "Default response action and if response logging can be overridden by iRule", + "type": "boolean", + "default": true + }, + "responseErrorLoggingEnabled": { + "description": "Enable secondary logging if insufficient bandwidth for primary. Best used to send an alert to a separate destination", + "type": "boolean", + "default": false + }, + "responseErrorPool": { + "description": "Specifies the name of the pool from which to select log servers", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Pool" + } + ] + }, + "responseErrorProtocol": { + "description": "Specifies the HighSpeedLogging protocol to use when logging", + "type": "string", + "enum": [ + "mds-tcp", + "mds-udp" + ], + "default": "mds-udp" + }, + "responseErrorTemplate": { + "description": "Template to use when generating log messages", + "type": "string" + }, + "responsePool": { + "description": "Specifies the name of the pool from which to select log servers", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Pool" + } + ] + }, + "responseProtocol": { + "description": "Specifies the HighSpeedLogging protocol to use when logging", + "type": "string", + "enum": [ + "mds-tcp", + "mds-udp" + ], + "default": "mds-udp" + }, + "responseTemplate": { + "description": "Template to use when generating log messages", + "type": "string" + }, + "responseEnabled": { + "description": "Enables or disables logging before the response is returned to the client", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + }, + "Traffic_Log_Profile_Request_Settings": { + "description": "A traffic log profiles request settings", + "type": "object", + "properties": { + "requestErrorLoggingEnabled": { + "description": "Enable secondary logging if insufficient bandwidth for primary. Best used to send an alert to a separate destination", + "type": "boolean", + "default": false + }, + "proxyCloseOnErrorEnabled": { + "description": "Specifies, if enabled, that the logging profile will close the connection after sending its proxy-response", + "type": "boolean", + "default": false + }, + "proxyRespondOnLoggingErrorEnabled": { + "description": "Specifies that the logging profile respond directly if the logging fails", + "type": "boolean", + "default": false + }, + "proxyResponse": { + "description": "Specifies the response to send on logging errors", + "type": "string" + }, + "requestErrorPool": { + "description": "Specifies the name of the pool from which to select log servers", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Pool" + } + ] + }, + "requestErrorProtocol": { + "description": "Specifies the HighSpeedLogging protocol to use when logging", + "type": "string", + "enum": [ + "mds-tcp", + "mds-udp" + ], + "default": "mds-udp" + }, + "requestErrorTemplate": { + "description": "Template to use when generating log messages", + "type": "string" + }, + "requestPool": { + "description": "Specifies the name of the pool from which to select log servers", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Pool" + } + ] + }, + "requestProtocol": { + "description": "Specifies the HighSpeedLogging protocol to use when logging", + "type": "string", + "enum": [ + "mds-tcp", + "mds-udp" + ], + "default": "mds-udp" + }, + "requestTemplate": { + "description": "Template to use when generating log messages", + "type": "string" + }, + "requestEnabled": { + "description": "Enables or disables logging before the response is returned to the client", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + }, + "Endpoint_Policy_Rule": { + "title": "Rule", + "description": "A rule for an Endpoint policy that describes actions to perform on traffic matching given conditions", + "type": "object", + "properties": { + "name": { + "title": "Name", + "description": "Name of the endpoint policy rule", + "type": "string", + "pattern": "^[a-zA-Z0-9_\\-.:%]+$", + "maxLength": 64000 + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "conditions": { + "title": "Conditions", + "description": "Specifies the conditions for the rule to apply", + "type": "array", + "items": { + "$ref": "#/definitions/Policy_Condition" + }, + "default": [] + }, + "actions": { + "title": "Actions", + "description": "Specifies the actions for the rule to execute", + "type": "array", + "items": { + "$ref": "#/definitions/Policy_Action" + }, + "default": [] + } + }, + "additionalProperties": false, + "required": [ + "name" + ] + }, + "Endpoint_Policy": { + "title": "Endpoint_Policy", + "description": "Policy to manage connections based on metadata and content", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Endpoint_Policy" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "rules": { + "title": "Rules", + "description": "List of policy rules, order is significant", + "type": "array", + "items": { + "$ref": "#/definitions/Endpoint_Policy_Rule" + } + }, + "strategy": { + "title": "Strategy", + "description": "Rule-matching strategy; value 'custom' means BIG-IP AS3 requires a custom strategy (default is best-match)", + "type": "string", + "enum": [ + "all-match", + "best-match", + "first-match", + "custom" + ], + "default": "best-match" + }, + "customStrategy": { + "title": "Custom strategy", + "description": "BIG-IP AS3 pointer to custom strategy declaration", + "if": { + "type": "string" + }, + "then": { + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Endpoint_Strategy" + } + }, + "required": [ + "class" + ] + } + } + }, + "else": { + "type": "object", + "properties": { + "bigip": { + "title": "BIG-IP LTM strategy", + "description": "Pathname of existing BIG-IP LTM strategy", + "type": "string", + "format": "f5bigip" + } + }, + "required": [ + "bigip" + ], + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm policy-strategy" + ] + } + } + } + }, + "additionalProperties": false, + "dependencies": { + "strategy": { + "if": { + "properties": { + "strategy": { + "const": "custom" + } + } + }, + "then": { + "required": [ + "customStrategy" + ] + } + } + }, + "required": [ + "class" + ] + }, + "Endpoint_Strategy": { + "title": "Endpoint_Strategy", + "description": "Strategy for evaluation of an Endpoint policy", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Endpoint_Strategy" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "matchMethod": { + "title": "Match method", + "description": "Specifies the match method", + "type": "string", + "enum": [ + "all-match", + "best-match", + "first-match" + ] + }, + "operands": { + "title": "Operands", + "description": "Specifies the attribute for the rule to match. Sometimes this represents a specific value (for example, http-method or http-status), but frequently the operand needs a specific Selector to identify an instance (for example, http-header needs a Selectorname parameter).", + "type": "array", + "items": { + "title": "Operand", + "type": "string" + } + } + }, + "additionalProperties": false, + "required": [ + "class", + "matchMethod" + ] + }, + "Policy_Action": { + "type": "object", + "description": "LTM policy action", + "properties": { + "type": { + "description": "Selects the LTM policy action this object describes", + "type": "string", + "enum": [ + "http", + "httpCookie", + "httpHeader", + "httpRedirect", + "httpUri", + "botDefense", + "waf", + "forward", + "drop", + "clientSsl", + "persist", + "tcl", + "log" + ] + } + }, + "allOf": [ + { + "if": { + "properties": { + "type": { + "const": "http" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Action_HTTP" + } + }, + { + "if": { + "properties": { + "type": { + "const": "waf" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Action_WAF" + } + }, + { + "if": { + "properties": { + "type": { + "const": "botDefense" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Action_Bot_Defense" + } + }, + { + "if": { + "properties": { + "type": { + "const": "forward" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Action_Forward" + } + }, + { + "if": { + "properties": { + "type": { + "const": "drop" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Action_Drop" + } + }, + { + "if": { + "properties": { + "type": { + "const": "httpRedirect" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Action_HTTP_Redirect" + } + }, + { + "if": { + "properties": { + "type": { + "const": "httpHeader" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Action_HTTP_Header" + } + }, + { + "if": { + "properties": { + "type": { + "const": "httpUri" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Action_HTTP_URI" + } + }, + { + "if": { + "properties": { + "type": { + "const": "httpCookie" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Action_HTTP_Cookie" + } + }, + { + "if": { + "properties": { + "type": { + "const": "clientSsl" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Action_Client_SSL" + } + }, + { + "if": { + "properties": { + "type": { + "const": "persist" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Action_Persist" + } + }, + { + "if": { + "properties": { + "type": { + "const": "tcl" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Action_TCL" + } + }, + { + "if": { + "properties": { + "type": { + "const": "log" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Action_Log" + } + } + ], + "required": [ + "type" + ] + }, + "Policy_Action_HTTP": { + "type": "object", + "description": "Provides the ability to enable or disable BIG-IP's HTTP filter processing", + "properties": { + "event": { + "type": "string", + "description": "When to run this event in the request-response cycle", + "enum": [ + "client-accepted", + "proxy-request", + "request", + "response", + "server-connected" + ], + "default": "request" + }, + "enabled": { + "description": "Enable BIG-IP's HTTP filter processing", + "type": "boolean", + "default": true + } + }, + "required": [] + }, + "Policy_Action_WAF": { + "type": "object", + "description": "Control web security", + "properties": { + "event": { + "type": "string", + "description": "When to run this event in the request-response cycle", + "enum": [ + "client-accepted", + "proxy-request", + "request" + ], + "default": "request" + }, + "policy": { + "$ref": "#/definitions/Pointer_WAF_Policy" + } + }, + "required": [] + }, + "Policy_Action_Bot_Defense": { + "type": "object", + "description": "Enable or disable Unified Bot Defense processing", + "properties": { + "event": { + "type": "string", + "description": "When to run this event in the request-response cycle", + "enum": [ + "client-accepted", + "proxy-request", + "request" + ], + "default": "request" + }, + "profile": { + "$ref": "#/definitions/Pointer_Bot_Defense_Profile" + } + }, + "required": [] + }, + "Policy_Action_Drop": { + "type": "object", + "description": "Reset connection", + "properties": { + "event": { + "type": "string", + "description": "When to run this event in the request-response cycle", + "enum": [ + "proxy-request", + "request", + "ssl-client-hello" + ], + "default": "ssl-client-hello" + } + } + }, + "Policy_Action_Forward_Select": { + "description": "Select appropriate location for forwarding the connection based on specified parameters", + "type": "object", + "allOf": [ + { + "oneOf": [ + { + "type": "object", + "properties": { + "pool": { + "$ref": "#/definitions/Pointer_Pool" + } + }, + "required": [ + "pool" + ] + }, + { + "type": "object", + "properties": { + "service": { + "$ref": "#/definitions/Pointer_Service" + } + }, + "required": [ + "service" + ] + } + ] + }, + { + "properties": { + "snat": { + "description": "Controls SNAT Automap", + "type": "string", + "enum": [ + "disable", + "automap" + ] + } + } + } + ] + }, + "Policy_Action_Forward": { + "description": "Controls where the system forwards a connection", + "type": "object", + "allOf": [ + { + "properties": { + "event": { + "type": "string", + "description": "When to run this event in the request-response cycle", + "enum": [ + "ssl-client-hello", + "request" + ], + "default": "ssl-client-hello" + } + } + }, + { + "oneOf": [ + { + "type": "object", + "properties": { + "select": { + "description": "Select appropriate location for forwarding the connection based on specified parameters", + "allOf": [ + { + "$ref": "#/definitions/Policy_Action_Forward_Select" + } + ] + } + }, + "required": [ + "select" + ] + } + ] + } + ] + }, + "Policy_Action_HTTP_Redirect": { + "type": "object", + "description": "Redirect an HTTP request to a different URL", + "properties": { + "event": { + "type": "string", + "description": "When to run this event in the request-response cycle", + "enum": [ + "proxy-request", + "request", + "response" + ], + "default": "proxy-request" + }, + "location": { + "description": "The new URL for which the system will send a redirect response; you can use a Tcl command substitution for this field", + "type": "string" + }, + "code": { + "description": "HTTP status code for the redirect. Note: code is only supported in TMOS version 14.0+.", + "type": "integer", + "minimum": 300, + "maximum": 399 + } + }, + "required": [ + "location" + ] + }, + "Policy_Action_HTTP_Header": { + "type": "object", + "description": "Modify HTTP header in request or response", + "allOf": [ + { + "type": "object", + "properties": { + "event": { + "type": "string", + "description": "When to run this event in the request-response cycle", + "enum": [ + "request", + "response" + ], + "default": "request" + } + } + }, + { + "oneOf": [ + { + "type": "object", + "properties": { + "replace": { + "type": "object", + "description": "Replace HTTP header in request or response", + "properties": { + "name": { + "type": "string", + "description": "Name of HTTP header" + }, + "value": { + "type": "string", + "description": "New value for HTTP header; you can use a Tcl command substitution for this field" + } + }, + "required": [ + "name", + "value" + ], + "additionalProperties": false + } + }, + "required": [ + "replace" + ] + }, + { + "type": "object", + "properties": { + "insert": { + "type": "object", + "description": "Insert HTTP header into request or response", + "properties": { + "name": { + "type": "string", + "description": "Name of HTTP header" + }, + "value": { + "type": "string", + "description": "New value for HTTP header; you can use a Tcl command substitution for this field" + } + }, + "required": [ + "name", + "value" + ], + "additionalProperties": false + } + }, + "required": [ + "insert" + ] + }, + { + "type": "object", + "properties": { + "remove": { + "type": "object", + "description": "Remove HTTP header from request or response", + "properties": { + "name": { + "type": "string", + "description": "Name of HTTP header" + } + }, + "required": [ + "name" + ], + "additionalProperties": false + } + }, + "required": [ + "remove" + ] + } + ] + } + ] + }, + "Policy_Action_HTTP_URI": { + "type": "object", + "description": "Modify the request's URI, path, or query string", + "properties": { + "event": { + "type": "string", + "description": "When to run this event in the request-response cycle", + "enum": [ + "request" + ], + "default": "request" + }, + "replace": { + "type": "object", + "description": "Replace URI, path, or query string in request", + "oneOf": [ + { + "type": "object", + "properties": { + "value": { + "type": "string", + "description": "New value for URI; you can use a Tcl command substitution for this field" + } + }, + "required": [ + "value" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "path": { + "type": "string", + "description": "New value for path; you can use a Tcl command substitution for this field" + } + }, + "required": [ + "path" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "queryString": { + "type": "string", + "description": "New value for query string; you can use a Tcl command substitution for this field" + } + }, + "required": [ + "queryString" + ], + "additionalProperties": false + } + ] + } + }, + "required": [ + "replace" + ] + }, + "Policy_Action_HTTP_Cookie": { + "type": "object", + "description": "Modify the request's \"Cookie:\" header", + "allOf": [ + { + "type": "object", + "properties": { + "event": { + "type": "string", + "description": "When to run this event in the request-response cycle", + "enum": [ + "request" + ], + "default": "request" + } + } + }, + { + "oneOf": [ + { + "type": "object", + "properties": { + "insert": { + "type": "object", + "description": "Insert HTTP \"Cookie:\" header into request", + "properties": { + "name": { + "type": "string", + "description": "Name of HTTP cookie" + }, + "value": { + "type": "string", + "description": "New value for HTTP cookie; you can use a Tcl command substitution for this field" + } + }, + "required": [ + "name", + "value" + ], + "additionalProperties": false + } + }, + "required": [ + "insert" + ] + }, + { + "type": "object", + "properties": { + "remove": { + "type": "object", + "description": "Remove HTTP \"Cookie:\" header from request", + "properties": { + "name": { + "type": "string", + "description": "Name of HTTP cookie" + } + }, + "required": [ + "name" + ], + "additionalProperties": false + } + }, + "required": [ + "remove" + ] + } + ] + } + ] + }, + "Policy_Action_Client_SSL": { + "type": "object", + "description": "Enable or disable encrypted connections to backend servers", + "properties": { + "event": { + "type": "string", + "description": "When to run this event in the request-response cycle", + "enum": [ + "client-accepted", + "proxy-request", + "request", + "proxy-connect", + "proxy-response", + "server-connected" + ], + "default": "client-accepted" + }, + "enabled": { + "description": "Enable encrypted connections to backend servers", + "type": "boolean", + "default": true + } + }, + "required": [] + }, + "Policy_Action_Persist": { + "type": "object", + "description": "Control over how a connection is persisted", + "allOf": [ + { + "type": "object", + "properties": { + "event": { + "type": "string", + "description": "When to run this event in the request-response cycle", + "enum": [ + "client-accepted", + "proxy-request", + "request" + ], + "default": "client-accepted" + } + } + }, + { + "oneOf": [ + { + "type": "object", + "properties": { + "disable": { + "type": "object", + "title": "Disable", + "description": "Disable persistence. When specifying set this property to an empty object (disable: {}).", + "additionalProperties": false + } + }, + "required": [ + "disable" + ] + }, + { + "type": "object", + "properties": { + "sourceAddress": { + "type": "object", + "title": "Source Address", + "description": "Persist the connection based on the source IP address", + "properties": { + "netmask": { + "title": "Network Mask", + "type": "string", + "description": "Network mask", + "format": "f5ip" + }, + "timeout": { + "title": "Timeout", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "description": "Timeout value in seconds" + } + }, + "required": [ + "netmask", + "timeout" + ], + "additionalProperties": false + } + }, + "required": [ + "sourceAddress" + ] + }, + { + "type": "object", + "properties": { + "destinationAddress": { + "type": "object", + "title": "Destination Address", + "description": "Persist the connection based on the destination IP address", + "properties": { + "netmask": { + "title": "Network Mask", + "type": "string", + "description": "Network mask", + "format": "f5ip" + }, + "timeout": { + "title": "Timeout", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "description": "Timeout value in seconds" + } + }, + "required": [ + "netmask", + "timeout" + ], + "additionalProperties": false + } + }, + "required": [ + "destinationAddress" + ] + }, + { + "type": "object", + "properties": { + "cookieInsert": { + "type": "object", + "title": "Cookie Insert", + "description": "Persist the connection using cookie insertion", + "properties": { + "name": { + "type": "string", + "title": "Name", + "description": "Name of cookie" + }, + "expiry": { + "type": "string", + "title": "Expiry", + "description": "Expiration duration expressed as [Nd][HH:MM[:SS]]" + } + }, + "required": [ + "name", + "expiry" + ], + "additionalProperties": false + } + }, + "required": [ + "cookieInsert" + ] + }, + { + "type": "object", + "properties": { + "cookieRewrite": { + "type": "object", + "title": "Cookie Rewrite", + "description": "Persist the connection using cookie rewrite", + "properties": { + "name": { + "type": "string", + "title": "Name", + "description": "Name of cookie" + }, + "expiry": { + "type": "string", + "title": "Expiry", + "description": "Expiration duration expressed as [Nd][HH:MM[:SS]]" + } + }, + "required": [ + "name", + "expiry" + ], + "additionalProperties": false + } + }, + "required": [ + "cookieRewrite" + ] + }, + { + "type": "object", + "properties": { + "cookiePassive": { + "type": "object", + "title": "Cookie Passive", + "description": "Persist the connection using cookie passive", + "properties": { + "name": { + "type": "string", + "title": "Name", + "description": "Name of cookie" + } + }, + "required": [ + "name" + ], + "additionalProperties": false + } + }, + "required": [ + "cookiePassive" + ] + }, + { + "type": "object", + "properties": { + "cookieHash": { + "type": "object", + "title": "Cookie Hash", + "description": "Persist the connection using cookie hash", + "properties": { + "name": { + "type": "string", + "title": "Name", + "description": "Name of cookie" + }, + "offset": { + "type": "integer", + "title": "Offset", + "minimum": 0, + "maximum": 65535, + "description": "Offset into hash" + }, + "length": { + "type": "integer", + "title": "Length", + "minimum": 0, + "maximum": 65535, + "description": "Substring length" + }, + "timeout": { + "title": "Timeout", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "description": "Timeout value in seconds" + } + }, + "required": [ + "name", + "offset", + "length", + "timeout" + ], + "additionalProperties": false + } + }, + "required": [ + "cookieHash" + ] + }, + { + "type": "object", + "properties": { + "universal": { + "type": "object", + "title": "Universal", + "description": "Persist the connection using a user-defined key", + "properties": { + "key": { + "type": "string", + "title": "Key", + "description": "The key to use. Tcl command substitution is allowed" + }, + "timeout": { + "title": "Timeout", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "description": "Timeout value in seconds" + } + }, + "required": [ + "key", + "timeout" + ], + "additionalProperties": false + } + }, + "required": [ + "universal" + ] + }, + { + "type": "object", + "properties": { + "hash": { + "type": "object", + "title": "Hash", + "description": "Persist the connection using the hash of a key", + "properties": { + "key": { + "type": "string", + "title": "Key", + "description": "The key to use. Tcl command substitution is allowed" + }, + "timeout": { + "title": "Timeout", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "description": "Timeout value in seconds" + } + }, + "required": [ + "key", + "timeout" + ], + "additionalProperties": false + } + }, + "required": [ + "hash" + ] + }, + { + "type": "object", + "properties": { + "carp": { + "type": "object", + "title": "Cache Array Routing Protocol (CARP)", + "description": "Persist the connection using Cache Array Routing Protocol (CARP) algorithm", + "properties": { + "key": { + "type": "string", + "title": "Key", + "description": "The key to use. Tcl command substitution is allowed" + }, + "timeout": { + "title": "Timeout", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "description": "Timeout value in seconds" + } + }, + "required": [ + "key", + "timeout" + ], + "additionalProperties": false + } + }, + "required": [ + "carp" + ] + } + ] + } + ] + }, + "Policy_Action_TCL": { + "type": "object", + "description": "Set a Tcl variable in runtime environment", + "properties": { + "event": { + "type": "string", + "description": "When to run this event in the request-response cycle", + "enum": [ + "proxy-request", + "request", + "response", + "ssl-client-hello", + "ssl-server-hello", + "ssl-server-handshake" + ], + "default": "request" + }, + "setVariable": { + "type": "object", + "description": "Set a Tcl variable in the runtime environment", + "properties": { + "expression": { + "type": "string", + "description": "Tcl expression to evaluate" + }, + "name": { + "type": "string", + "description": "Name of variable" + } + }, + "required": [ + "expression", + "name" + ] + } + }, + "required": [ + "setVariable" + ] + }, + "Policy_Action_Log": { + "type": "object", + "description": "Writes messages to local or remote system log", + "properties": { + "event": { + "type": "string", + "description": "When to run this event in the request-response cycle", + "enum": [ + "classification-detected", + "client-accepted", + "proxy-connect", + "proxy-request", + "proxy-response", + "request", + "response", + "server-connected", + "ssl-client-hello", + "ssl-client-serverhello-send", + "ssl-server-handshake", + "ssl-server-hello", + "ws-request", + "ws-response" + ], + "default": "ssl-client-hello" + }, + "write": { + "type": "object", + "description": "Write a message to the system log files", + "properties": { + "message": { + "type": "string", + "description": "The message to write to the system log. Can also be a Tcl command substitution", + "minLength": 1 + }, + "facility": { + "type": "string", + "description": "Standard syslog facility associated with the message", + "enum": [ + "authpriv", + "cron", + "daemon", + "ftp", + "kern", + "local0", + "local1", + "local2", + "local3", + "local4", + "local5", + "local6", + "local7", + "lpr", + "mail", + "news", + "security", + "user", + "uucp" + ], + "default": "local0" + }, + "priority": { + "type": "string", + "description": "Standard syslog priority associated with the message", + "enum": [ + "crit", + "debug", + "error", + "info", + "notice", + "warning" + ], + "default": "info" + }, + "ipAddress": { + "type": "string", + "description": "The IP address of the remote syslog server", + "format": "f5ip" + }, + "port": { + "type": "integer", + "description": "The port number of the remote syslog server", + "minimum": 0, + "maximum": 65535, + "default": 0 + } + }, + "required": [ + "message" + ] + } + }, + "required": [ + "write" + ] + }, + "Policy_Condition": { + "type": "object", + "description": "LTM policy condition", + "properties": { + "type": { + "description": "Selects the LTM policy condition this object describes", + "type": "string", + "enum": [ + "httpHeader", + "httpMethod", + "httpUri", + "httpCookie", + "sslExtension", + "tcp", + "geoip" + ] + } + }, + "allOf": [ + { + "if": { + "properties": { + "type": { + "const": "httpUri" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Condition_HTTP_URI" + } + }, + { + "if": { + "properties": { + "type": { + "const": "httpHeader" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Condition_HTTP_Header" + } + }, + { + "if": { + "properties": { + "type": { + "const": "httpMethod" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Condition_HTTP_Method" + } + }, + { + "if": { + "properties": { + "type": { + "const": "httpCookie" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Condition_HTTP_Cookie" + } + }, + { + "if": { + "properties": { + "type": { + "const": "sslExtension" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Condition_SSL_Extension" + } + }, + { + "if": { + "properties": { + "type": { + "const": "tcp" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Condition_TCP" + } + }, + { + "if": { + "properties": { + "type": { + "const": "geoip" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Condition_GeoIP" + } + } + ], + "required": [ + "type" + ] + }, + "Policy_Condition_HTTP_URI": { + "description": "Inspect the URI on a request and match on various parts or the entire URI", + "type": "object", + "allOf": [ + { + "type": "object", + "properties": { + "event": { + "description": "When to evaluate this condition in the request-response cycle", + "type": "string", + "enum": [ + "proxy-request", + "request" + ], + "default": "request" + } + } + }, + { + "oneOf": [ + { + "type": "object", + "properties": { + "path": { + "description": "Match on the URI path", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_String" + } + ] + }, + "normalized": { + "description": "Normalizes the result to a canonical form to allow consistent comparisons", + "type": "boolean", + "default": false + } + }, + "required": [ + "path" + ] + }, + { + "type": "object", + "properties": { + "scheme": { + "description": "Match on the scheme (e.g. http, https, ftp, file)", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_String" + } + ] + }, + "normalized": { + "description": "Normalizes the result to a canonical form to allow consistent comparisons", + "type": "boolean", + "default": false + } + }, + "required": [ + "scheme" + ] + }, + { + "type": "object", + "properties": { + "host": { + "description": "Match on the hostname in the URI", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_String" + } + ] + }, + "normalized": { + "description": "Normalizes the result to a canonical form to allow consistent comparisons", + "type": "boolean", + "default": false + } + }, + "required": [ + "host" + ] + }, + { + "type": "object", + "properties": { + "port": { + "description": "Match on the port number in the URI", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_Number" + } + ] + }, + "normalized": { + "description": "Normalizes the result to a canonical form to allow consistent comparisons", + "type": "boolean", + "default": false + } + }, + "required": [ + "port" + ] + }, + { + "type": "object", + "properties": { + "extension": { + "description": "Match on the file extension in the URI (e.g. jpg, html, cgi)", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_String" + } + ] + }, + "normalized": { + "description": "Normalizes the result to a canonical form to allow consistent comparisons", + "type": "boolean", + "default": false + } + }, + "required": [ + "extension" + ] + }, + { + "type": "object", + "properties": { + "queryString": { + "description": "Match against text in the query string", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_String" + } + ] + }, + "normalized": { + "description": "Normalizes the result to a canonical form to allow consistent comparisons", + "type": "boolean", + "default": false + } + }, + "required": [ + "queryString" + ] + }, + { + "type": "object", + "properties": { + "queryParameter": { + "description": "Match value of the named query parameter from the query string", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_String" + } + ] + }, + "name": { + "description": "Specify the name of the particular query parameter whose value you want to use", + "type": "string" + }, + "normalized": { + "description": "Normalizes the result to a canonical form to allow consistent comparisons", + "type": "boolean", + "default": false + } + }, + "required": [ + "queryParameter", + "name" + ] + }, + { + "type": "object", + "properties": { + "unnamedQueryParameter": { + "description": "Match the value of a query parameter by a numeric index instead of by name", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_String" + } + ] + }, + "index": { + "description": "The numeric order of the item whose value you want to use, start at 1; negative values indicate counting right to left", + "type": "integer", + "minimum": 1 + }, + "normalized": { + "description": "Normalizes the result to a canonical form to allow consistent comparisons", + "type": "boolean", + "default": false + } + }, + "required": [ + "unnamedQueryParameter", + "index" + ] + }, + { + "type": "object", + "properties": { + "pathSegment": { + "description": "Match a part of the URI path by a numeric index", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_String" + } + ] + }, + "index": { + "description": "The numeric order of the item whose value you want to use, start at 1; negative values indicate counting right to left", + "type": "integer", + "minimum": 1 + }, + "normalized": { + "description": "Normalizes the result to a canonical form to allow consistent comparisons", + "type": "boolean", + "default": false + } + }, + "required": [ + "pathSegment", + "index" + ] + }, + { + "type": "object", + "properties": { + "all": { + "description": "Match on the full URI", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_String" + } + ] + }, + "normalized": { + "description": "Normalizes the result to a canonical form to allow consistent comparisons", + "type": "boolean", + "default": false + } + }, + "required": [ + "all" + ] + } + ] + } + ] + }, + "Policy_Condition_HTTP_Header": { + "description": "Match against any HTTP header", + "type": "object", + "allOf": [ + { + "type": "object", + "properties": { + "event": { + "description": "When to evaluate this condition in the request-response cycle", + "type": "string", + "enum": [ + "proxy-request", + "request", + "proxy-connect", + "proxy-response", + "response" + ], + "default": "proxy-request" + } + } + }, + { + "oneOf": [ + { + "type": "object", + "properties": { + "all": { + "description": "Match on the full HTTP header", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_String" + } + ] + }, + "name": { + "description": "Specify the name of the particular HTTP header whose value you want to use", + "type": "string" + } + }, + "required": [ + "all", + "name" + ] + } + ] + } + ] + }, + "Policy_Condition_HTTP_Method": { + "description": "Match against any HTTP method", + "type": "object", + "allOf": [ + { + "type": "object", + "properties": { + "event": { + "description": "When to evaluate this condition in the request-response cycle", + "type": "string", + "enum": [ + "proxy-request", + "request" + ], + "default": "proxy-request" + } + } + }, + { + "type": "object", + "properties": { + "all": { + "description": "Match on the full HTTP method", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_String" + } + ] + } + }, + "required": [ + "all" + ] + } + ] + }, + "Policy_Condition_HTTP_Cookie": { + "description": "Inspect an HTTP request Cookie: header", + "type": "object", + "allOf": [ + { + "type": "object", + "properties": { + "event": { + "description": "When to evaluate this condition in the request-response cycle", + "type": "string", + "enum": [ + "proxy-request", + "request", + "proxy-connect" + ], + "default": "proxy-request" + } + } + }, + { + "oneOf": [ + { + "type": "object", + "properties": { + "all": { + "description": "Match on the full HTTP cookie", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_String" + } + ] + }, + "name": { + "description": "Specify the name of the particular HTTP cookie whose value you want to use", + "type": "string" + } + }, + "required": [ + "all", + "name" + ] + } + ] + } + ] + }, + "Policy_Condition_SSL_Extension": { + "description": "Inspect SSL extensions being negotiated during HELLO phase", + "type": "object", + "allOf": [ + { + "type": "object", + "properties": { + "event": { + "description": "When to evaluate this condition in the request-response cycle", + "type": "string", + "enum": [ + "ssl-client-hello", + "ssl-server-hello" + ], + "default": "ssl-client-hello" + } + } + }, + { + "oneOf": [ + { + "type": "object", + "properties": { + "serverName": { + "description": "Server name indication", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_String" + } + ] + } + }, + "required": [ + "serverName" + ] + }, + { + "type": "object", + "properties": { + "npn": { + "description": "Server name indication", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_String" + } + ] + }, + "index": { + "description": "The numeric order of the item whose value you want to use, start at 1; negative values indicate counting right to left", + "type": "integer", + "minimum": 1, + "default": 0 + } + }, + "required": [ + "npn" + ] + }, + { + "type": "object", + "properties": { + "alpn": { + "description": "Server name indication", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_String" + } + ] + }, + "index": { + "description": "The numeric order of the item whose value you want to use, start at 1; negative values indicate counting right to left", + "type": "integer", + "minimum": 1, + "default": 0 + } + }, + "required": [ + "alpn" + ] + } + ] + } + ] + }, + "Policy_Condition_TCP": { + "description": "Match against specific TCP properties", + "type": "object", + "allOf": [ + { + "type": "object", + "properties": { + "event": { + "description": "When to evaluate this condition in the request-response cycle", + "type": "string", + "enum": [ + "request", + "response", + "classification-detected", + "client-accepted", + "proxy-connect", + "proxy-request", + "proxy-response", + "server-connected", + "ssl-client-hello", + "ssl-client-serverhello-send", + "ssl-server-handshake", + "ssl-server-hello", + "ws-request", + "ws-response" + ], + "default": "request" + } + } + }, + { + "oneOf": [ + { + "type": "object", + "properties": { + "address": { + "description": "Specify the address to use", + "allOf": [ + { + "$ref": "#/definitions/Policy_Match_String" + } + ] + } + }, + "required": [ + "address" + ] + }, + { + "type": "object", + "properties": { + "port": { + "description": "Specify the port to use", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_Number" + } + ] + } + }, + "required": [ + "port" + ] + } + ] + } + ] + }, + "Policy_Condition_GeoIP": { + "description": "Match against specific GeoIP properties", + "type": "object", + "allOf": [ + { + "type": "object", + "properties": { + "event": { + "description": "When to evaluate this condition in the request-response cycle", + "type": "string", + "enum": [ + "request", + "response", + "client-accepted", + "proxy-connect", + "proxy-request", + "proxy-response", + "server-connected", + "ssl-client-hello", + "ssl-client-serverhello-send", + "ssl-server-handshake", + "ssl-server-hello" + ], + "default": "request" + } + } + }, + { + "oneOf": [ + { + "type": "object", + "properties": { + "continent": { + "description": "Two-character continent code: AF, AN, AS, OC, EU, NA, SA", + "allOf": [ + { + "$ref": "#/definitions/Policy_Match_String" + } + ] + } + }, + "required": [ + "continent" + ] + }, + { + "type": "object", + "properties": { + "countryCode": { + "description": "Two-character country code as defined in ISO-3166-2", + "allOf": [ + { + "$ref": "#/definitions/Policy_Match_String" + } + ] + } + }, + "required": [ + "countryCode" + ] + }, + { + "type": "object", + "properties": { + "countryName": { + "description": "Full name of country", + "allOf": [ + { + "$ref": "#/definitions/Policy_Match_String" + } + ] + } + }, + "required": [ + "countryName" + ] + }, + { + "type": "object", + "properties": { + "isp": { + "description": "Internet Service Provider associated with address", + "allOf": [ + { + "$ref": "#/definitions/Policy_Match_String" + } + ] + } + }, + "required": [ + "isp" + ] + }, + { + "type": "object", + "properties": { + "org": { + "description": "Organization associated with address", + "allOf": [ + { + "$ref": "#/definitions/Policy_Match_String" + } + ] + } + }, + "required": [ + "org" + ] + }, + { + "type": "object", + "properties": { + "regionCode": { + "description": "Abbreviation of State, Province, or country-specific region", + "allOf": [ + { + "$ref": "#/definitions/Policy_Match_String" + } + ] + } + }, + "required": [ + "regionCode" + ] + }, + { + "type": "object", + "properties": { + "regionName": { + "description": "Full name of State, Province, or country-specific region", + "allOf": [ + { + "$ref": "#/definitions/Policy_Match_String" + } + ] + } + }, + "required": [ + "regionName" + ] + } + ] + } + ] + }, + "Policy_Compare_String": { + "description": "Perform a comparison against string values", + "type": "object", + "properties": { + "operand": { + "description": "Specifies the comparison the system should perform with values. The operands exists and does-not-exist do not accept values and are available on BIGIP 15.0 and above.", + "type": "string", + "enum": [ + "equals", + "does-not-equal", + "starts-with", + "does-not-start-with", + "ends-with", + "does-not-end-with", + "contains", + "does-not-contain", + "exists", + "does-not-exist" + ], + "default": "equals" + }, + "values": { + "description": "A list of strings to do comparisons against", + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "datagroup": { + "description": "Reference to a data-group containing the values", + "$ref": "#/definitions/Datagroup_Value" + }, + "caseSensitive": { + "description": "Specifies if the comparison the system should perform with case sensitivity", + "type": "boolean", + "default": false + } + }, + "dependencies": { + "operand": { + "if": { + "allOf": [ + { + "properties": { + "operand": { + "not": { + "const": "exists" + } + } + } + }, + { + "properties": { + "operand": { + "not": { + "const": "does-not-exist" + } + } + } + } + ] + }, + "then": { + "oneOf": [ + { + "required": [ + "values" + ] + }, + { + "required": [ + "datagroup" + ] + } + ] + } + } + }, + "additionalProperties": false + }, + "Policy_Compare_Number": { + "description": "Perform a comparison against number values", + "type": "object", + "properties": { + "operand": { + "description": "Specifies the comparison the system should perform with values", + "type": "string", + "enum": [ + "equals", + "does-not-equal", + "less", + "greater", + "less-or-equal", + "greater-or-equal" + ], + "default": "equals" + }, + "values": { + "description": "A list of numbers to do comparisons against", + "type": "array", + "items": { + "type": "integer" + }, + "minItems": 1 + } + }, + "required": [ + "values" + ], + "additionalProperties": false + }, + "Policy_Match_String": { + "description": "Perform a comparison that either matches or does-not-match", + "type": "object", + "properties": { + "operand": { + "description": "Specifies the comparison", + "type": "string", + "enum": [ + "matches", + "does-not-match" + ], + "default": "matches" + }, + "values": { + "description": "A list of strings to compare against", + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "datagroup": { + "description": "Reference to a data-group containing the values", + "$ref": "#/definitions/Datagroup_Value" + } + }, + "oneOf": [ + { + "required": [ + "values" + ] + }, + { + "required": [ + "datagroup" + ] + } + ], + "additionalProperties": false + }, + "Datagroup_Value": { + "description": "Reference to a data-group containing the values", + "type": "object", + "properties": { + "bigip": { + "title": "BIG-IP Data-Group", + "description": "Pathname of existing BIG-IP Data-Group", + "type": "string", + "format": "f5bigip" + }, + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to Data_Group", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Data_Group" + } + }, + "required": [ + "class" + ] + } + } + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm data-group internal" + ] + } + }, + "Bandwidth_Control_Policy": { + "title": "Bandwidth_Control_Policy", + "description": "Create a listener to specify how to handle traffic for policy enforcement", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Bandwidth_Control_Policy" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "dynamicControlEnabled": { + "description": "Specifies whether the policy is a static or dynamic policy. When enabled, the policy is dynamic, and additional settings are available. A dynamic policy enforces the specified maximum user rate and flow fairness for all traffic associated with the policy and for each session. The default is disabled, which indicates a static policy. A static policy enforces the maximum rate for combined traffic and does not guarantee fairness bandwidth for each session.", + "type": "boolean", + "default": false + }, + "maxBandwidth": { + "description": "Specifies the maximum amount of bandwidth that traffic associated with the bandwidth control policy can use. The range is from 1 Mbps to 320 Gbps (between 1000000 bps and 320000000000 bps.", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709552000 + }, + "maxBandwidthUnit": { + "description": "Specifies the units used by the maxBandwidth property", + "type": "string", + "enum": [ + "bps", + "Kbps", + "Mbps", + "Gbps" + ], + "default": "Mbps" + }, + "maxUserBandwidth": { + "description": "Specifies the maximum amount of bandwidth that each session associated with the bandwidth control policy can use. The range is from 5 Kbps to 2 Gbps. Note: For FTP traffic, the throughput is roughly half of this setting, because the FTP protocol creates two connections per user: a control connection and a data connection.", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709552000, + "default": 0 + }, + "maxUserBandwidthUnit": { + "description": "Specifies the units used by the maxUserBandwidth property", + "type": "string", + "enum": [ + "bps", + "Kbps", + "Mbps", + "Gbps" + ], + "default": "Mbps" + }, + "maxUserPPS": { + "description": "Specifies the limiter in packets per second that traffic is allowed per instance. It functions as a DoS limiter without fair share allocation. The system applies whichever value is lower, between this value and the specified Maximum Rate Per User. When both values are specified, both must pass for packets to go through. You can specify the rate in packets per second (PPS), kilo packets per second (KPPS), mega packets per second (MPPS), or giga packets per second (GPPS). The default value is 0 (not configured).", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709552000, + "default": 0 + }, + "maxUserPPSUnit": { + "description": "Specifies the units used by the maxUserBandwidthPPS property", + "type": "string", + "enum": [ + "bpps", + "Kpps", + "Mpps", + "Gpps" + ], + "default": "Mpps" + }, + "loggingEnabled": { + "description": "Specifies whether the system measures bandwidth on all future instances of this bandwidth control policy. When enabled, the system measures bandwidth and sends it to the log publisher specified by the logPublisher setting. You can override this setting using iRules. For example, if you want measurement on only some instances, keep this setting disabled, and use iRules to enable measurement on specific instances.", + "type": "boolean", + "default": false + }, + "logPublisher": { + "$ref": "#/definitions/Pointer_Log_Publisher" + }, + "logPeriod": { + "description": "Specifies the frequency, in milliseconds, with which the system generates bandwidth measurement logs", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709552000, + "default": 2048 + }, + "markIP": { + "description": "Specifies whether to mark traffic that exceeds the per-user limit by setting a Type of Service (ToS) bit in the IP headers of TCP packets associated with this bandwidth control policy. The default value is \"pass-through\", which means there is no change to the ToS bit. To set a ToS bit use a value from 0 to 63. If this setting is specified, the bandwidth policy is not enforced, but rather the packets are marked for a downstream system to process.", + "if": { + "type": "string" + }, + "then": { + "const": "pass-through" + }, + "else": { + "type": "integer", + "minimum": 0, + "maximum": 63 + }, + "default": "pass-through" + }, + "markL2": { + "description": "Specifies whether to mark traffic that exceeds the per-user limit by setting a Quality of Service (QoS) bit in the L2 headers of packets associated with this bandwidth control policy. The default value is \"pass-through\", which means there is no change to the QoS bit. To set a QoS bit use a value from 0 to 7. If this setting is specified, the bandwidth policy is not enforced, but rather the packets are marked for a downstream system to process.", + "if": { + "type": "string" + }, + "then": { + "const": "pass-through" + }, + "else": { + "type": "integer", + "minimum": 0, + "maximum": 7 + }, + "default": "pass-through" + }, + "categories": { + "description": "This specifies the categories under policy. Note: policy need to be enabled as dynamic to configure categories. Up to a maximum of 32 categories can be configured. All the categories under the dynamic policy share the bandwidth as specified for the category, up to a maximum of maxUserBandwidth.", + "additionalProperties": { + "$ref": "#/definitions/Bandwidth_Control_Policy_Category" + } + } + }, + "required": [ + "class", + "maxBandwidth" + ], + "if": { + "required": [ + "dynamicControlEnabled" + ], + "properties": { + "dynamicControlEnabled": { + "const": true + } + } + }, + "then": { + "required": [ + "maxUserBandwidth" + ] + }, + "additionalProperties": false + }, + "Idle_Timeout_Policy": { + "title": "Idle_Timeout_Policy", + "description": "Destination port based idle timeout policy", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Idle_Timeout_Policy" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "rules": { + "description": "List of idle timeout rules", + "type": "array", + "items": { + "$ref": "#/definitions/Idle_Timeout_Rule" + } + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "Idle_Timeout_Rule": { + "description": "Idle timeout rule", + "type": "object", + "properties": { + "name": { + "description": "Idle timeout rule name", + "type": "string", + "pattern": "^[A-Za-z_][0-9A-Za-z_/-]*$", + "maxLength": 64 + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "protocol": { + "type": "string", + "allOf": [ + { + "$ref": "#/definitions/Enum_Protocols_Idle_Timeout_Policy" + } + ], + "default": "all-other" + }, + "destinationPorts": { + "type": "array", + "description": "List of ports, port ranges (for example, 80, \"8080-8090\"), or \"all-other\".", + "items": { + "type": [ + "integer", + "string" + ] + }, + "minItems": 1 + }, + "idleTimeout": { + "description": "Idle timeout in seconds", + "type": [ + "integer", + "string" + ], + "oneOf": [ + { + "type": "integer" + }, + { + "type": "string", + "enum": [ + "immediate", + "indefinite", + "unspecified" + ] + } + ], + "default": "unspecified" + } + }, + "required": [ + "name" + ], + "additionalProperties": false + }, + "Bandwidth_Control_Policy_Category": { + "description": "Create a listener to specify how to handle traffic for policy enforcement", + "type": "object", + "properties": { + "remark": { + "$ref": "#/definitions/Remark" + }, + "maxBandwidth": { + "description": "Specifies the maximum bandwidth that this category of traffic can use when associated with this bandwidth control policy. The range is from 5 kbps to the value set for Maximum Rate Per User.", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709552000 + }, + "maxBandwidthUnit": { + "description": "Specifies the units used by the maxBandwidth property", + "type": "string", + "enum": [ + "bps", + "Kbps", + "Mbps", + "Gbps", + "%" + ], + "default": "Mbps" + }, + "markIP": { + "description": "Specifies whether to mark traffic that exceeds the per-user limit by setting a Type of Service (ToS) bit in the IP headers of TCP packets associated with this bandwidth control policy. The default value is \"pass-through\", which means there is no change to the ToS bit. To set a ToS bit use a value from 0 to 63. If this setting is specified, the bandwidth policy is not enforced, but rather the packets are marked for a downstream system to process.", + "if": { + "type": "string" + }, + "then": { + "const": "pass-through" + }, + "else": { + "type": "integer", + "minimum": 0, + "maximum": 63 + }, + "default": "pass-through" + }, + "markL2": { + "description": "Specifies whether to mark traffic that exceeds the per-user limit by setting a Quality of Service (QoS) bit in the L2 headers of packets associated with this bandwidth control policy. The default value is \"pass-through\", which means there is no change to the QoS bit. To set a QoS bit use a value from 0 to 7. If this setting is specified, the bandwidth policy is not enforced, but rather the packets are marked for a downstream system to process.", + "if": { + "type": "string" + }, + "then": { + "const": "pass-through" + }, + "else": { + "type": "integer", + "minimum": 0, + "maximum": 7 + }, + "default": "pass-through" + } + }, + "required": [ + "maxBandwidth" + ], + "additionalProperties": false + }, + "Net_Address_List": { + "title": "Net_Address_List", + "description": "You can use the address-list component to define reusable lists of addresses. This property requires a BIG-IP version of 14.1 or higher.", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Net_Address_List" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "addresses": { + "type": "array", + "description": "A list of IPv4 and IPv6 addresses and address ranges. You can specify a network with CIDR slash notation.", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "addressLists": { + "type": "array", + "description": "A list of other address lists (each by BIG-IP AS3 pointer or BIG-IP pathname).", + "items": { + "$ref": "#/definitions/Pointer_Net_Address_List" + }, + "minItems": 1 + } + }, + "required": [ + "class" + ], + "anyOf": [ + { + "required": [ + "addresses" + ] + }, + { + "required": [ + "addressLists" + ] + } + ], + "additionalProperties": false + }, + "Net_Port_List": { + "title": "Net_Port_List", + "description": "You can use the port-list component to define reusable lists of ports. This property requires a BIG-IP version of 14.1 or higher.", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Net_Port_List" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "ports": { + "type": "array", + "description": "A list of ports and port ranges (for example, 80, \"8080-8090\").", + "items": { + "type": [ + "integer", + "string" + ] + }, + "minItems": 1 + }, + "portLists": { + "type": "array", + "description": "A list of other port lists (each by BIG-IP AS3 pointer or BIG-IP pathname).", + "items": { + "$ref": "#/definitions/Pointer_Net_Port_List" + }, + "minItems": 1 + } + }, + "required": [ + "class" + ], + "anyOf": [ + { + "required": [ + "ports" + ] + }, + { + "required": [ + "portLists" + ] + } + ], + "additionalProperties": false + }, + "Enforcement_Policy": { + "title": "Enforcement_Policy", + "description": "Configures policies for the Policy Enforcement Manager (PEM)", + "f5PostProcess": { + "tag": "modules", + "data": [ + "pem" + ] + }, + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Enforcement_Policy" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "enable": { + "description": "Specifies the current status of the policy", + "type": "boolean", + "default": true + }, + "allTransactions": { + "description": "Specifies, when set to true, that the system enables policy enforcement for each http transaction. When set to false, the system allows only policy enforcement of the first http transaction.", + "type": "boolean", + "default": false + }, + "rules": { + "description": "Enforcement policy rules", + "type": "array", + "items": { + "$ref": "#/definitions/Enforcement_Rule" + } + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "Enforcement_Rule": { + "description": "A rule to match traffic flows and apply actions", + "type": "object", + "properties": { + "dscpMarkingDownlink": { + "description": "Specifies whether to set DSCP bits in the IP header of outgoing traffic to the subscriber", + "if": { + "type": "string" + }, + "then": { + "const": "pass-through" + }, + "else": { + "type": "integer", + "minimum": 0, + "maximum": 63 + }, + "default": "pass-through" + }, + "dscpMarkingUplink": { + "description": "Specifies whether to set DSCP bits in the IP header of outgoing traffic to the network", + "if": { + "type": "string" + }, + "then": { + "const": "pass-through" + }, + "else": { + "type": "integer", + "minimum": 0, + "maximum": 63 + }, + "default": "pass-through" + }, + "gateStatusEnabled": { + "description": "Specifies, when set to true, that the traffic can pass through the system without being changed. Select false to drop traffic that this rule applies to.", + "type": "boolean", + "default": true + }, + "interceptionEndpoint": { + "$ref": "#/definitions/Pointer_Enforcement_Interception_Endpoint" + }, + "iRule": { + "$ref": "#/definitions/Pointer_Enforcement_iRule" + }, + "l2MarkingDownlink": { + "description": "Set Layer-2 Quality of Service Marking in downlink traffic that matches a rule. Setting a L2 QoS Marking affects the packet delivery priority. The range is 0 to 7, or pass-through. The default value is pass-through, indicating the L2 QoS Marking of the packet will not be changed when the packet matches the rule.", + "if": { + "type": "string" + }, + "then": { + "const": "pass-through" + }, + "else": { + "type": "integer", + "minimum": 0, + "maximum": 7 + }, + "default": "pass-through" + }, + "l2MarkingUplink": { + "description": "Set Layer-2 Quality of Service Marking in uplink traffic that matches a rule. Setting a L2 QoS marking affects the packet delivery priority. The range is 0 to 7, or pass-through. The default value is pass-through, indicating the L2 QoS Marking of the packet will not be changed when the packet matches the rule.", + "if": { + "type": "string" + }, + "then": { + "const": "pass-through" + }, + "else": { + "type": "integer", + "minimum": 0, + "maximum": 7 + }, + "default": "pass-through" + }, + "name": { + "description": "The name of the policy rule.", + "type": "string" + }, + "precedence": { + "description": "Specifies an integer that indicates the precedence for the rule in relation to the other rules. Number 1 has the highest precedence. Rules with higher precedence (lower numbers) are evaluated before other rules with lower precedence (higher numbers).", + "type": "integer", + "minimum": 1, + "maximum": 4294967295 + }, + "qosBandwidthControllerUplink": { + "$ref": "#/definitions/Enforcement_Rule_QOS" + }, + "qosBandwidthControllerDownlink": { + "$ref": "#/definitions/Enforcement_Rule_QOS" + }, + "serviceChain": { + "$ref": "#/definitions/Pointer_Enforcement_Service_Chain_Endpoint" + }, + "tclFilter": { + "description": "Specifies the tcl expression which uses iRule commands to filter the packet. It is a match if tclFilter returns TRUE/1 or nomatch if FALSE/0.", + "type": "string" + }, + "tcpAnalyticsEnabled": { + "description": "Specifies the action to enable tcp analytics when the traffic flow matches the rule matching criteria", + "type": "boolean", + "default": false + }, + "tcpOptimizationDownlink": { + "$ref": "#/definitions/Pointer_TCP_Profile" + }, + "tcpOptimizationUplink": { + "$ref": "#/definitions/Pointer_TCP_Profile" + }, + "classificationFilters": { + "description": "Classification filters to apply to the traffic", + "type": "array", + "items": { + "$ref": "#/definitions/Enforcement_Rule_Classification_Filter" + } + }, + "DTOSTethering": { + "allOf": [ + { + "$ref": "#/definitions/Enforcement_Rule_DTOS_Tethering" + } + ], + "default": {} + }, + "flowInfoFilters": { + "description": "Flow information filters to apply to the traffic", + "type": "array", + "items": { + "$ref": "#/definitions/Enforcement_Rule_Flow_Filter" + } + }, + "forwarding": { + "$ref": "#/definitions/Enforcement_Rule_Forwarding" + }, + "insertContent": { + "$ref": "#/definitions/Enforcement_Rule_Insert_Content" + }, + "modifyHttpHeader": { + "$ref": "#/definitions/Enforcement_Rule_Modify_HTTP_Header" + }, + "qoeReporting": { + "$ref": "#/definitions/Enforcement_Rule_Report_Destination_HSL" + }, + "quota": { + "$ref": "#/definitions/Enforcement_Rule_Quota" + }, + "ranCongestion": { + "$ref": "#/definitions/Enforcement_Rule_Ran_Congestion" + }, + "usageReporting": { + "$ref": "#/definitions/Enforcement_Rule_Usage_Reporting" + }, + "urlCategorizationFilters": { + "description": "URL categorization filters to apply to the traffic", + "type": "array", + "items": { + "$ref": "#/definitions/Enforcement_Rule_URL_Categorization_Filter" + } + } + }, + "required": [ + "name", + "precedence" + ], + "additionalProperties": false + }, + "Enforcement_Rule_QOS": { + "description": "Specifies a previously configured bandwidth control policy to apply to traffic that matches this rule", + "type": "object", + "properties": { + "policy": { + "$ref": "#/definitions/Pointer_Bandwidth_Control_Policy" + }, + "category": { + "description": "Specifies a category of traffic within the bandwidth control policy to which to apply the rule. This option provides more specific rate control to a certain type of traffic. The category must be defined in the selected bandwidth control policy.", + "type": "string" + } + }, + "required": [ + "policy" + ], + "additionalProperties": false + }, + "Enforcement_Rule_DTOS_Tethering": { + "description": "Specifies options for device type, operating system, and tethering detection", + "type": "object", + "properties": { + "detectDtos": { + "description": "Specifies the detection of the subscriber's device and the operating system", + "type": "boolean", + "default": false + }, + "detectTethering": { + "description": "Specifies if you want to enable detection of tethering", + "type": "boolean", + "default": false + }, + "reportDestinationHsl": { + "$ref": "#/definitions/Enforcement_Rule_Report_Destination_HSL" + } + }, + "required": [], + "additionalProperties": false + }, + "Enforcement_Rule_Report_Destination_HSL": { + "description": "Specifies report destination and format", + "type": "object", + "properties": { + "highSpeedLogPublisher": { + "$ref": "#/definitions/Pointer_Log_Publisher" + }, + "formatScript": { + "$ref": "#/definitions/Pointer_Enforcement_Format_Script" + } + }, + "required": [], + "additionalProperties": false + }, + "Enforcement_Rule_Forwarding_ICAP": { + "description": "Specifies that the flow forwards to the ICAP virtual server", + "type": "object", + "properties": { + "icapType": { + "description": "Specifies the ICAP adaptation type", + "type": "string", + "enum": [ + "request", + "response", + "both" + ] + }, + "icapService": { + "description": "ICAP service to route to", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Service" + } + ] + } + }, + "required": [ + "icapType", + "icapService" + ] + }, + "Enforcement_Rule_Forwarding_Endpoint": { + "description": "Specifies that the flow steers to a different destination", + "type": "object", + "properties": { + "endpoint": { + "$ref": "#/definitions/Pointer_Enforcement_Forwarding_Endpoint" + } + }, + "required": [ + "endpoint" + ] + }, + "Enforcement_Rule_Forwarding_Route_To_Network": { + "description": "Specifies that the system forwards the flow to the default destination", + "type": "object", + "properties": {}, + "required": [] + }, + "Enforcement_Rule_Forwarding_HTTP": { + "description": "Specifies that traffic affected by this rule should be redirected to the specified URL", + "type": "object", + "properties": { + "redirectUrl": { + "description": "Specifies that traffic affected by this rule should be redirected to the specified URL", + "type": "string" + } + }, + "required": [ + "redirectUrl" + ] + }, + "Enforcement_Rule_Forwarding": { + "description": "Manages the forwarding action and its attributes", + "type": "object", + "properties": { + "type": { + "description": "Specifies the type of forwarding action", + "type": "string", + "enum": [ + "icap", + "endpoint", + "route-to-network", + "http" + ] + }, + "fallbackAction": { + "description": "Specifies if the connection can remain unchanged or should be dropped if the forwarding action fails for any reason", + "type": "string", + "enum": [ + "continue", + "drop" + ], + "default": "drop" + } + }, + "allOf": [ + { + "if": { + "properties": { + "type": { + "const": "icap" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Rule_Forwarding_ICAP" + } + }, + { + "if": { + "properties": { + "type": { + "const": "endpoint" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Rule_Forwarding_Endpoint" + } + }, + { + "if": { + "properties": { + "type": { + "const": "route-to-network" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Rule_Forwarding_Route_To_Network" + } + }, + { + "if": { + "properties": { + "type": { + "const": "http" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Rule_Forwarding_HTTP" + } + } + ], + "required": [ + "type" + ] + }, + "Enforcement_Rule_Insert_Content": { + "description": "Specifies the action to insert content into the webpage", + "type": "object", + "properties": { + "duration": { + "description": "Specifies the periodicity of the insert action in seconds", + "type": "integer", + "minimum": 1, + "maximum": 4294967295 + }, + "frequency": { + "description": "Specifies the number of content insertion actions per transaction", + "type": "string", + "enum": [ + "always", + "once", + "once-every" + ], + "default": "always" + }, + "position": { + "description": "Specifies position with respect to the configured tagName", + "type": "string", + "enum": [ + "append", + "prepend" + ], + "default": "append" + }, + "tagName": { + "description": "Specifies the tag name to which the content is either appended or prepended", + "type": "string" + }, + "valueContent": { + "description": "Specifies the value content to be inserted into the webpage", + "type": "string" + }, + "valueType": { + "description": "Specifies the type of content format used in the valueContent option", + "type": "string", + "enum": [ + "string", + "tcl-snippet" + ], + "default": "string" + } + }, + "dependencies": { + "duration": { + "properties": { + "frequency": { + "const": "once-every" + } + } + }, + "tagName": { + "required": [ + "valueContent" + ] + }, + "valueContent": { + "required": [ + "tagName" + ] + }, + "frequency": { + "if": { + "properties": { + "frequency": { + "const": "once-every" + } + } + }, + "then": { + "required": [ + "duration" + ] + } + } + }, + "required": [], + "additionalProperties": false + }, + "Enforcement_Rule_Modify_HTTP_Header": { + "description": "Specifies the action to modify the HTTP header when the traffic flow matches the rule matching criteria", + "type": "object", + "properties": { + "headerName": { + "description": "Specifies the HTTP header name used by the operation option to modify the HTTP header", + "type": "string" + }, + "operation": { + "description": "Specifies the operation used to modify the HTTP header", + "type": "string", + "enum": [ + "insert", + "remove" + ] + }, + "valueContent": { + "description": "Specifies the HTTP header value content used by the insert operation to modify the HTTP header", + "type": "string" + }, + "valueType": { + "description": "Specifies the type of content format used in the valueContent option", + "type": "string", + "enum": [ + "string", + "tcl-snippet" + ], + "default": "string" + } + }, + "dependencies": { + "valueContent": { + "properties": { + "operation": { + "const": "insert" + } + } + }, + "valueType": { + "properties": { + "operation": { + "const": "insert" + } + } + } + }, + "if": { + "properties": { + "operation": { + "const": "insert" + } + } + }, + "then": { + "required": [ + "valueContent" + ] + }, + "required": [ + "headerName", + "operation" + ], + "additionalProperties": false + }, + "Enforcement_Rule_Quota": { + "description": "Specify quota management options", + "type": "object", + "properties": { + "ratingGroup": { + "$ref": "#/definitions/Pointer_Enforcement_Rating_Group" + }, + "reportingLevel": { + "description": "Specifies the quota reporting level", + "type": "string", + "enum": [ + "rating-group", + "service-id" + ], + "default": "rating-group" + } + }, + "dependencies": { + "ratingGroup": { + "properties": { + "reportingLevel": { + "const": "rating-group" + } + } + } + }, + "required": [], + "additionalProperties": false + }, + "Enforcement_Rule_Ran_Congestion": { + "description": "Detect congestion in the Radio Access Network", + "type": "object", + "properties": { + "threshold": { + "description": "Specifies lower threshold bandwidth (in kbps) for a session to be marked as congested", + "type": "integer", + "minimum": 0, + "maximum": 2147483647, + "default": 1000 + }, + "reportDestinationHsl": { + "$ref": "#/definitions/Enforcement_Rule_Report_Destination_HSL" + } + }, + "required": [], + "additionalProperties": false + }, + "Enforcement_Rule_Usage_Reporting": { + "description": "Send reporting data concerning traffic affected by this rule to either an external analytics system or to a PCRF over a Gx interface", + "type": "object", + "properties": { + "destination": { + "description": "Specifies where to send the usage monitoring data", + "type": "string", + "enum": [ + "gx", + "sd", + "hsl", + "radius-accounting" + ] + }, + "granularity": { + "description": "Specifies the type of reporting that will be generated when the policy applies", + "type": "string", + "enum": [ + "flow", + "session", + "transaction" + ], + "default": "session" + }, + "interval": { + "description": "Specifies the time interval when the report will be generated, in seconds. A value of 0 indicates this feature is disabled.", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "volume": { + "$ref": "#/definitions/Enforcement_Rule_Usage_Reporting_Volume" + }, + "transaction": { + "$ref": "#/definitions/Enforcement_Rule_Usage_Reporting_Transaction" + } + }, + "allOf": [ + { + "if": { + "properties": { + "destination": { + "const": "gx" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Rule_Usage_Gx" + } + }, + { + "if": { + "properties": { + "destination": { + "const": "sd" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Rule_Usage_Sd" + } + }, + { + "if": { + "properties": { + "destination": { + "const": "hsl" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Rule_Usage_Hsl" + } + }, + { + "if": { + "properties": { + "destination": { + "const": "radius-accounting" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Rule_Usage_Radius" + } + }, + { + "if": { + "properties": { + "destination": { + "enum": [ + "gx", + "sd", + "radius-accounting" + ] + } + } + }, + "then": { + "properties": { + "granularity": { + "const": "session" + } + } + } + }, + { + "if": { + "properties": { + "destination": { + "enum": [ + "gx", + "sd" + ] + } + } + }, + "then": { + "properties": { + "interval": { + "const": 0 + } + } + } + }, + { + "if": { + "properties": { + "destination": { + "enum": [ + "hsl", + "radius-accounting" + ] + }, + "granularity": { + "enum": [ + "flow", + "session" + ] + } + } + }, + "then": { + "anyOf": [ + { + "properties": { + "interval": { + "minimum": 1 + } + }, + "required": [ + "interval" + ] + }, + { + "required": [ + "volume" + ] + } + ] + } + }, + { + "if": { + "properties": { + "destination": { + "const": "hsl" + }, + "granularity": { + "const": "transaction" + } + } + }, + "then": { + "properties": { + "interval": { + "const": 0 + } + } + } + } + ], + "dependencies": { + "transaction": { + "properties": { + "granularity": { + "const": "transaction" + } + } + } + }, + "required": [ + "destination" + ] + }, + "Enforcement_Rule_Usage_Reporting_Volume": { + "description": "Configures volume threshold settings", + "type": "object", + "properties": { + "downlink": { + "description": "Send reporting data if the number of octets to the client exceeds the threshold. A value of 0 indicates this feature is disabled.", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "total": { + "description": "Send reporting data if the total number of octets both to and from the client exceeds the threshold. A value of 0 indicates this feature is disabled.", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "uplink": { + "description": "Send reporting data if the number of octets from the client exceeds the threshold. A value of 0 indicates this feature is disabled.", + "type": "integer", + "minimum": 0, + "default": 0 + } + }, + "required": [], + "additionalProperties": false + }, + "Enforcement_Rule_Usage_Reporting_Transaction": { + "description": "Specifies policy enforcement configuration on transaction report for each HTTP transaction", + "type": "object", + "properties": { + "hostname": { + "description": "Specifies the maximum HTTP hostname string length option to include in the HTTP transaction report", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 0 + }, + "uri": { + "description": "Specifies the maximum HTTP URI string length option to include in the HTTP transaction report", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 256 + }, + "userAgent": { + "description": "Specifies the maximum HTTP user agent string length to include in the HTTP transaction report", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 0 + } + }, + "required": [], + "additionalProperties": false + }, + "Enforcement_Rule_Usage_Gx": { + "description": "Sends usage monitoring data to a PCRF over a Gx interface", + "type": "object", + "properties": { + "applicationReportingEnabled": { + "description": "Report APPLICATION_START and APPLICATION_END Event-Triggers when the application start/stop is detected", + "type": "boolean", + "default": false + }, + "monitoringKey": { + "description": "Specifies a string to use for usage monitoring indicating the portion of traffic that is accounted for in this dynamic policy and charging control (PCC) rule", + "type": "string" + } + }, + "required": [] + }, + "Enforcement_Rule_Usage_Sd": { + "description": "Sends usage monitoring data to a PCRF over a Sd interface", + "type": "object", + "properties": { + "applicationReportingEnabled": { + "description": "Report APPLICATION_START and APPLICATION_END Event-Triggers when the application start/stop is detected", + "type": "boolean", + "default": false + }, + "monitoringKey": { + "description": "Specifies a string to use for usage monitoring indicating the portion of traffic that is accounted for in this dynamic policy and charging control (PCC) rule", + "type": "string" + } + }, + "required": [ + "monitoringKey" + ] + }, + "Enforcement_Rule_Usage_Hsl": { + "description": "Sends reporting data to remote HSL servers", + "type": "object", + "properties": { + "publisher": { + "$ref": "#/definitions/Pointer_Log_Publisher" + }, + "formatScript": { + "$ref": "#/definitions/Pointer_Enforcement_Format_Script" + }, + "sessionReportingFields": { + "description": "Specifies the session fields and their order based on which messages should be published", + "type": "array", + "items": { + "type": "string", + "enum": [ + "3gpp-parameters", + "application-id", + "called-station-id", + "calling-station-id", + "concurrent-flows", + "downlink-volume", + "duration-seconds", + "last-record-sent", + "new-flows", + "observation-time-seconds", + "record-reason", + "record-type", + "report-id", + "report-version", + "subscriber-id", + "subscriber-id-type", + "successful-transactions", + "terminated-flows", + "timestamp-msec", + "total-transactions", + "uplink-volume" + ] + } + }, + "flowReportingFields": { + "description": "Specifies the flow fields and their order based on which messages should be published", + "type": "array", + "items": { + "type": "string", + "enum": [ + "application-id", + "destination-ip", + "destination-transport-port", + "downlink-volume", + "flow-end-milli-seconds", + "flow-end-seconds", + "flow-start-milli-seconds", + "flow-start-seconds", + "observation-time-seconds", + "protocol-identifier", + "record-type", + "report-id", + "report-version", + "route-domain", + "source-ip", + "source-transport-port", + "subscriber-id", + "subscriber-id-type", + "timestamp-msec", + "total-transactions", + "uplink-volume", + "url-category-id", + "vlan-id" + ] + } + }, + "transactionReportingFields": { + "description": "Specifies the transaction fields and their order based on which messages should be published", + "type": "array", + "items": { + "type": "string", + "enum": [ + "application-id", + "destination-ip", + "destination-transport-port", + "downlink-volume", + "http-hostname", + "http-hostname-truncated", + "http-response-code", + "http-url", + "http-url-truncated", + "http-user-agent", + "http-user-agent-truncated", + "protocol-identifier", + "record-type", + "report-id", + "report-version", + "route-domain", + "skipped-transactions", + "source-ip", + "source-transport-port", + "subscriber-id", + "subscriber-id-type", + "transaction-classification-result", + "transaction-end-milli-seconds", + "transaction-end-seconds", + "transaction-number", + "transaction-start-milli-seconds", + "transaction-start-seconds", + "uplink-volume", + "url-category-id", + "vlan-id" + ] + } + } + }, + "required": [ + "publisher" + ] + }, + "Enforcement_Rule_Usage_Radius": { + "description": "Specifies a RADIUS internal virtual server as a reporting destination", + "type": "object", + "properties": { + "radiusAAAService": { + "$ref": "#/definitions/Pointer_Service" + } + }, + "required": [ + "radiusAAAService" + ] + }, + "Enforcement_Rule_Classification_Filter": { + "description": "Defines the category or application (Layer 7) conditions that the traffic must meet (or not meet) for this enforcement policy rule to apply", + "type": "object", + "properties": { + "application": { + "$ref": "#/definitions/Pointer_Classification_Application" + }, + "category": { + "$ref": "#/definitions/Pointer_Classification_Category" + }, + "invertMatch": { + "description": "Specifies that a traffic flow should not match the condition", + "type": "boolean", + "default": false + }, + "name": { + "description": "The name of the classification filter.", + "type": "string" + } + }, + "required": [ + "name" + ], + "oneOf": [ + { + "required": [ + "application" + ] + }, + { + "required": [ + "category" + ] + } + ], + "additionalProperties": false + }, + "Enforcement_Rule_URL_Categorization_Filter": { + "description": "Defines the category of URL, which provides information about the content type requested by the subscriber", + "type": "object", + "properties": { + "category": { + "description": "Specifies which type of URL category you want the rule to affect", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Classification_Category" + } + ] + }, + "invertMatch": { + "description": "Specifies that a traffic flow should not match the condition", + "type": "boolean", + "default": false + }, + "name": { + "description": "The name of the URL categorization filter.", + "type": "string" + } + }, + "required": [ + "name", + "category" + ], + "additionalProperties": false + }, + "Enforcement_Rule_Flow_Filter": { + "description": "Defines the flow conditions (Layer 4) that the traffic must meet (or not meet) for this enforcement policy rule to apply", + "type": "object", + "properties": { + "name": { + "description": "The name of the flow filter.", + "type": "string" + }, + "invertMatch": { + "description": "Specifies that a traffic flow should not match the condition", + "type": "boolean", + "default": false + }, + "dscpMarking": { + "description": "Matches incoming traffic based on a value in the DSCP field in the IP header", + "oneOf": [ + { + "type": "integer", + "minimum": 0, + "maximum": 63 + }, + { + "type": "string", + "const": "disabled" + } + ], + "default": "disabled" + }, + "destinationAddress": { + "description": "Matches traffic going to a destination address or network", + "type": "string", + "default": "0.0.0.0/0" + }, + "destinationPort": { + "description": "Matches traffic headed to a destination port", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 0 + }, + "sourceVlan": { + "description": "Matches incoming traffic from a VLAN", + "allOf": [ + { + "$ref": "#/definitions/Pointer_VLAN" + } + ] + }, + "sourceAddress": { + "description": "Matches traffic coming from a source address or network", + "type": "string", + "default": "0.0.0.0/32" + }, + "sourcePort": { + "description": "Matches traffic coming from a source port", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 0 + }, + "protocol": { + "description": "Specifies the protocol of the traffic to which the rule applies", + "type": "string", + "enum": [ + "any", + "tcp", + "udp" + ], + "default": "any" + }, + "ipAddressType": { + "description": "Specifies the IP address type that this rule applies to", + "type": "string", + "enum": [ + "any", + "ipv4", + "ipv6" + ], + "default": "any" + } + }, + "required": [ + "name" + ], + "additionalProperties": false + }, + "Enforcement_Diameter_Endpoint_Profile": { + "title": "Enforcement_Diameter_Endpoint_Profile", + "description": "Create a listener to specify how to handle traffic for policy enforcement", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "pem" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Enforcement_Diameter_Endpoint_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "parentProfile": { + "description": "Specifies the name of the object to inherit the settings from", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Enforcement_Diameter_Endpoint_Profile" + } + ], + "default": { + "bigip": "/Common/diameter-endpoint" + } + }, + "destinationHost": { + "description": "Specifies the destination host name of the PCRF or external policy server, for example, pcrfdest.net.com", + "type": "string" + }, + "destinationRealm": { + "description": "Specifies the realm name or network of the PCRF, for example, net.com", + "type": "string" + }, + "fatalGraceTime": { + "description": "Specifies the time period in seconds that a diameter (PCRF) connection can be disconnected before the system clears all subscriber session information associated with that diameter endpoint. If the connection is re-established within the fatal grace time period, session information is not cleared. A value of 0 means if the PCRF is disconnected, session information is cleared immediately.", + "type": "integer", + "minimum": 0, + "default": 500 + }, + "messageMaxRetransmits": { + "description": "Specifies the maximum number of times that messages can be retransmitted from the BIG-IP system to the PCRF", + "type": "integer", + "minimum": 0, + "default": 2 + }, + "messageRetransmitDelay": { + "description": "Specifies the number of milliseconds to wait before retransmitting unanswered messages in case of failure from the BIG-IP system to the PCRF over the Gx interface", + "type": "integer", + "minimum": 0, + "default": 1500 + }, + "originHost": { + "description": "Specifies the host name of the PCRF or external policy server, for example, pcrf.xnet.com", + "type": "string" + }, + "originRealm": { + "description": "Specifies the realm name or network in which the PCRF resides, for example, xnet.com", + "type": "string" + }, + "protocolProfileGx": { + "description": "Specifies the protocol profile to be used when you enable subscriber discovery. The PEM protocol profile defines mapping of Diameter Gx AVPs to subscriber ID and other PEM subscriber session attributes. The default BIG-IP reference values vary between versions. BIGIP versions 14.1 and above begin with 'sys_diam' (e.g. _sys_diam_proto_default).", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Enforcement_Profile_Gx" + } + ] + }, + "productName": { + "description": "Specifies the value of the string used in the product name attribute value pair (AVP), in capabilities exchange message in the diameter when communicating with the PCRF", + "type": "string", + "default": "BIG-IP" + }, + "supportedApps": { + "description": "Specifies the diameter endpoint you would like to provision. You can select Gx, Gy or SD. Gx and SD are mutually exclusive.", + "type": "array", + "items": { + "type": "string", + "enum": [ + "Gx", + "Gy", + "Sd" + ] + }, + "minItems": 1, + "uniqueItems": true + } + }, + "required": [ + "class", + "supportedApps" + ], + "additionalProperties": false + }, + "Enforcement_iRule": { + "title": "Enforcement_iRule", + "description": "Specifies or configures an iRule for use in Enforcement Policies", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Enforcement_iRule" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "expand": { + "title": "Expand", + "description": "If true (default), expand backquoted variables in iRule", + "type": "boolean", + "default": true + }, + "iRule": { + "$ref": "#/definitions/IRule_Core" + } + }, + "additionalProperties": false, + "required": [ + "class", + "iRule" + ] + }, + "Enforcement_Radius_AAA_Profile": { + "title": "Enforcement_Radius_AAA_Profile", + "description": "Configures a radius AAA profile", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "pem" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Enforcement_Radius_AAA_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "parentProfile": { + "description": "Specifies the name of the object to inherit the settings from", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Enforcement_Radius_AAA_Profile" + } + ], + "default": { + "bigip": "/Common/radiusaaa" + } + }, + "retransmissionTimeout": { + "description": "The number of seconds to wait before resending authentication or accounting transaction messages to the RADIUS server", + "type": "integer", + "minimum": 0, + "maximum": 60, + "default": 5 + }, + "sharedSecret": { + "description": "Specifies the shared secret of the RADIUS server used for authentication or accounting", + "type": "object", + "properties": { + "allowReuse": { + "description": "If true, other declaration objects may reuse this value", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Secret" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "object" + } + }, + { + "f5PostProcess": { + "tag": "secret" + } + } + ] + }, + "password": { + "description": "The password of the RADIUS AAA profile for RADIUS server authentication", + "type": "object", + "properties": { + "allowReuse": { + "description": "If true, other declaration objects may reuse this value", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Secret" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "object" + } + }, + { + "f5PostProcess": { + "tag": "secret" + } + } + ] + }, + "transactionTimeout": { + "description": "The number of seconds to wait before resending authentication or accounting transaction messages to the RADIUS server", + "type": "integer", + "minimum": 5, + "maximum": 300, + "default": 30 + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "Enforcement_Profile": { + "title": "Enforcement_Profile", + "description": "Configures a subscriber policy manager profile", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "pem" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Enforcement_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "parentProfile": { + "description": "Specifies the name of the object to inherit the settings from", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Enforcement_Profile" + } + ], + "default": { + "bigip": "/Common/spm" + } + }, + "policiesGlobalHighPrecedence": { + "description": "Adds, deletes, or replaces a set of the policies", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Enforcement_Policy" + } + }, + "policiesGlobalLowPrecedence": { + "description": "Adds, deletes, or replaces a set of the policies", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Enforcement_Policy" + } + }, + "policiesUnknownSubscribers": { + "description": "Adds, deletes, or replaces a set of the policies", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Enforcement_Policy" + } + }, + "connectionOptimizationEnabled": { + "description": "Specifies whether connection optimization is enabled or not", + "type": "boolean", + "default": true + }, + "connectionOptimizationService": { + "$ref": "#/definitions/Pointer_Service" + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "Enforcement_Subscriber_Management_Profile": { + "title": "Enforcement_Subscriber_Management_Profile", + "description": "Configures a subscriber management profile", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "pem" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Enforcement_Subscriber_Management_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "parentProfile": { + "description": "Specifies the name of the object to inherit the settings from", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Enforcement_Subscriber_Management_Profile" + } + ], + "default": { + "bigip": "/Common/subscriber-mgmt" + } + }, + "dhcpLeaseQuery": { + "$ref": "#/definitions/Enforcement_Subscriber_Management_Profile_DHCP" + }, + "serverSideSessionsEnabled": { + "description": "Specifies the session is created based on server side IP when the server side traffic comes and is enabled", + "type": "boolean", + "default": true + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "Enforcement_Subscriber_Management_Profile_DHCP": { + "description": "Configures DHCP lease query settings for a subscriber management profile", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "pem" + ] + }, + "properties": { + "enabled": { + "description": "Specifies the subscriber management settings use DHCP lease query to communicate with DHCP servers to obtain DHCP lease information for the unknown IP address and creates a new policy enforcement session using the lease information received", + "type": "boolean", + "default": true + }, + "service": { + "$ref": "#/definitions/Pointer_Service" + } + }, + "required": [ + "service" + ], + "additionalProperties": false + }, + "Enforcement_Listener": { + "title": "Enforcement_Listener", + "description": "Configures an enforcement data plane listener", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "pem" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Enforcement_Listener" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "enforcementProfile": { + "$ref": "#/definitions/Pointer_Enforcement_Profile" + }, + "subscriberManagementProfile": { + "$ref": "#/definitions/Pointer_Enforcement_Subscriber_Management_Profile" + }, + "services": { + "description": "A set of virtual servers", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Service" + }, + "minItems": 1 + } + }, + "required": [ + "class", + "enforcementProfile", + "services" + ], + "additionalProperties": false + }, + "Enforcement_Interception_Endpoint": { + "title": "Enforcement_Interception_Endpoint", + "description": "Configures an interception endpoint to clone all traffic", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "pem" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Enforcement_Interception_Endpoint" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "persistence": { + "description": "Specifies the persistence that is based on either the source or destination IP addresses only", + "type": "string", + "enum": [ + "destination-ip", + "source-ip", + "disabled" + ], + "default": "disabled" + }, + "pool": { + "$ref": "#/definitions/Pointer_Pool" + } + }, + "required": [ + "class", + "pool" + ], + "additionalProperties": false + }, + "Enforcement_Format_Script": { + "title": "Enforcement_Format_Script", + "description": "Specifies a script using TCL syntax that defines a custom format for HSL reporting applied in an enforcement policy rule. The format and fields available differ depending on whether you are using session-based or flow-based reporting in the rule.", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "pem" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Enforcement_Format_Script" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "definition": { + "description": "TCL script text", + "type": "string" + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "Enforcement_Forwarding_Endpoint": { + "title": "Enforcement_Forwarding_Endpoint", + "description": "Configures an forwarding endpoint to specify PEM policy forwarding actions", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "pem" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Enforcement_Forwarding_Endpoint" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "pool": { + "$ref": "#/definitions/Pointer_Pool" + }, + "SNATPool": { + "$ref": "#/definitions/Pointer_SNAT_Pool" + }, + "sourcePortAction": { + "description": "Specifies whether the system preserves the source port of the connection", + "type": "string", + "enum": [ + "change", + "preserve", + "preserve-strict" + ], + "default": "preserve" + }, + "addressTranslationEnabled": { + "description": "Specifies, when enabled, the system translates the original destination address of the virtual server. When disabled, specifies the system uses the address without translation.", + "type": "boolean", + "default": false + }, + "portTranslationEnabled": { + "description": "Specifies, when enabled, the system translates the original destination port. When disabled, specifies the system uses the original destination port without translation.", + "type": "boolean", + "default": false + }, + "defaultPersistenceType": { + "description": "Specifies a persistence method for the pool member selection. If you have multiple pool members and want specific traffic to go to the same pool member, select the appropriate IP address type.", + "type": "string", + "enum": [ + "destination-ip", + "disabled", + "hash", + "source-ip" + ], + "default": "disabled" + }, + "fallbackPersistenceType": { + "description": "Specifies the fallback persistence method that is applied when default persistence fails. If you have multiple pool members and want specific traffic to go to the same pool member, select the appropriate IP address type.", + "type": "string", + "enum": [ + "destination-ip", + "disabled", + "source-ip" + ], + "default": "disabled" + }, + "persistenceHashSettings": { + "allOf": [ + { + "$ref": "#/definitions/Enforcement_Forwarding_Endpoint_Hash_Settings" + } + ], + "default": {} + } + }, + "required": [ + "class", + "pool" + ], + "additionalProperties": false + }, + "Enforcement_Forwarding_Endpoint_Hash_Settings": { + "description": "Specifies the settings for the hash persistence method", + "type": "object", + "properties": { + "length": { + "description": "Specifies the length of the source string used to calculate the hash value", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 1024 + }, + "offset": { + "description": "Specifies the offset, in bytes, from start of the source string to calculate the hash value", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 0 + }, + "tclScript": { + "description": "The results from this TCL script are used to calculate the hash value. If no script is specified, the URI is used instead.", + "type": "string" + } + }, + "required": [], + "additionalProperties": false + }, + "Enforcement_Service_Chain_Endpoint": { + "title": "Enforcement_Service_Chain_Endpoint", + "description": "Configures service chain endpoint definitions for the Policy Enforcement Manager (PEM)", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Enforcement_Service_Chain_Endpoint" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "serviceEndpoints": { + "description": "Specifies a list of forwarding endpoints that define where to send traffic on the way to its final destination. This way, the system can route traffic to other servers that can provide value-added services. Traffic goes to the endpoints in the order in which they are listed.", + "type": "array", + "items": { + "$ref": "#/definitions/Enforcement_Service_Chain_Endpoint_Service_Endpoint" + } + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "Enforcement_Service_Chain_Endpoint_Service_Endpoint": { + "description": "Configures an individual service chain endpoint", + "type": "object", + "properties": { + "name": { + "description": "Specify the name of the service endpoint where the traffic is going to", + "type": "string" + }, + "forwardingEndpoint": { + "$ref": "#/definitions/Pointer_Enforcement_Forwarding_Endpoint" + }, + "sourceVLAN": { + "$ref": "#/definitions/Pointer_VLAN" + }, + "serviceOption": { + "description": "Specifies the service option in case the service endpoint is not accessible through the network, for forwarding endpoint. For ICAP service endpoint, the service endpoint works as a fallback action for non-HTTP traffic. Select \"optional\" if you want to skip the service endpoint. Select \"mandatory\" if you want all traffic flows dropped.", + "type": "string", + "enum": [ + "mandatory", + "optional" + ], + "default": "mandatory" + }, + "internalService": { + "description": "Specifies the internal ICAP virtual server", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Service" + } + ] + }, + "internalServiceICAPType": { + "description": "Specifies the ICAP adaptation type. Select \"request\" to send only HTTP requests to ICAP server. Select \"response\" to send only HTTP responses to ICAP server. Select \"both\" to have both requests and responses.", + "type": "string", + "enum": [ + "request", + "response", + "both", + "none" + ] + }, + "steeringPolicy": { + "$ref": "#/definitions/Pointer_Enforcement_Policy" + } + }, + "dependencies": { + "internalServiceICAPType": [ + "internalService" + ] + }, + "required": [ + "sourceVLAN" + ], + "additionalProperties": false + }, + "Pointer_Address_List": { + "description": "Reference to a firewall address list or net address list", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to firewall address list or net address list declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Firewall_Address_List", + "Net_Address_List" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP firewall address list or net address list", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security firewall address-list", + "query net address-list" + ] + } + } + ] + }, + "Pointer_Address_Discovery": { + "description": "Reference to a Address Discovery", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to Address Discovery declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Address_Discovery" + ] + } + }, + "required": [ + "class" + ] + } + } + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1 + }, + "Pointer_ALG_Log_Profile": { + "description": "Reference to a application layer gateway log profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to application layer gateway log profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "ALG_Log_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP application layer gateway log profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm alg-log-profile" + ] + } + } + ] + }, + "Pointer_API_Protection_Profile": { + "description": "Reference to a API_Protection_Profile", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP API_Protection_Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query api-protection profile apiprotection" + ] + } + } + ] + }, + "Pointer_Bandwidth_Control_Policy": { + "description": "Reference to a bandwidth control policy", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to bandwidth control policy declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Bandwidth_Control_Policy" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP bandwidth control policy", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query net bwc policy" + ] + } + } + ] + }, + "Pointer_Idle_Timeout_Policy": { + "description": "Reference to a idle timeout policy", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to idle timeout policy declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Idle_Timeout_Policy" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP idle timeout policy", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query net timer-policy" + ] + } + } + ] + }, + "Pointer_Denylist_Category": { + "description": "Reference to a denylist category", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP denylist category", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security ip-intelligence blacklist-category" + ] + } + } + ] + }, + "Pointer_Bot_Defense_Profile": { + "description": "Reference to a bot defense profile", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP bot defense profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security bot-defense profile" + ] + } + } + ] + }, + "Pointer_Bot_Signature": { + "description": "Reference to a bot signature", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP bot signature", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security dos bot-signature", + "query security bot-defense signature" + ] + } + } + ] + }, + "Pointer_Bot_Signature_Category": { + "description": "Reference to a bot signature category", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP bot signature category", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security dos bot-signature-category", + "query security bot-defense signature-category" + ] + } + } + ] + }, + "Pointer_Cipher_Group": { + "description": "Reference to a cipher group", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to cipher group declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Cipher_Group" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP cipher group", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm cipher group" + ] + } + } + ] + }, + "Pointer_Cipher_Rule": { + "description": "Reference to a cipher rule", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to cipher rule declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Cipher_Rule" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP cipher rule", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm cipher rule" + ] + } + } + ] + }, + "Pointer_Classification_Application": { + "description": "Reference to a application classification", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP application classification", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm classification application" + ] + } + } + ] + }, + "Pointer_Classification_Category": { + "description": "Reference to a category classification", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP category classification", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm classification category" + ] + } + } + ] + }, + "Pointer_Classification_Preset": { + "description": "Reference to a classification preset", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP classification preset", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm classification ce" + ] + } + } + ] + }, + "Pointer_Classification_Profile": { + "description": "Reference to a classification profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to classification profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Classification_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP classification profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile classification" + ] + } + } + ] + }, + "Pointer_DNS_Cache": { + "description": "Reference to a DNS cache", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to DNS cache declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "DNS_Cache" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP DNS cache", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm dns cache resolver", + "query ltm dns cache transparent", + "query ltm dns cache validating-resolver" + ] + } + } + ] + }, + "Pointer_Data_Group_File": { + "description": "Reference to a Data Group File", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP Data Group File", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys file data-group" + ] + } + } + ] + }, + "Pointer_Data_Group": { + "description": "Reference to a Data Group", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to Data Group declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Data_Group" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP Data Group", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm data-group internal", + "query ltm data-group external" + ] + } + } + ] + }, + "Pointer_DNS_Listener": { + "description": "Reference to a DNS Listener", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to DNS Listener declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "DNS_Listener" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP DNS Listener", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query gtm listener" + ] + } + } + ] + }, + "Pointer_DNS_Logging_Profile": { + "description": "Reference to a DNS logging profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to DNS logging profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "DNS_Logging_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP DNS logging profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile dns-logging" + ] + } + } + ] + }, + "Pointer_DNS_Nameserver": { + "description": "Reference to a DNS nameserver", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to DNS nameserver declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "DNS_Nameserver" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP DNS nameserver", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm dns nameserver" + ] + } + } + ] + }, + "Pointer_DNS_Profile": { + "description": "Reference to a DNS profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to DNS profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "DNS_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP DNS profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile dns" + ] + } + } + ] + }, + "Pointer_DNS_Security_Profile": { + "description": "Reference to a DNS security profile", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP DNS security profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security dns profile" + ] + } + } + ] + }, + "Pointer_DNS_TSIG_Key": { + "description": "Reference to a DNS TSIG key", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to DNS TSIG key declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "DNS_TSIG_Key" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP DNS TSIG key", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm dns tsig-key" + ] + } + } + ] + }, + "Pointer_DNS_Zone": { + "description": "Reference to a DNS zone", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to DNS zone declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "DNS_Zone" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP DNS zone", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm dns zone" + ] + } + } + ] + }, + "Pointer_DOS_Profile": { + "description": "Reference to a DOS Profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to DOS Profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "DOS_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP DOS Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security dos profile" + ] + } + } + ] + }, + "Pointer_Endpoint_Policy": { + "oneOf": [ + { + "description": "AS3 pointer to endpoint policy declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Endpoint_Policy" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + { + "description": "Reference to a endpoint policy", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to endpoint policy declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Endpoint_Policy" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP endpoint policy", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm policy" + ] + } + } + ] + } + ] + }, + "Pointer_Enforcement_Format_Script": { + "description": "Reference to a format script", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to format script declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Enforcement_Format_Script" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP format script", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query pem reporting format-script" + ] + } + } + ] + }, + "Pointer_Enforcement_Forwarding_Endpoint": { + "description": "Reference to a forwarding endpoint", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to forwarding endpoint declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Enforcement_Forwarding_Endpoint" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP forwarding endpoint", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query pem forwarding-endpoint" + ] + } + } + ] + }, + "Pointer_Enforcement_Interception_Endpoint": { + "description": "Reference to a interception endpoint", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to interception endpoint declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Enforcement_Interception_Endpoint" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP interception endpoint", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query pem interception-endpoint" + ] + } + } + ] + }, + "Pointer_Enforcement_iRule": { + "description": "Reference to a enforcement iRule", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to enforcement iRule declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Enforcement_iRule" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP PEM iRule", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query pem irule" + ] + } + } + ] + }, + "Pointer_Enforcement_Policy": { + "description": "Reference to a enforcement policy", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to enforcement policy declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Enforcement_Policy" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP PEM policy", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query pem policy" + ] + } + } + ] + }, + "Pointer_Enforcement_Diameter_Endpoint_Profile": { + "description": "Reference to a enforcement profile diameter endpoint", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to enforcement profile diameter endpoint declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Enforcement_Diameter_Endpoint_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP enforcement profile diameter endpoint", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query pem profile diameter-endpoint" + ] + } + } + ] + }, + "Pointer_Enforcement_Profile_Gx": { + "description": "Reference to a enforcement profile gx", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP enforcement profile gx", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query pem protocol profile gx" + ] + } + } + ] + }, + "Pointer_Enforcement_Radius_AAA_Profile": { + "description": "Reference to a enforcement profile radius aaa", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to enforcement profile radius aaa declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Enforcement_Radius_AAA_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP enforcement profile radius aaa", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query pem profile radius-aaa" + ] + } + } + ] + }, + "Pointer_Enforcement_Profile": { + "description": "Reference to a enforcement profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to enforcement profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Enforcement_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP PEM spm policy", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query pem profile spm" + ] + } + } + ] + }, + "Pointer_Enforcement_Rating_Group": { + "description": "Reference to a quota rating group", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP quota rating group", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query pem quota-mgmt rating-group" + ] + } + } + ] + }, + "Pointer_Enforcement_Service_Chain_Endpoint": { + "description": "Reference to a service chain endpoint", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to service chain endpoint declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Enforcement_Service_Chain_Endpoint" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP service chain endpoint", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query pem service-chain-endpoint" + ] + } + } + ] + }, + "Pointer_Enforcement_Subscriber_Management_Profile": { + "description": "Reference to a enforcement subscriber management profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to enforcement subscriber management profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Enforcement_Subscriber_Management_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP PEM subscriber-mgmt policy", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query pem profile subscriber-mgmt" + ] + } + } + ] + }, + "Pointer_Enforcement_Protocol_Profile_Radius": { + "description": "Reference to a radius protocol profile", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP radius protocol profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query pem protocol profile radius" + ] + } + } + ] + }, + "Pointer_Existing_TLS_Server_Profile": { + "description": "Reference to a TLS Server profile", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP TLS Server profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile client-ssl" + ] + } + } + ] + }, + "Pointer_Existing_TLS_Client_Profile": { + "description": "Reference to a TLS Client profile", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP TLS Client profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile server-ssl" + ] + } + } + ] + }, + "Pointer_Firewall_Address_List": { + "description": "Reference to a firewall address list", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to firewall address list declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Firewall_Address_List" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP firewall address list", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security firewall address-list" + ] + } + } + ] + }, + "Pointer_Firewall_Policy": { + "description": "Reference to a firewall (AFM) policy", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to firewall (AFM) policy declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Firewall_Policy" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP firewall (AFM) policy", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security firewall policy" + ] + } + } + ] + }, + "Pointer_Firewall_Port_List": { + "description": "Reference to a firewall port list", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to firewall port list declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Firewall_Port_List" + ] + } + }, + "required": [ + "class" + ] + } + } + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1 + }, + "Pointer_Firewall_Rule_List": { + "description": "Reference to a firewall rule list", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to firewall rule list declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Firewall_Rule_List" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP firewall rule list", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security firewall rule-list" + ] + } + } + ] + }, + "Pointer_FPS_Profile": { + "description": "Reference to a FPS Profile", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP FPS Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security anti-fraud profile" + ] + } + } + ] + }, + "Pointer_FTP_Profile": { + "description": "Reference to a FTP protocol profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to FTP protocol profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "FTP_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP FTP protocol profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile ftp" + ] + } + } + ] + }, + "Pointer_GSLB_Data_Center": { + "description": "Reference to a GSLB data center", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to GSLB data center declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "GSLB_Data_Center" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP GSLB data center", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query gtm datacenter" + ] + } + } + ] + }, + "Pointer_GSLB_Domain_A": { + "description": "Reference to a GSLB domain", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to GSLB domain declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "GSLB_Domain" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP GSLB domain", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query gtm wideip a" + ] + } + } + ] + }, + "Pointer_GSLB_Domain_AAAA": { + "description": "Reference to a GSLB domain", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to GSLB domain declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "GSLB_Domain" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP GSLB domain", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query gtm wideip aaaa" + ] + } + } + ] + }, + "Pointer_GSLB_Domain_CNAME": { + "description": "Reference to a GSLB domain", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to GSLB domain declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "GSLB_Domain" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP GSLB domain", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query gtm wideip cname" + ] + } + } + ] + }, + "Pointer_GSLB_Domain_MX": { + "description": "Reference to a GSLB domain", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to GSLB domain declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "GSLB_Domain" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP GSLB domain", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query gtm wideip mx" + ] + } + } + ] + }, + "Pointer_GSLB_Monitor": { + "description": "Reference to a GSLB monitor", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to GSLB monitor declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "GSLB_Monitor" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP GSLB monitor", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query gtm monitor bigip", + "query gtm monitor bigip-link", + "query gtm monitor external", + "query gtm monitor firepass", + "query gtm monitor ftp", + "query gtm monitor gateway-icmp", + "query gtm monitor gtp", + "query gtm monitor http", + "query gtm monitor https", + "query gtm monitor http2", + "query gtm monitor imap", + "query gtm monitor ldap", + "query gtm monitor mssql", + "query gtm monitor mysql", + "query gtm monitor nntp", + "query gtm monitor none", + "query gtm monitor oracle", + "query gtm monitor pop3", + "query gtm monitor postgresql", + "query gtm monitor radius", + "query gtm monitor radius-accounting", + "query gtm monitor real-server", + "query gtm monitor scripted", + "query gtm monitor sip", + "query gtm monitor smtp", + "query gtm monitor snmp", + "query gtm monitor snmp-link", + "query gtm monitor soap", + "query gtm monitor tcp", + "query gtm monitor tcp-half-open", + "query gtm monitor udp", + "query gtm monitor wap", + "query gtm monitor wmi" + ] + } + } + ] + }, + "Pointer_GSLB_Pool": { + "description": "Reference to a GSLB pool", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to GSLB pool declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "GSLB_Pool" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP GSLB pool", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query gtm pool a", + "query gtm pool aaaa", + "query gtm pool cname", + "query gtm pool mx" + ] + } + } + ] + }, + "Pointer_GSLB_Prober_Pool": { + "description": "Reference to a GSLB pool", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to GSLB pool declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "GSLB_Prober_Pool" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP GSLB pool", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query gtm prober-pool" + ] + } + } + ] + }, + "Pointer_GSLB_Server": { + "description": "Reference to a GSLB server", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to GSLB server declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "GSLB_Server" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP GSLB server", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query gtm server" + ] + } + } + ] + }, + "Pointer_GSLB_Server_Device": { + "description": "Reference to a GSLB server device", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to GSLB server device declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "GSLB_Server_Device" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP GSLB server device", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query gtm server devices" + ] + } + } + ] + }, + "Pointer_GSLB_Topology_Region": { + "description": "Reference to a GSLB Topology Region", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to GSLB Topology Region declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "GSLB_Topology_Region" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP GSLB Topology Region", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query gtm region" + ] + } + } + ] + }, + "Pointer_GSLB_Virtual_Server": { + "description": "Reference to a GSLB virtual server", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to GSLB virtual server declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "GSLB_Virtual_Server" + ] + } + }, + "required": [ + "class" + ] + } + } + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1 + }, + "Pointer_HTML_Profile": { + "description": "Reference to a HTML_Profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to HTML_Profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "HTML_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP HTML_Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile html" + ] + } + } + ] + }, + "Pointer_HTML_Rule": { + "description": "Reference to a HTML_Rule", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to HTML_Rule declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "HTML_Rule" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP HTML_Rule", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm html-rule comment-raise-event", + "query ltm html-rule comment-remove", + "query ltm html-rule tag-append-html", + "query ltm html-rule tag-prepend-html", + "query ltm html-rule tag-raise-event", + "query ltm html-rule tag-remove", + "query ltm html-rule tag-remove-attribute" + ] + } + } + ] + }, + "Pointer_HTTP2_Profile": { + "description": "Reference to a HTTP/2 Profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to HTTP/2 Profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "HTTP2_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP HTTP/2 Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile http2" + ] + } + } + ] + }, + "Pointer_ILX_Profile": { + "description": "Reference to a iRules LX Profile", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP iRules LX Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile ilx" + ] + } + } + ] + }, + "Pointer_Integrated_Bot_Defense_Profile": { + "description": "Reference to a Integrated Bot Defense Profile", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP Integrated Bot Defense Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query saas bd profile" + ] + } + } + ] + }, + "Pointer_IP_Intelligence_Policy": { + "description": "Reference to a IP Intelligence Policy", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP IP Intelligence Policy", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security ip-intelligence policy" + ] + } + } + ] + }, + "Pointer_NAT_Source_Translation": { + "description": "Reference to a NAT Source Translation", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to NAT Source Translation declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "NAT_Source_Translation" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP NAT Source Translation", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security nat source-translation" + ] + } + } + ] + }, + "Pointer_Net_Address_List": { + "description": "Reference to a net address list", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to net address list declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Net_Address_List" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP net address list", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query net address-list" + ] + } + } + ] + }, + "Pointer_Net_Port_List": { + "description": "Reference to a net port list", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to net port list declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Net_Port_List" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP net port list", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query net port-list" + ] + } + } + ] + }, + "Pointer_Persist_Profile": { + "description": "Reference to a Persist Profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to Persist Profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Persist" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP Persist Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm persistence cookie", + "query ltm persistence dest-addr", + "query ltm persistence hash", + "query ltm persistence host", + "query ltm persistence msrdp", + "query ltm persistence sip", + "query ltm persistence source-addr", + "query ltm persistence ssl", + "query ltm persistence universal" + ] + } + } + ] + }, + "Pointer_RTSP_Profile": { + "description": "Reference to a Real Time Streaming Protocol Profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to Real Time Streaming Protocol Profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "RTSP_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP Real Time Streaming Protocol Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile rtsp" + ] + } + } + ] + }, + "Pointer_Access_Profile": { + "description": "Reference to a Access Profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to Access Profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Access_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP Access Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query apm profile access" + ] + } + } + ] + }, + "Pointer_Per_Request_Access_Policy": { + "description": "Reference to a Per Request Access Policy", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to Per Request Access Policy declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Per_Request_Access_Policy" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP Per Request Access Policy", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query apm policy access-policy" + ] + } + } + ] + }, + "Pointer_Connectivity_Profile": { + "description": "Reference to a Connectivity Profile", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP Connectivity Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query apm profile connectivity" + ] + } + } + ] + }, + "Pointer_IP_Other_Profile": { + "description": "Reference to a ipother profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to ipother profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "IP_Other_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP ipother profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile ipother" + ] + } + } + ] + }, + "Pointer_Radius_Profile": { + "description": "Reference to a radius profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to radius profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Radius_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP radius profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile radius" + ] + } + } + ] + }, + "Pointer_Persist": { + "description": "Reference to a persistence profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to persistence profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Persist" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP persistence profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm persistence" + ] + } + } + ] + }, + "Pointer_Analytics_Profile": { + "description": "Reference to a Analytics_Profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to Analytics_Profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Analytics_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP Analytics_Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile analytics" + ] + } + } + ] + }, + "Pointer_Analytics_TCP_Profile": { + "description": "Reference to a Analytics_TCP_Profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to Analytics_TCP_Profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Analytics_TCP_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP Analytics_TCP_Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile tcp-analytics" + ] + } + } + ] + }, + "Pointer_FIX_Profile": { + "description": "Reference to a FIX profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to FIX profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "FIX_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP FIX profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile fix" + ] + } + } + ] + }, + "Pointer_ICAP_Profile": { + "description": "Reference to a ICAP Profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to ICAP Profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "ICAP_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP ICAP Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile icap" + ] + } + } + ] + }, + "Pointer_Multiplex_Profile": { + "description": "Reference to a Multiplex profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to Multiplex profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Multiplex_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP Multiplex profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile one-connect" + ] + } + } + ] + }, + "Pointer_NTLM_Profile": { + "description": "Reference to a NT LAN Manager profile", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP NT LAN Manager profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile ntlm" + ] + } + } + ] + }, + "Pointer_PPTP_Profile": { + "description": "Reference to a PPTP_Profile", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP PPTP_Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile pptp" + ] + } + } + ] + }, + "Pointer_Rewrite_Profile": { + "description": "Reference to a Rewrite Profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to Rewrite Profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Rewrite_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP Rewrite Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile rewrite" + ] + } + } + ] + }, + "Pointer_Protocol_Inspection_Profile": { + "description": "Reference to a Protocol Inspection Profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to Protocol Inspection Profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Protocol_Inspection_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP Protocol Inspection Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security protocol-inspection profile" + ] + } + } + ] + }, + "Pointer_Statistics_Profile": { + "description": "Reference to a Statistics Profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to Statistics Profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Statistics_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP Statistics Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile statistics" + ] + } + } + ] + }, + "Pointer_TCP_Profile": { + "description": "Reference to a TCP profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to TCP profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "TCP_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP TCP profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile tcp" + ] + } + } + ] + }, + "Pointer_TLS_Client": { + "description": "Reference to a TLS Client", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to TLS Client declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "TLS_Client" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP TLS Client", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile server-ssl" + ] + } + } + ] + }, + "Pointer_Port_List": { + "description": "Reference to a firewall port list or net port list", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to firewall port list or net port list declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Firewall_Port_List", + "Net_Port_List" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP firewall port list or net port list", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security firewall port-list", + "query net port-list" + ] + } + } + ] + }, + "Pointer_Request_Adapt_Profile": { + "description": "Reference to a Request Adapt Profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to Request Adapt Profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Adapt_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP Request Adapt Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile request-adapt" + ] + } + } + ] + }, + "Pointer_Response_Adapt_Profile": { + "description": "Reference to a Response Adapt Profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to Response Adapt Profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Adapt_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP Response Adapt Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile response-adapt" + ] + } + } + ] + }, + "Pointer_Route_Domain": { + "description": "Reference to a route domain", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP route domain", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query net route-domain" + ] + } + } + ] + }, + "Pointer_SCTP_Profile": { + "description": "Reference to a SCTP Profile", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP SCTP Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile sctp" + ] + } + } + ] + }, + "Pointer_Security_Log_Profile": { + "description": "Reference to a Security Log Profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to Security Log Profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Security_Log_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP Security Log Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security log profile" + ] + } + } + ] + }, + "Pointer_Service": { + "description": "Reference to a service", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to service declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Service_Forwarding", + "Service_HTTPS", + "Service_HTTP", + "Service_TCP", + "Service_UDP", + "Service_L4", + "Service_Generic" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP virtual server", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm virtual" + ] + } + } + ] + }, + "Pointer_SNAT_Pool": { + "description": "Reference to a snat pool", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to snat pool declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "SNAT_Pool" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP snat pool", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm snatpool" + ] + } + } + ] + }, + "Pointer_SNAT_Translation": { + "description": "Reference to a snat translation", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to snat translation declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "SNAT_Translation" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP snat translation", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm snat-translation" + ] + } + } + ] + }, + "Pointer_SOCKS_Profile": { + "description": "Reference to a SOCKS profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to SOCKS profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "SOCKS_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP SOCKS profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile socks" + ] + } + } + ] + }, + "Pointer_SSL_CRL_File": { + "description": "Reference to a SSL CRL file", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP SSL CRL file", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys file ssl-crl" + ] + } + } + ] + }, + "Pointer_Stream_Profile": { + "description": "Reference to a stream profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to stream profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Stream_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP stream profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile stream" + ] + } + } + ] + }, + "Pointer_TFTP_Profile": { + "description": "Reference to a TFTP profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to TFTP profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "TFTP_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP TFTP profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile tftp" + ] + } + } + ] + }, + "Pointer_Traffic_Log_Profile": { + "description": "Reference to a traffic log profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to traffic log profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Traffic_Log_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP Request Logging Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile request-log" + ] + } + } + ] + }, + "Pointer_Tunnel": { + "description": "Reference to a network tunnel", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP network tunnel", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query net tunnels endpoint", + "query net tunnels etherip", + "query net tunnels fec", + "query net tunnels fec-stat", + "query net tunnels geneve", + "query net tunnels gre", + "query net tunnels ipip", + "query net tunnels ipsec", + "query net tunnels lw4o6", + "query net tunnels map", + "query net tunnels ppp", + "query net tunnels tcp-forward", + "query net tunnels tunnel", + "query net tunnels v6rd", + "query net tunnels vxlan", + "query net tunnels wccp", + "query net vlan" + ] + } + } + ] + }, + "Pointer_Service_Address": { + "description": "Reference to a Service Address", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to Service Address declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Service_Address" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP Service Address", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm virtual-address" + ] + } + } + ] + }, + "Pointer_SSH_Proxy_Profile": { + "description": "Reference to a SSH proxy profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to SSH proxy profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "SSH_Proxy_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP SSH proxy profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security ssh profile" + ] + } + } + ] + }, + "Pointer_SIP_Profile": { + "description": "Reference to a SIP profile", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP SIP profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile sip" + ] + } + } + ] + }, + "Pointer_UDP_Profile": { + "description": "Reference to a UDP profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to UDP profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "UDP_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP UDP profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile udp" + ] + } + } + ] + }, + "Pointer_VDI_Profile": { + "description": "Reference to a VDI profile", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP VDI profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query apm profile vdi" + ] + } + } + ] + }, + "Pointer_VLAN": { + "description": "Reference to a VLAN", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP VLAN", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query net vlan" + ] + } + } + ] + }, + "Pointer_WAF_Policy": { + "description": "Reference to a WAF policy", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to WAF policy declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "WAF_Policy" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP WAF policy", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query asm policy" + ] + } + } + ] + }, + "Analytics_Profile": { + "title": "Analytics Profile", + "type": "object", + "description": "HTTP Analytics profile with configurable options", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Analytics_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "captureFilter": { + "allOf": [ + { + "$ref": "#/definitions/Capture_Filter" + } + ], + "default": {} + }, + "collectGeo": { + "title": "Collect Countries", + "description": "Specifies that the system collects statistics of the names of the countries from which that traffic was sent", + "type": "boolean", + "default": false + }, + "collectClientSideStatistics": { + "title": "Collect Client-Side Statistics", + "description": "Specifies that the system collects statistics regarding the HTTP request and response times", + "type": "boolean", + "default": false + }, + "collectUrl": { + "title": "Collect URL", + "description": "Specifies that the system collects statistics of requested URLs", + "type": "boolean", + "default": false + }, + "collectIp": { + "title": "Collect Client IP Addresses", + "description": "Specifies that the system collects statistics of the IP addresses of where the traffic came from", + "type": "boolean", + "default": false + }, + "collectSubnet": { + "title": "Collect Client Subnet", + "description": "Specifies that the system collects statistics of client subnets", + "type": "boolean", + "default": false + }, + "collectUserAgent": { + "title": "Collect User Agent", + "description": "Specifies that the system collects statistics about browsers used to send traffic", + "type": "boolean", + "default": false + }, + "collectOsAndBrowser": { + "title": "Collect Operating System and Browser", + "description": "Specifies that the system collect statistics about the OSs and Browsers used to send requests", + "type": "boolean", + "default": true + }, + "collectResponseCode": { + "title": "Collect Response Code", + "description": "Specifies that the system collects statistics about the distribution of HTTP response codes returned by the servers", + "type": "boolean", + "default": true + }, + "collectMethod": { + "title": "Collect Method", + "description": "Specifies that the system collects statistics about the distribution of HTTP methods found in requests", + "type": "boolean", + "default": true + }, + "collectMaxTpsAndThroughput": { + "title": "Collect Max TPS and Throughput", + "description": "Specifies that the system collects statistics for the maximum number of transactions per second, and the maximum amount of traffic moving through the system, both request and response throughput values", + "type": "boolean", + "default": false + }, + "collectPageLoadTime": { + "title": "Collect Page Load Time", + "description": "Specifies that the system collects statistics of the round-trip latency between client end-users and the servers", + "type": "boolean", + "default": false + }, + "collectUserSession": { + "title": "Collect User Sessions", + "description": "Specifies that the system collects statistics of the number of unique user sessions in the application traffic, as determined by the value of the configured HTTP cookies found in the requests", + "type": "boolean", + "default": false + }, + "collectedStatsInternalLogging": { + "title": "Collected Statistics Internal Logging", + "description": "Specifies that statistics logs are stored in the system", + "type": "boolean", + "default": true + }, + "collectedStatsExternalLogging": { + "title": "Collected Statistics External Logging", + "description": "Specifies that statistics logs are stored on a remote server", + "type": "boolean", + "default": false + }, + "capturedTrafficInternalLogging": { + "title": "Captured Traffic Internal Logging", + "description": "Specifies that the system captures a portion of the application traffic and sends it to a remote server", + "type": "boolean", + "default": false + }, + "capturedTrafficExternalLogging": { + "title": "Captured Traffic External Logging", + "description": "Specifies that the system captures a portion of the application traffic which can then be viewed on the System >> Logs >> Captured Transactions screen", + "type": "boolean", + "default": false + }, + "sessionCookieSecurity": { + "title": "Session Cookie Security", + "description": "Specify whether to secure session cookies", + "type": "string", + "enum": [ + "ssl-only", + "always-secure", + "never-secure" + ], + "default": "ssl-only" + }, + "sessionTimeoutMinutes": { + "title": "Session Timeout in Minutes", + "description": "The number of minutes of user non-activity ot allow before the system considers the session to be over", + "type": "integer", + "minimum": 5, + "maximum": 60, + "default": 5, + "multipleOf": 5 + }, + "externalLoggingPublisher": { + "$ref": "#/definitions/Pointer_Log_Publisher" + }, + "notificationBySyslog": { + "title": "Notification by syslog", + "description": "Specifies that the system sends notifications to the syslog", + "type": "boolean", + "default": false + }, + "notificationBySnmp": { + "title": "Notification by SNMP", + "description": "Specifies that the system sends notifications as SNMP traps", + "type": "boolean", + "default": false + }, + "notificationByEmail": { + "title": "Notification by Email", + "description": "Specifies that the system sends notifications by e-mail", + "type": "boolean", + "default": false + }, + "notificationEmailAddresses": { + "title": "E-mail Notification Recipients", + "description": "The e-mail addresses of a recipient to whom the system should send email notifications", + "type": "array", + "items": { + "title": "Email address", + "type": "string", + "format": "email" + }, + "uniqueItems": true + }, + "publishIruleStatistics": { + "title": "Publish iRule Statistics", + "description": "Specifies that the system collects and displays statistics according to the expressions written in an iRule", + "type": "boolean", + "default": false + }, + "urlsForStatCollection": { + "title": "URLs for Statistics Collection", + "description": "Specifies the requested URLs for collecting statistics", + "type": "array", + "items": { + "title": "URL", + "type": "string", + "f5PostProcess": { + "tag": "expand" + } + }, + "uniqueItems": true + }, + "countriesForStatCollection": { + "title": "Countries for Statistics Collection", + "description": "Specifies the countries for collecting statistics", + "type": "array", + "items": { + "$ref": "#/definitions/Enum_Country_Analytics" + } + }, + "subnetsForStatCollection": { + "title": "Subnets for Statistics Collection", + "description": "Specifies the requested subnets for collecting statistics", + "type": "array", + "items": { + "title": "Subnet", + "type": "string", + "format": "f5ip" + }, + "uniqueItems": true + } + }, + "dependencies": { + "urlsForStatCollection": { + "properties": { + "collectUrl": { + "const": true + } + } + }, + "countriesForStatCollection": { + "properties": { + "collectGeo": { + "const": true + } + } + }, + "subnetsForStatCollection": { + "properties": { + "collectSubnet": { + "const": true + } + } + } + }, + "required": [ + "class" + ], + "additionalProperties": false, + "f5PostProcess": { + "tag": "modules", + "data": [ + "avr" + ] + } + }, + "Analytics_TCP_Profile": { + "title": "Analytics TCP Profile", + "type": "object", + "description": "TCP Analytics profile with configurable options", + "properties": { + "class": { + "type": "string", + "const": "Analytics_TCP_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "collectCity": { + "title": "Collect City", + "description": "Specifies that the system saves the name of the city with which traffic was exchanged", + "type": "boolean", + "default": false + }, + "collectContinent": { + "title": "Collect Continent", + "description": "Specifies that the system saves the name of the continent with which traffic was exchanged", + "type": "boolean", + "default": true + }, + "collectCountry": { + "title": "Collect Country", + "description": "Specifies that the system saves the name of the country with which traffic was exchanged", + "type": "boolean", + "default": true + }, + "collectedByClientSide": { + "title": "Collected By Client Side", + "description": "Specifies that system collects statistics on the client side", + "type": "boolean", + "default": true + }, + "collectedByServerSide": { + "title": "Collected By Server Side", + "description": "Specifies that system collects statistics on the server side", + "type": "boolean", + "default": true + }, + "collectedStatsExternalLogging": { + "title": "Collected Statistics External Logging", + "description": "Specifies that statistics logs are stored on a remote server", + "type": "boolean", + "default": false + }, + "collectedStatsInternalLogging": { + "title": "Collected Statistics Internal Logging", + "description": "Specifies that statistics logs are stored in the system", + "type": "boolean", + "default": true + }, + "collectNexthop": { + "title": "Collect Next Hop Ethernet Address", + "description": "Specifies that the system saves the address to which the traffic is being routed", + "type": "boolean", + "default": false + }, + "collectPostCode": { + "title": "Collect Post Code", + "description": "Specifies that the system saves the name of the postcode with which traffic was exchanged", + "type": "boolean", + "default": false + }, + "collectRegion": { + "title": "Collect Region", + "description": "Specifies that the system saves the name of the region with which traffic was exchanged", + "type": "boolean", + "default": true + }, + "collectRemoteHostIp": { + "title": "Collect Remote Host IP", + "description": "Specifies that the system collects IP addresses with which traffic was exchanged", + "type": "boolean", + "default": false + }, + "collectRemoteHostSubnet": { + "title": "Collect Remote Host Subnet", + "description": "Specifies that the system saves the address of the subnet with which traffic was exchanged", + "type": "boolean", + "default": true + }, + "externalLoggingPublisher": { + "$ref": "#/definitions/Pointer_Log_Publisher" + } + }, + "required": [ + "class" + ], + "additionalProperties": false, + "f5PostProcess": { + "tag": "modules", + "data": [ + "avr" + ] + } + }, + "Basic_Auth": { + "title": "Basic Authentication", + "type": "object", + "description": "Describes the basic authentication to access a resource", + "properties": { + "method": { + "type": "string", + "description": "Specifies the authentication method", + "enum": [ + "basic" + ] + }, + "username": { + "description": "Specifies the user name for authentication", + "type": "string" + }, + "passphrase": { + "description": "Specifies the password for authentication", + "properties": { + "allowReuse": { + "type": "boolean", + "description": "If true, other declaration objects may reuse this value", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Property_Passphrase" + }, + { + "f5PostProcess": { + "data": "object", + "tag": "fetch" + } + } + ] + } + }, + "required": [ + "method", + "username", + "passphrase" + ], + "additionalProperties": false + }, + "Bearer_Token": { + "title": "Bearer Token Authorization", + "description": "Describes using a bearer token to access a resource", + "type": "object", + "properties": { + "method": { + "description": "Specifies the authentication method", + "type": "string", + "const": "bearer-token" + }, + "token": { + "description": "Specifies the bearer token", + "oneOf": [ + { + "type": "string", + "description": "plain text bearer token", + "minLength": 1 + }, + { + "type": "object", + "allOf": [ + { + "required": [ + "ciphertext" + ] + }, + { + "$ref": "#/definitions/Secret" + } + ] + } + ], + "f5PostProcess": { + "tag": "longSecret" + } + } + }, + "required": [ + "method", + "token" + ], + "additionalProperties": false + }, + "CA_Bundle": { + "title": "CA Bundle", + "description": "Bundle of one or more PKI Certificate-Authority certificates", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "CA_Bundle" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "bundle": { + "description": "Reference to a CA bundle or string of PEM encoded certificates", + "allOf": [ + { + "$ref": "#/definitions/Pointer_F5_String_Or_BIGIP" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "pki-cert" + } + }, + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys file ssl-cert" + ] + } + } + ] + } + }, + "additionalProperties": false, + "required": [ + "class", + "bundle" + ] + }, + "Capture_Filter": { + "title": "Capture Filter", + "description": "Criteria determining when the system captures a portion of the application traffic", + "type": "object", + "properties": { + "requestCapturedParts": { + "title": "Request Captured Parts", + "description": "Specifies which parts of the request data the system captures", + "type": "string", + "enum": [ + "all", + "body", + "headers", + "none" + ], + "default": "none" + }, + "responseCapturedParts": { + "title": "Response Captured Parts", + "description": "Specifies which parts of the response data the system captures", + "type": "string", + "enum": [ + "all", + "body", + "headers", + "none" + ], + "default": "none" + }, + "dosActivity": { + "title": "DoS Activity", + "description": "Specifies whether the system captures traffic data mitigated by the DoS Layer 7 Enforcer, or traffic regardless of DoS activity", + "type": "string", + "enum": [ + "any", + "mitigated-by-dosl7" + ], + "default": "any" + }, + "capturedProtocols": { + "title": "Captured Protocols", + "description": "Specifies whether the system captures traffic data that is sent using any protocol, or a specific type of protocol", + "type": "string", + "enum": [ + "all", + "http", + "https" + ], + "default": "all" + }, + "capturedReadyForJsInjection": { + "title": "Qualified for JavaScript Injection", + "description": "Specifies whether the system captures all traffic data from all transactions or only from transactions that qualify for JavaScript injection", + "type": "string", + "enum": [ + "disabled", + "enabled" + ], + "default": "disabled" + }, + "virtualServers": { + "title": "Virtual Servers", + "description": "Specifies whether the system captures traffic data sent from/to all virtual servers, or only from/to specific virtual servers. If none are specified then all will be collected", + "type": "array", + "items": { + "title": "Virtual Server", + "type": "string" + }, + "uniqueItems": true, + "default": [] + }, + "nodeAddresses": { + "title": "Node Addresses", + "description": "Specifies whether the system captures traffic data sent from/to all nodes, or only from/to specific nodes. If none are specified then all will be collected", + "type": "array", + "items": { + "type": "string" + }, + "uniqueItems": true, + "default": [] + }, + "responseCodes": { + "title": "Response Status Codes", + "description": "Specifies whether the system captures traffic data based on the HTTP response status codes that the requests return. If none are specified then all will be collected", + "type": "array", + "items": { + "title": "Response Status Code", + "type": "integer", + "minimum": 100, + "maximum": 999 + }, + "maxItems": 10, + "uniqueItems": true, + "default": [] + }, + "methods": { + "title": "HTTP Methods", + "description": "Specifies whether the system captures traffic data based on the HTTP method that was requested. If none are specified then all will be collected", + "type": "array", + "items": { + "title": "HTTP Method", + "type": "string" + }, + "maxItems": 10, + "uniqueItems": true, + "default": [] + }, + "urlFilterType": { + "title": "URL Filter Type", + "description": "Specifies how the URL path prefixes are interpreted", + "type": "string", + "enum": [ + "all", + "black-list", + "white-list" + ], + "default": "all" + }, + "urlPathPrefixes": { + "title": "URL Path Prefixes", + "description": "Specifies URLs the filter type is to be applied to. If none are specified then all will be collected", + "type": "array", + "items": { + "title": "URL", + "type": "string", + "f5PostProcess": { + "tag": "expand" + } + }, + "maxItems": 10, + "uniqueItems": true, + "default": [] + }, + "userAgentSubstrings": { + "title": "User Agent Substrings", + "description": "Specifies whether the system captures traffic sent from all browsers, or only traffic sent from a specific browser", + "type": "array", + "items": { + "title": "User Agent Substring", + "type": "string", + "f5PostProcess": { + "tag": "expand" + } + }, + "maxItems": 10, + "uniqueItems": true, + "default": [] + }, + "clientIps": { + "title": "Client IP Addresses", + "description": "Specifies the client IP addresses to collect stats for. If none are specified, then all will be collected", + "type": "array", + "items": { + "title": "Client IP Address", + "type": "string", + "format": "f5ip" + }, + "maxItems": 10, + "uniqueItems": true, + "default": [] + }, + "requestContentFilterSearchPart": { + "title": "Request Content Filter Search Part", + "description": "Specifies the part of the request that should be filtered by the search string", + "type": "string", + "enum": [ + "all", + "headers", + "body", + "none", + "uri" + ], + "default": "none" + }, + "requestContentFilterSearchString": { + "title": "Request Content Filter Search String", + "description": "Specifies the string the request should be searched for", + "type": "string" + }, + "responseContentFilterSearchPart": { + "title": "Response Content Filter Search Part", + "description": "Specifies the part of the response that should be filtered by the search string", + "type": "string", + "enum": [ + "all", + "body", + "headers", + "none" + ], + "default": "none" + }, + "responseContentFilterSearchString": { + "title": "Response Content Filter Search String", + "description": "Specifies the string the response should be searched for", + "type": "string" + } + }, + "dependencies": { + "requestContentFilterSearchString": { + "properties": { + "requestContentFilterSearchPart": { + "not": { + "const": "none" + } + } + } + }, + "responseContentFilterSearchString": { + "properties": { + "responseContentFilterSearchPart": { + "not": { + "const": "none" + } + } + } + } + } + }, + "Certificate": { + "title": "Certificate", + "description": "Configures a Certificate", + "type": "object", + "properties": { + "class": { + "type": "string", + "const": "Certificate" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "certificate": { + "title": "Certificate", + "description": "X.509 public-key certificate", + "allOf": [ + { + "$ref": "#/definitions/Pointer_F5_String_Or_BIGIP" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "pki-cert" + } + }, + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys file ssl-cert" + ] + } + } + ] + }, + "privateKey": { + "title": "Private Key", + "description": "Private key matching certificate's public key (optional)", + "allOf": [ + { + "$ref": "#/definitions/Pointer_F5_String_Or_BIGIP" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "pki-key" + } + }, + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys file ssl-key" + ] + } + } + ] + }, + "chainCA": { + "title": "CA chain", + "description": "Bundle of one or more CA certificates in trust-chain from root CA to certificate (optional)", + "type": [ + "object", + "string" + ], + "anyOf": [ + { + "$ref": "#/definitions/Pointer_F5_String_Or_BIGIP" + }, + { + "$ref": "#/definitions/Pointer_CA_Bundle" + } + ], + "allOf": [ + { + "f5PostProcess": { + "tag": "fetch", + "data": "pki-bundle" + } + }, + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys file ssl-cert" + ] + } + } + ] + }, + "passphrase": { + "title": "Passphrase", + "description": "If supplied, used to decrypt privateKey at runtime (optional)", + "properties": { + "allowReuse": { + "description": "If true, other declaration objects may reuse this value", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Property_Passphrase" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "object" + } + } + ], + "type": "object" + }, + "pkcs12": { + "title": "PKCS#12 certificate+key", + "description": "The pkcs12 value which may be a url to fetch the binary file from or base64 encoded string", + "allOf": [ + { + "$ref": "#/definitions/Pointer_F5_String_Or_BIGIP" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "pkcs12" + } + }, + { + "f5PostProcess": { + "tag": "certExtract" + } + } + ] + }, + "pkcs12Options": { + "title": "PKCS#12 certificate+key Options", + "description": "Options for importing PKCS12 file", + "type": "object", + "properties": { + "keyImportFormat": { + "title": "PKCS#12 Private Key Format", + "description": "Determines the format in which the private key is saved. Default is PKCS#8.", + "type": "string", + "enum": [ + "pkcs8", + "openssl-legacy" + ], + "default": "pkcs8" + }, + "ignoreChanges": { + "title": "Ignore changes", + "description": "Key has to be decrypted and re-encrypted as part of extraction, resulting in a diff. Set to true to exclude the pkcs12 object for subsequent deployments.", + "type": "boolean", + "default": false + }, + "internalOnly": { + "title": "BIG-IP AS3 internal use only", + "description": "BIG-IP AS3 uses this property internally. Any values supplied here will be ignored", + "type": "array", + "items": { + "type": [ + "string", + "number", + "boolean", + "object", + "array" + ] + }, + "readOnly": true + } + } + }, + "staplerOCSP": { + "title": "OCSP Stapler", + "description": "BIG-IP AS3 pointer to OCSP Stapler declaration (optional)", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Certificate_Validator_OCSP" + } + ] + }, + "issuerCertificate": { + "type": "object", + "description": "Specifies the name of the issuer certificate for this certificate", + "allOf": [ + { + "$ref": "#/definitions/Pointer_SSL_Certificate" + } + ] + } + }, + "required": [ + "class" + ], + "additionalProperties": false, + "dependencies": { + "staplerOCSP": { + "required": [ + "issuerCertificate" + ] + } + }, + "if": { + "required": [ + "pkcs12" + ] + }, + "then": { + "dependencies": { + "certificate": { + "not": {} + }, + "privateKey": { + "not": {} + } + } + }, + "else": { + "required": [ + "certificate" + ], + "not": { + "required": [ + "pkcs12" + ] + } + } + }, + "Certificate_Validator_OCSP": { + "title": "Certificate_Validator_OCSP", + "description": "OCSP validator for certificates", + "type": "object", + "properties": { + "class": { + "const": "Certificate_Validator_OCSP", + "title": "Class", + "type": "string" + }, + "dnsResolver": { + "allOf": [ + { + "$ref": "#/definitions/Pointer_DNS_Resolver" + } + ], + "description": "BIG-IP AS3 pointer to DNS resolver used to resolve hostnames in client requests", + "title": "DNS resolver" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "responderUrl": { + "description": "Specifies the absolute URL that overrides the OCSP responder URL obtained from the certificate's AIA extension(s). This should be a HTTP based URL.", + "minLength": 3, + "title": "Responder URL", + "type": "string" + }, + "signingCertificate": { + "allOf": [ + { + "$ref": "#/definitions/Pointer_SSL_Certificate" + } + ], + "description": "Specifies the certificate object to use for OCSP responders that require the request to be signed", + "title": "Request Signing Certificate Object" + }, + "signingHashAlgorithm": { + "default": "sha256", + "description": "Specifies a hash algorithm used to sign an OCSP request", + "enum": [ + "sha1", + "sha256" + ], + "title": "Request Signing Hash Algorithm", + "type": "string" + }, + "timeout": { + "default": 8, + "description": "Specifies the time interval (in seconds) that the BIG-IP waits for before ending the connection to the OCSP responder. The default value is 8", + "maximum": 300, + "minimum": 1, + "title": "Timeout", + "type": "integer" + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "Constants": { + "title": "Constants", + "description": "Named values for (re-)use by declaration objects", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Constants" + } + }, + "propertyNames": { + "maxLength": 64, + "pattern": "^[A-Za-z][0-9A-Za-z_]*$" + }, + "additionalProperties": { + "if": { + "required": [ + "protected", + "ciphertext" + ], + "type": "object" + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/JWE" + } + ], + "properties": { + "allowReuse": { + "default": true, + "description": "If true (default), cryptogram may be reused by different declaration objects, WHICH MAY POSE A SECURITY RISK!", + "title": "Allow reuse", + "type": "boolean" + } + } + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object" + ] + }, + "required": [ + "class" + ] + }, + "Controls": { + "title": "Controls", + "type": "object", + "description": "Optional controls configuration", + "properties": { + "archiveId": { + "description": "Read-only property present when you GET a declaration from configuration system. Archived versions of declaration are identified by a combination of 'id' and 'archiveId'", + "readOnly": true, + "title": "Archive ID", + "type": [ + "number", + "string" + ] + }, + "archiveTimestamp": { + "description": "Read-only property present when you GET a declaration from configuration system. Indicates when this version (see archiveId) of declaration was archived", + "format": "date-time", + "readOnly": true, + "title": "Archive timestamp", + "type": "string" + }, + "class": { + "title": "Class", + "type": "string", + "const": "Controls", + "default": "Controls" + }, + "dryRun": { + "default": false, + "description": "Boolean that indicates if this declaration will be run as a dry-run. If true, the declaration will NOT make any changes to the system, but will respond with whether or not it would.", + "title": "Dry-Run Option", + "type": "boolean" + }, + "fortune": { + "description": "If true, BIG-IP AS3 will activate Zoltar mode and read you your fortune", + "title": "Fortune", + "type": "boolean" + }, + "logLevel": { + "title": "Log level", + "description": "Controls the amount of detail in logs produced while configuring this Tenant (default is whole-declaration Controls/logLevel value)", + "type": "string", + "enum": [ + "emergency", + "alert", + "critical", + "error", + "warning", + "notice", + "info", + "debug" + ], + "default": "error" + }, + "trace": { + "default": false, + "description": "If true, BIG-IP AS3 creates a detailed trace of the configuration process for this Tenant for subsequent analysis (default is whole-declaration Controls/trace value). Warning: trace files may contain sensitive configuration data", + "title": "Trace", + "type": "boolean" + }, + "traceResponse": { + "title": "Trace Response", + "description": "If true, the response will contain the trace files", + "type": "boolean", + "default": false + }, + "userAgent": { + "title": "User Agent", + "description": "User Agent information to include in TEEM report", + "type": "string" + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "DNS_Logging_Profile": { + "title": "DNS Logging Profile", + "type": "object", + "description": "Configures a Domain Name System (DNS) logging profile", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "DNS_Logging_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "includeCompleteAnswer": { + "description": "Specifies whether the system logs the complete answer from the query", + "type": "boolean", + "default": true + }, + "includeQueryId": { + "description": "Specifies whether the system logs the ID of the query", + "type": "boolean", + "default": false + }, + "includeSource": { + "description": "Specifies whether the system logs the source (the BIG-IP system that receives the packet)", + "type": "boolean", + "default": true + }, + "includeTimestamp": { + "description": "Specifies whether the system logs the timestamp of when the query was created", + "type": "boolean", + "default": true + }, + "includeView": { + "description": "Specifies whether the system includes the view in the log", + "type": "boolean", + "default": true + }, + "logPublisher": { + "$ref": "#/definitions/Pointer_Log_Publisher" + }, + "logQueriesEnabled": { + "description": "Specifies whether the system logs queries", + "type": "boolean", + "default": true + }, + "logResponsesEnabled": { + "description": "Specifies whether the systems logs responses", + "type": "boolean", + "default": false + } + }, + "required": [ + "class", + "logPublisher" + ], + "additionalProperties": false + }, + "Enum_Country_Analytics": { + "title": "Enum values for Analytics_Profile", + "description": "Enum values for Analytics_Profile", + "type": "string", + "enum": [ + "Afghanistan", + "Aland Islands", + "Albania", + "Algeria", + "American Samoa", + "Andorra", + "Angola", + "Anguilla", + "Anonymous Proxy", + "Antarctica", + "Antigua and Barbuda", + "Argentina", + "Armenia", + "Aruba", + "Asia/Pacific Region", + "Australia", + "Austria", + "Azerbaijan", + "Bahamas", + "Bahrain", + "Bangladesh", + "Barbados", + "Belarus", + "Belgium", + "Belize", + "Benin", + "Bermuda", + "Bhutan", + "Bolivia", + "Bonaire, Saint Eustatius and Saba", + "Bosnia and Herzegovina", + "Botswana", + "Bouvet Island", + "Brazil", + "British Indian Ocean Territory", + "Brunei Darussalam", + "Bulgaria", + "Burkina Faso", + "Burundi", + "Cambodia", + "Cameroon", + "Canada", + "Cape Verde", + "Cayman Islands", + "Central African Republic", + "Chad", + "Chile", + "China", + "Christmas Island", + "Cocos (Keeling) Islands", + "Colombia", + "Comoros", + "Congo", + "Congo, The Democratic Republic of the", + "Cook Islands", + "Costa Rica", + "Cote D'Ivoire", + "Croatia", + "Cuba", + "Cyprus", + "Czech Republic", + "Denmark", + "Djibouti", + "Dominica", + "Dominican Republic", + "Ecuador", + "Egypt", + "El Salvador", + "Equatorial Guinea", + "Eritrea", + "Estonia", + "Ethiopia", + "Europe", + "Falkland Islands (Malvinas)", + "Faroe Islands", + "Fiji", + "Finland", + "France", + "France, Metropolitan", + "French Guiana", + "French Polynesia", + "French Southern Territories", + "Gabon", + "Gambia", + "Georgia", + "Germany", + "Ghana", + "Gibraltar", + "Greece", + "Greenland", + "Grenada", + "Guadeloupe", + "Guam", + "Guatemala", + "Guernsey", + "Guinea", + "Guinea-Bissau", + "Guyana", + "Haiti", + "Heard Island and McDonald Islands", + "Holy See (Vatican City State)", + "Honduras", + "Hong Kong", + "Hungary", + "Iceland", + "India", + "Indonesia", + "Iran, Islamic Republic of", + "Iraq", + "Ireland", + "Isle of Man", + "Israel", + "Italy", + "Jamaica", + "Japan", + "Jersey", + "Jordan", + "Kazakhstan", + "Kenya", + "Kiribati", + "Korea, Democratic People's Republic of", + "Korea, Republic of", + "Kuwait", + "Kyrgyzstan", + "Lao People's Democratic Republic", + "Latvia", + "Lebanon", + "Lesotho", + "Liberia", + "Libyan Arab Jamahiriya", + "Liechtenstein", + "Lithuania", + "Luxembourg", + "Macau", + "Macedonia", + "Madagascar", + "Malawi", + "Malaysia", + "Maldives", + "Mali", + "Malta", + "Marshall Islands", + "Martinique", + "Mauritania", + "Mauritius", + "Mayotte", + "Mexico", + "Micronesia, Federated States of", + "Moldova, Republic of", + "Monaco", + "Mongolia", + "Montenegro", + "Montserrat", + "Morocco", + "Mozambique", + "Myanmar", + "Namibia", + "Nauru", + "Nepal", + "Netherlands", + "Netherlands Antilles", + "New Caledonia", + "New Zealand", + "Nicaragua", + "Niger", + "Nigeria", + "Niue", + "Norfolk Island", + "Northern Mariana Islands", + "Norway", + "Oman", + "Other", + "Pakistan", + "Palau", + "Palestinian Territory", + "Panama", + "Papua New Guinea", + "Paraguay", + "Peru", + "Philippines", + "Pitcairn Islands", + "Poland", + "Portugal", + "Puerto Rico", + "Qatar", + "Reunion", + "Romania", + "Russian Federation", + "Rwanda", + "Saint Barthelemy", + "Saint Helena", + "Saint Kitts and Nevis", + "Saint Lucia", + "Saint Martin", + "Saint Pierre and Miquelon", + "Saint Vincent and the Grenadines", + "Samoa", + "San Marino", + "Sao Tome and Principe", + "Satellite Provider", + "Saudi Arabia", + "Senegal", + "Serbia", + "Seychelles", + "Sierra Leone", + "Singapore", + "Slovakia", + "Slovenia", + "Solomon Islands", + "Somalia", + "South Africa", + "South Georgia and the South Sandwich Islands", + "Spain", + "Sri Lanka", + "Sudan", + "Suriname", + "Svalbard and Jan Mayen", + "Swaziland", + "Sweden", + "Switzerland", + "Syrian Arab Republic", + "Taiwan", + "Tajikistan", + "Tanzania, United Republic of", + "Thailand", + "Timor-Leste", + "Togo", + "Tokelau", + "Tonga", + "Trinidad and Tobago", + "Tunisia", + "Turkey", + "Turkmenistan", + "Turks and Caicos Islands", + "Tuvalu", + "Uganda", + "Ukraine", + "United Arab Emirates", + "United Kingdom", + "United States", + "United States Minor Outlying Islands", + "Unknown", + "Uruguay", + "Uzbekistan", + "Vanuatu", + "Venezuela", + "Vietnam", + "Virgin Islands, British", + "Virgin Islands, U.S.", + "Wallis and Futuna", + "Western Sahara", + "Yemen", + "Zambia", + "Zimbabwe" + ] + }, + "F5_String": { + "title": "Common definition for ways to define a value that needs to be resolved", + "description": "The value can be either a string, text property, base64 property, url property, etc.", + "oneOf": [ + { + "type": "string" + }, + { + "type": "object", + "properties": { + "text": { + "$ref": "#/definitions/Property_Text" + }, + "base64": { + "$ref": "#/definitions/Property_Base64" + }, + "url": { + "$ref": "#/definitions/Resource_URL" + }, + "copyFrom": { + "$ref": "#/definitions/Pointer_Copy_From" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1 + } + ] + }, + "HTTP_Acceleration_Profile": { + "title": "HTTP acceleration profile", + "type": "object", + "description": "HTTP acceleration profile with configurable options", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "HTTP_Acceleration_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "agingRate": { + "description": "Rate at which a cache entry ages", + "type": "integer", + "minimum": 0, + "maximum": 10, + "default": 9 + }, + "cacheSize": { + "description": "The maximum size (in megabytes) for the cache.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 100 + }, + "ignoreHeaders": { + "description": "Which cache disabling headers will be ignored by the system", + "type": "string", + "enum": [ + "none", + "max-age", + "all" + ], + "default": "all" + }, + "insertAgeHeaderEnabled": { + "description": "Age and date headers are inserted into the response when enabled", + "type": "boolean", + "default": true + }, + "maximumAge": { + "description": "How long the system will consider the cached content will be valid", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 3600 + }, + "maximumEntries": { + "description": "The maximum number of entries that can reside in the cache", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 10000 + }, + "maximumObjectSize": { + "description": "The largest object that the system will cache", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 50000 + }, + "metadataMaxSize": { + "default": 25, + "description": "The maximum size of the metadata cache", + "maximum": 4294967295, + "minimum": 0, + "type": "integer" + }, + "minimumObjectSize": { + "description": "The smallest object that the system will cache", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 500 + }, + "parentProfile": { + "allOf": [ + { + "$ref": "#/definitions/Pointer_HTTP_Acceleration_Profile" + } + ], + "default": { + "bigip": "/Common/webacceleration" + }, + "description": "The profile that this profile inherits values from" + }, + "uriExcludeList": { + "description": "A list of URIs that will be excluded from the cache", + "type": "array", + "items": { + "type": "string", + "minLength": 1 + }, + "uniqueItems": true + }, + "uriIncludeList": { + "description": "A list of URIs that will be cacheable", + "type": "array", + "items": { + "type": "string", + "minLength": 1 + }, + "uniqueItems": true + }, + "uriIncludeOverrideList": { + "description": "A list of URIs that should be cached even though they may normally not be due to existing constraints", + "type": "array", + "items": { + "type": "string", + "minLength": 1 + }, + "uniqueItems": true + }, + "uriPinnedList": { + "description": "A list of URIs that are kept in the cache regardless of maxAge or expiry settings", + "type": "array", + "items": { + "type": "string", + "minLength": 1 + }, + "uniqueItems": true + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "HTTP_Compress": { + "title": "HTTP Compression profile", + "type": "object", + "description": "HTTP Compression profile with configurable options", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "HTTP_Compress" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "allowHTTP10": { + "description": "Specifies whether to forward HTTP 1.0 requests/responses (default false)", + "type": "boolean", + "default": false + }, + "bufferSize": { + "title": "Buffer size", + "description": "Maximum number of response octets to buffer before deciding whether to apply compression (default 4096)", + "type": "integer", + "minimum": 256, + "maximum": 4294967295, + "default": 4096 + }, + "contentTypeExcludes": { + "title": "Content-Type exclude list", + "description": "List of response Content-Type values which BIG-IP AS3 should not compress. Values are regular expressions that match Content-Type strings", + "type": "array", + "items": { + "type": "string", + "pattern": "^[^\\x00-\\x1f\\x22\\x7f-\\xff]+$" + }, + "uniqueItems": true + }, + "contentTypeIncludes": { + "title": "Content-Type include list", + "description": "List of response Content-Type values which BIG-IP AS3 should compress. Values are regular expressions that match Content-Type strings", + "type": "array", + "items": { + "type": "string", + "pattern": "^[^\\x00-\\x1f\\x22\\x7f-\\xff]+$" + }, + "uniqueItems": true, + "default": [ + "text/", + "application/(xml|x-javascript)" + ] + }, + "cpuSaver": { + "default": true, + "description": "If true (default), system will reduce compression rate when CPU utilization exceeds cpuSaverHigh threshold and increase it when CPU utilization falls below cpuSaverLow threshold", + "title": "CPU saver", + "type": "boolean" + }, + "cpuSaverHigh": { + "default": 90, + "description": "CPU utilization percentage (default 90) above which BIG-IP AS3 should moderate compression", + "maximum": 99, + "minimum": 15, + "title": "CPU-saver %high", + "type": "integer" + }, + "cpuSaverLow": { + "default": 75, + "description": "CPU utilization percentage (default 75) below which the system returns compression to normal", + "maximum": 95, + "minimum": 10, + "title": "CPU-saver %low", + "type": "integer" + }, + "gzipLevel": { + "title": "GZIP level", + "description": "Compression level (default 1); higher values produce greater compression but use more CPU cycles", + "type": "integer", + "minimum": 1, + "maximum": 9, + "default": 1 + }, + "gzipMemory": { + "title": "GZIP memory level", + "description": "Compression memory allocation in kilobytes (default 8), should be a power of two", + "type": "integer", + "minimum": 1, + "maximum": 256, + "default": 8 + }, + "gzipWindowSize": { + "title": "GZIP window size", + "description": "Compression window size in kilobytes (default 16), should be a power of two", + "type": "integer", + "minimum": 1, + "maximum": 128, + "default": 16 + }, + "keepAcceptEncoding": { + "title": "Keep Accept-Encoding header", + "description": "Specifies that the system does not remove the Accept-Encoding header from an HTTP request (default false)", + "type": "boolean", + "default": false + }, + "minimumSize": { + "default": 1024, + "description": "BIG-IP AS3 will not compress responses of fewer octets than this (default 1024)", + "maximum": 131072, + "minimum": 128, + "title": "Minimum size to compress", + "type": "integer" + }, + "preferMethod": { + "default": "gzip", + "description": "Select preferred compression method (default gzip, strongly recommended)", + "enum": [ + "gzip", + "deflate" + ], + "title": "Prefer method", + "type": "string" + }, + "selective": { + "default": false, + "description": "If true, BIG-IP AS3 will only compress a response when an iRule attached to the virtual server requests it (default is false, meaning BIG-IP AS3 will compress responses which meet the criteria in this profile)", + "title": "Selective mode", + "type": "boolean" + }, + "uriExcludes": { + "title": "URI exclude list", + "description": "List of request URI's for which BIG-IP AS3 should not compress responses. Values are regular expressions that match request URI strings", + "type": "array", + "items": { + "type": "string", + "pattern": "^[^\\x00-\\x1f\\x7f-\\xff]+$" + }, + "uniqueItems": true + }, + "uriIncludes": { + "title": "URI include list", + "description": "List of request URI's for which BIG-IP AS3 should compress responses. Values are regular expressions that match URI strings", + "type": "array", + "items": { + "type": "string", + "pattern": "^[^\\x00-\\x1f\\x7f-\\xff]+$" + }, + "uniqueItems": true + }, + "varyHeader": { + "default": true, + "description": "If true (default), a Vary header will appear in compressed responses", + "title": "Vary header", + "type": "boolean" + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "HTTP_Profile": { + "title": "HTTP profile", + "type": "object", + "description": "HTTP profile with configurable options", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "HTTP_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "allowBlankSpaceAfterHeaderName": { + "default": false, + "description": "Specifies whether to allow blank space in an HTTP header between the header name and the separator colon in an HTTP request or response. Requires TMOS version 16.1 or newer.", + "title": "Allow Blank Space After Header Name", + "type": "boolean" + }, + "allowedResponseHeaders": { + "description": "By default BIG-IP AS3 passes HTTP headers in responses from pool members to clients unaltered. You may list names of allowed response headers here and BIG-IP AS3 removes any you do not list from responses.", + "items": { + "maxLength": 128, + "minLength": 1, + "pattern": "^[^\\x00-\\x20\\x22:\\x5c\\x7f-\\xff]+$", + "title": "Allowed header", + "type": "string" + }, + "title": "Allow response headers", + "type": "array", + "uniqueItems": true + }, + "cookiePassphrase": { + "title": "Cookie encryption passphrase", + "description": "Used to create secret key for cookie encryption (when missing, BIG-IP AS3 uses a system-generated key)", + "properties": { + "allowReuse": { + "description": "If true, other declaration objects may reuse this value", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Property_Passphrase" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "object" + } + } + ], + "type": "object" + }, + "encryptCookies": { + "title": "Encrypt cookies", + "description": "List cookies to encrypt en-route to the client and decrypt en-route to a pool member", + "type": "array", + "items": { + "title": "Cookie name", + "type": "string", + "pattern": "^[^\\x00-\\x20\\x22=\\x5c\\x7f-\\xff]+$" + }, + "uniqueItems": true + }, + "enforceRFCCompliance": { + "default": false, + "description": "BIG-IP LTM performs basic RFC compliance checks as described in the latest RFC for the HTTP protocol. If a client request fails these checks, then the connection is reset. Requires TMOS version 15.0 or newer.", + "title": "Enforce RFC Compliance", + "type": "boolean" + }, + "fallbackRedirect": { + "title": "Fallback Redirect", + "description": "Domain name (or IP address) of service (if any) to which BIG-IP AS3 should redirect a request when no pool member is responsive or selected pool member returns a fallbackStatusCode", + "type": "string", + "minLength": 1, + "anyOf": [ + { + "format": "uri" + }, + { + "format": "f5ip" + } + ] + }, + "fallbackStatusCodes": { + "description": "When a pool member responds to a request with one of these HTTP status codes (for example, 500), redirect the client to the fallbackRedirect", + "items": { + "maximum": 999, + "minimum": 100, + "title": "Status code", + "type": "integer" + }, + "title": "Fallback status codes", + "type": "array", + "uniqueItems": true + }, + "hstsIncludeSubdomains": { + "default": true, + "description": "If true then HSTS headers (see hstsInsert) will tell clients to apply HSTS settings to the hostnames of this service and all their possible subdomains. Warning: an incorrect value here can make multiple websites unreachable, not just this service", + "title": "Include subdomains in HSTS", + "type": "boolean" + }, + "hstsInsert": { + "default": false, + "description": "If true, insert HSTS (HTTP Strict Transport Security) headers into responses sent to clients (default false). Warning: misconfiguration of HSTS can make a website unreachable", + "title": "Insert HSTS headers", + "type": "boolean" + }, + "hstsPeriod": { + "default": 7862400, + "description": "If hstsInsert is true, this value tells each client how long (in seconds; default 7862400 equals 91 days) to wait before refreshing HSTS settings for this service. Warning: once a client receives erroneous HSTS settings it will ignore any attempt to correct them until this period has expired", + "maximum": 4294967295, + "minimum": 0, + "title": "Period of HSTS", + "type": "integer" + }, + "hstsPreload": { + "default": false, + "description": "If true, include the domain for the web site associated with this HTTP profile in the browser's preload list. This forces the client to send packets over SSL/TLS.", + "title": "Include domain in preload list", + "type": "boolean" + }, + "requestChunking": { + "title": "Request chunking", + "description": "Controls handling of HTTP payload chunking in requests from clients (default is 'preserve'). Note: 'selective' and 'preserve' will be translated to 'sustain' when TMOS version is 15.0 or newer", + "type": "string", + "enum": [ + "selective", + "preserve", + "rechunk" + ], + "default": "preserve" + }, + "responseChunking": { + "title": "Response chunking", + "description": "Controls handling of HTTP payload chunking in responses from pool members (default 'selective' adapts to most situations). Note: 'selective' and 'preserve' will be translated to 'sustain' when TMOS version is 15.0 or newer", + "type": "string", + "enum": [ + "selective", + "preserve", + "unchunk", + "rechunk" + ], + "default": "selective" + }, + "rewriteRedirects": { + "title": "Rewrite redirects", + "description": "In selected Location-header values (default none) of redirect responses from pool members, change protocol HTTP to HTTPS before passing redirects to clients", + "type": "string", + "enum": [ + "none", + "all", + "matching", + "addresses" + ], + "default": "none" + }, + "insertHeader": { + "title": "Insert header", + "description": "You may insert one header into each request before BIG-IP AS3 sends it to a pool member. The header value may be a simple string or the result of an iRules TCL expression (for example, [IP::client_addr]). This is the most efficient way to insert a single header; to insert multiple headers use an iRule or an Endpoint policy", + "type": "object", + "properties": { + "name": { + "title": "Header name", + "description": "Name of the HTTP header to insert", + "type": "string", + "pattern": "^[^\\x00-\\x20\\x22:\\x5c\\x7f-\\xff]+$", + "minLength": 1, + "maxLength": 128 + }, + "value": { + "title": "Header value", + "description": "Value of the HTTP header to insert", + "type": "string", + "pattern": "^[^\\x00-\\x1f\\x7f-\\xff]*$" + } + }, + "additionalProperties": false + }, + "knownMethods": { + "title": "Known methods", + "description": "List of HTTP request methods BIG-IP AS3 should recognize as normal. Any method not in this list will provoke the 'unknownMethodAction' action", + "type": "array", + "items": { + "title": "HTTP method", + "type": "string", + "pattern": "^[A-Z0-9]+$", + "minLength": 1, + "maxLength": 32 + }, + "uniqueItems": true, + "default": [ + "CONNECT", + "DELETE", + "GET", + "HEAD", + "LOCK", + "OPTIONS", + "POST", + "PROPFIND", + "PUT", + "TRACE", + "UNLOCK" + ] + }, + "maxRequests": { + "title": "Maximum requests per connection", + "description": "When BIG-IP AS3 has processed more than this number of requests through a connection, the system closes it. Default 0 means permit unlimited requests", + "type": "integer", + "minimum": 0, + "maximum": 2147483647, + "default": 0 + }, + "multiplexTransformations": { + "title": "Multiplex transformations", + "description": "If true (default), BIG-IP AS3 adjusts request headers to work properly when the virtual server uses a Multiplex profile", + "type": "boolean", + "default": true + }, + "otherXFF": { + "title": "Other XFF headers", + "description": "Names of request headers to treat as equivalent to X-Forwarded-For (see trustXFF)", + "type": "array", + "items": { + "title": "Header name", + "type": "string", + "minLength": 1, + "maxLength": 128, + "pattern": "^[^\\x00-\\x20\\x22:\\x5c\\x7f-\\xff]+$" + }, + "uniqueItems": true + }, + "pipelineAction": { + "default": "allow", + "description": "Default 'allow' means clients may pipeline HTTP/1.1 requests to pool members which support pipelining. Otherwise, 'reject' prevents pipelining, and 'pass-through' causes the connection to switch to pass-through mode when the system detects pipelining", + "enum": [ + "allow", + "reject", + "pass-through" + ], + "title": "Pipeline action", + "type": "string" + }, + "profileWebSocket": { + "description": "Deprecated. Specifies the WebSocket profile that will be used on Services alongside this HTTP profile. When the 'profileWebSocket' property is used on a Service, it will supersede this property.", + "allOf": [ + { + "$ref": "#/definitions/Pointer_WebSocket_Profile" + } + ] + }, + "proxyConnectEnabled": { + "default": false, + "description": "Determines if a proxy connection profile will be created", + "title": "Proxy connection enabled", + "type": "boolean" + }, + "proxyType": { + "default": "reverse", + "description": "Default value 'reverse' is usually appropriate. You may use 'transparent' when virtual server will handle a mix of HTTP and non-HTTP traffic. You may use 'explicit' when clients will ask ADC to proxy connections to arbitrary remote services", + "enum": [ + "reverse", + "transparent", + "explicit" + ], + "title": "Proxy type", + "type": "string" + }, + "whiteOutHeader": { + "title": "White-out header", + "description": "You may name one request header you want whited-out of each request before BIG-IP AS3 sends it to a pool member. To remove more than a single named header, use an iRule or an Endpoint policy. (Whiting-out a header leaves its name but replaces its value in the request with space characters (ASCII 0x20) to avoid changing the length of the headers.)", + "type": "string", + "pattern": "^[^\\x00-\\x20\\x22:\\x5c\\x7f-\\xff]+$", + "minLength": 1, + "maxLength": 128 + }, + "xForwardedFor": { + "title": "Insert X-Forwarded-For", + "description": "If true, insert an X-Forwarded-For header carrying the client IP address into each HTTP request sent to a pool member (default true)", + "type": "boolean", + "default": true + }, + "serverHeaderValue": { + "title": "Server header value", + "description": "Server header value to place in responses generated by the ADC itself (not obtained from a pool member)", + "type": "string", + "default": "BigIP" + }, + "trustXFF": { + "default": false, + "description": "If true, WAF (ASM) and AVR may trust X-Forwarded-For headers found in incoming requests and report statistics using client IP addresses appearing in them (default false). Use this feature only when you control upstream gateway(s)", + "title": "Trust X-Forwarded-For", + "type": "boolean" + }, + "unknownMethodAction": { + "default": "allow", + "description": "Default 'allow' means clients may make HTTP requests using unknown methods. Otherwise, 'reject' means to discard any unknown-method request and reject the client connection, and 'pass-through' causes the connection to switch to pass-through mode upon the first unknown-method request", + "enum": [ + "allow", + "reject", + "pass-through" + ], + "title": "Unknown method action", + "type": "string" + }, + "viaHost": { + "anyOf": [ + { + "format": "hostname" + }, + { + "format": "f5ip" + } + ], + "description": "Hostname to place in Via header when viaRequest or viaResponse is 'append'", + "minLength": 1, + "title": "Via hostname", + "type": "string" + }, + "viaRequest": { + "default": "remove", + "description": "Controls treatment of Via: headers in requests from clients. When set to 'append' BIG-IP AS3 requires viaHost", + "enum": [ + "append", + "preserve", + "remove" + ], + "title": "Via request control", + "type": "string" + }, + "viaResponse": { + "default": "remove", + "description": "Controls treatment of Via: headers in responses from pool members. When set to 'append' BIG-IP AS3 requires viaHost", + "enum": [ + "append", + "preserve", + "remove" + ], + "title": "Via response control", + "type": "string" + }, + "webSocketMasking": { + "default": "unmask", + "description": "Deprecated. WebSocket stream data is always masked from client to ADC and from ADC to server. Default value 'unmask' makes stream data passing through visible to ADC security policy and/or iRules attached to the service. 'selective' unmasks stream data only when a security policy is attached. 'preserve' passes data through masked (unreadable by security policy). 'remask' causes different masking keys to be used on client and server sides. When specified the property 'profileWebSocket' supersedes this property.", + "enum": [ + "preserve", + "remask", + "selective", + "unmask" + ], + "title": "WebSocket masking", + "type": "string" + }, + "webSocketsEnabled": { + "default": false, + "description": "Deprecated. When true, allow clients to initiate WebSocket connections (default false). When specified the property 'profileWebSocket' supersedes this property.", + "title": "WebSockets Enabled", + "type": "boolean" + } + }, + "required": [ + "class" + ], + "dependencies": { + "cookiePassphrase": { + "required": [ + "encryptCookies" + ] + }, + "fallbackStatusCodes": { + "required": [ + "fallbackRedirect" + ] + }, + "proxyType": { + "else": { + "if": { + "properties": { + "proxyType": { + "not": { + "const": "explicit" + } + } + } + }, + "then": { + "not": { + "anyOf": [ + { + "required": [ + "resolver" + ] + }, + { + "required": [ + "doNotProxyHosts" + ] + }, + { + "required": [ + "tunnelName" + ] + }, + { + "required": [ + "defaultConnectAction" + ] + }, + { + "required": [ + "routeDomain" + ] + }, + { + "required": [ + "connectErrorMessage" + ] + }, + { + "required": [ + "dnsErrorMessage" + ] + }, + { + "required": [ + "badRequestMessage" + ] + }, + { + "required": [ + "badResponseMessage" + ] + }, + { + "required": [ + "ipv6" + ] + } + ] + } + } + }, + "if": { + "properties": { + "proxyType": { + "not": { + "const": "transparent" + } + } + } + }, + "then": { + "not": { + "anyOf": [ + { + "required": [ + "excessClientHeaders" + ] + }, + { + "required": [ + "excessServerHeaders" + ] + }, + { + "required": [ + "oversizeClientHeaders" + ] + }, + { + "required": [ + "oversizeServerHeaders" + ] + } + ] + } + } + }, + "viaRequest": { + "if": { + "properties": { + "viaRequest": { + "const": "append" + } + } + }, + "then": { + "required": [ + "viaHost" + ] + } + }, + "viaResponse": { + "if": { + "properties": { + "viaResponse": { + "const": "append" + } + } + }, + "then": { + "required": [ + "viaHost" + ] + } + } + }, + "if": { + "properties": { + "proxyType": { + "const": "reverse" + } + } + }, + "then": { + "$ref": "#/definitions/HTTP_Profile_Reverse" + }, + "else": { + "if": { + "properties": { + "proxyType": { + "const": "transparent" + } + } + }, + "then": { + "$ref": "#/definitions/HTTP_Profile_Transparent" + }, + "else": { + "if": { + "properties": { + "proxyType": { + "const": "explicit" + } + } + }, + "then": { + "$ref": "#/definitions/HTTP_Profile_Explicit" + } + } + } + }, + "HTTP_Profile_Explicit": { + "title": "HTTP Profile Explicit", + "type": "object", + "description": "Extra HTTP profile configurable options when proxyType is 'explicit'", + "properties": { + "maxHeaderCount": { + "title": "Maximum header count", + "description": "When the number of headers in an incoming HTTP request exceeds this value, discard the request and reset the client connection", + "type": "integer", + "minimum": 1, + "maximum": 1024, + "default": 64 + }, + "maxHeaderSize": { + "title": "Maximum header size", + "description": "When the total size in octets of the headers of an incoming HTTP request exceeds this value, discard the request and reset the client connection", + "type": "integer", + "minimum": 9, + "maximum": 262144, + "default": 32768 + }, + "truncatedRedirects": { + "title": "Truncated redirects", + "description": "If false (default) elide malformed redirects from pool members, otherwise pass them to client", + "type": "boolean", + "default": false + }, + "resolver": { + "title": "DNS resolver", + "description": "BIG-IP AS3 pointer to DNS resolver used to resolve hostnames in client requests", + "type": "object", + "properties": { + "bigip": { + "title": "BIG-IP resolver", + "description": "Pathname of existing BIG-IP net DNS resolver", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "required": [ + "bigip" + ], + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query net dns-resolver" + ] + } + }, + "doNotProxyHosts": { + "title": "Do-not-proxy hosts", + "description": "When a client makes a (proxy-type) request to some host on this list, that request will simply be load-balanced to a pool member (without DNS resolution). This is ineffective for HTTPS requests", + "type": "array", + "items": { + "title": "host", + "type": "string", + "anyOf": [ + { + "format": "hostname" + }, + { + "format": "f5ip" + } + ] + }, + "default": [ + "none" + ], + "uniqueItems": true + }, + "tunnelName": { + "title": "Tunnel name", + "description": "Name of tunnel used for outbound CONNECT requests (default 'http-tunnel')", + "type": "string", + "minLength": 1, + "maxLength": 63, + "default": "http-tunnel", + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query net tunnels tunnel" + ] + } + }, + "defaultConnectAction": { + "title": "Default CONNECT action", + "description": "By default (value 'deny') the system refuses CONNECT requests from clients except when there is a virtual server listening to the tunnelName tunnel to accept and process them (typically to authorize and/or intercept outbound TLS connections). Value 'allow' will let clients CONNECT to arbitrary remote services", + "type": "string", + "enum": [ + "deny", + "allow" + ], + "default": "deny" + }, + "routeDomain": { + "title": "Exit route domain", + "description": "Proxy requests will leave the ADC from a Self IP in this route domain (default 0)", + "oneOf": [ + { + "type": "integer", + "minimum": 0, + "maximum": 65535 + }, + { + "type": "string" + } + ], + "default": 0, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query net route-domain" + ] + } + }, + "connectErrorMessage": { + "title": "Connect-error message", + "description": "Message returned to client when the system cannot establish a proxy connection. May include iRules TCL expressions", + "type": "string", + "maxLength": 65279, + "default": "Connection Error

Unable to connect to host in proxy request

" + }, + "dnsErrorMessage": { + "title": "DNS-error message", + "description": "Message returned to the client when the system cannot resolve the hostname in the request. May include iRules TCL expressions", + "type": "string", + "maxLength": 65279, + "default": "DNS Resolution Error

Cannot resolve hostname in proxy request

" + }, + "badRequestMessage": { + "title": "Bad-request message", + "description": "Message returned to client when proxy request is erroneous. May include iRules TCL expressions", + "type": "string", + "maxLength": 65279, + "default": "Bad Request

Invalid proxy request

" + }, + "badResponseMessage": { + "title": "Bad-response message", + "description": "Message returned to client when response to proxy request is erroneous. May include iRules TCL expressions", + "type": "string", + "maxLength": 65279, + "default": "Bad Response

Proxy request provoked invalid response

" + }, + "ipv6": { + "title": "IPv6 first priority", + "description": "Specifies the relative order of IPv4 and IPv6 DNS resolutions for URIs. If false (default), then the system performs IPv4 lookup before IPv6.", + "type": "boolean", + "default": false + } + } + }, + "HTTP_Profile_Reverse": { + "title": "HTTP Profile Reverse", + "type": "object", + "description": "Extra HTTP profile configurable options when proxyType is 'reverse'", + "properties": { + "maxHeaderCount": { + "title": "Maximum header count", + "description": "When the number of headers in an incoming HTTP request exceeds this value, discard the request and reset the client connection", + "type": "integer", + "minimum": 1, + "maximum": 1024, + "default": 64 + }, + "maxHeaderSize": { + "title": "Maximum header size", + "description": "When the total size in octets of the headers of an incoming HTTP request exceeds this value, discard the request and reset the client connection", + "type": "integer", + "minimum": 9, + "maximum": 262144, + "default": 32768 + }, + "truncatedRedirects": { + "title": "Truncated redirects", + "description": "If false (default) elide malformed redirects from pool members, otherwise pass them to client", + "type": "boolean", + "default": false + } + } + }, + "HTTP_Profile_Transparent": { + "title": "HTTP Profile Transparent", + "type": "object", + "description": "Extra HTTP profile configurable options when proxyType is 'transparent'", + "properties": { + "maxHeaderCount": { + "title": "Maximum header count", + "description": "When the number of headers in a request or response exceeds this value (default 32), take the excessX...Headers action", + "type": "integer", + "minimum": 1, + "maximum": 1024, + "default": 32 + }, + "maxHeaderSize": { + "title": "Maximum header size", + "description": "When the total size in octets of the headers of request or response exceeds this value (default 16384), take the oversizeX...Headers action", + "type": "integer", + "minimum": 9, + "maximum": 262144, + "default": 16384 + }, + "excessClientHeaders": { + "title": "Excess client headers action", + "description": "When a client request violates maxHeaderCount, either switch to pass-through mode (default) or reject the connection", + "type": "string", + "enum": [ + "pass-through", + "reject" + ], + "default": "pass-through" + }, + "excessServerHeaders": { + "title": "Excess server headers action", + "description": "When a pool member response violates maxHeaderCount, either switch to pass-through mode (default) or reject the connection", + "type": "string", + "enum": [ + "pass-through", + "reject" + ], + "default": "pass-through" + }, + "oversizeClientHeaders": { + "title": "Oversize client headers action", + "description": "When a client request violates maxHeaderSize, either switch to pass-through mode (default) or reject the connection", + "type": "string", + "enum": [ + "pass-through", + "reject" + ], + "default": "pass-through" + }, + "oversizeServerHeaders": { + "title": "Oversize server headers action", + "description": "When a pool member response violates maxHeaderSize, either switch to pass-through mode (default) or reject the connection", + "type": "string", + "enum": [ + "pass-through", + "reject" + ], + "default": "pass-through" + }, + "truncatedRedirects": { + "title": "Truncated redirects", + "description": "If true (default) pass malformed redirects to client", + "type": "boolean", + "default": true + } + } + }, + "HTTP2_Profile": { + "title": "HTTP2 profile", + "type": "object", + "description": "Profile to enable HTTP2", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "HTTP2_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "activationMode": { + "title": "Activation Mode", + "description": "This setting specifies the condition that will cause the BIG-IP system to handle an incoming connection as an HTTP/2 connection.", + "type": "string", + "enum": [ + "alpn", + "always" + ], + "default": "alpn" + }, + "concurrentStreamsPerConnection": { + "title": "Concurrent streams per connection", + "description": "The number of concurrent connections to allow on a single HTTP/2 connection.", + "type": "integer", + "minimum": 1, + "maximum": 256, + "default": 10 + }, + "connectionIdleTimeout": { + "title": "Connection idle timeout", + "description": "The number of seconds that a HTTP/2 connection is left open idly before it is closed.", + "type": "integer", + "minimum": 1, + "maximum": 4294967295, + "default": 300 + }, + "enforceTlsRequirements": { + "title": "Enforce TLS requirements", + "description": "Enable or disable enforcement of TLS requirements.", + "type": "boolean", + "default": true + }, + "frameSize": { + "title": "Frame size", + "type": "integer", + "default": 2048, + "description": "The size of the data frames, in bytes, that the HTTP/2 protocol sends to the client.", + "maximum": 16384, + "minimum": 1024 + }, + "headerTableSize": { + "title": "Header table size", + "type": "integer", + "default": 4096, + "description": "The size of the header table, in KB, for the HTTP headers that the HTTP/2 protocol compresses to save bandwidth.", + "maximum": 65535, + "minimum": 0 + }, + "includeContentLength": { + "title": "Include content length", + "type": "boolean", + "default": false, + "description": "Enable to include content-length in HTTP/2 headers." + }, + "insertHeader": { + "title": "Insert header", + "description": "This setting specifies whether the BIG-IP system should add an HTTP header to the HTTP request to show that the request was received over HTTP/2.", + "type": "boolean", + "default": false + }, + "insertHeaderName": { + "title": "Insert header name", + "description": "This setting specifies the name of the header that the BIG-IP system will add to the HTTP request when the Insert Header is enabled.", + "type": "string", + "default": "X-HTTP2" + }, + "receiveWindow": { + "title": "Receive window", + "type": "integer", + "default": 32, + "description": "The flow-control size for upload streams, in KB.", + "maximum": 128, + "minimum": 16 + }, + "writeSize": { + "title": "Write size", + "type": "integer", + "default": 16384, + "description": "The total size of combined data frames, in bytes, that the HTTP/2 protocol sends in a single write function.", + "maximum": 32768, + "minimum": 2048 + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "IRule": { + "title": "iRule", + "type": "object", + "description": "iRule definition with configurable options", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "iRule" + }, + "expand": { + "title": "Expand", + "description": "If true (default), expand backquoted variables in iRule", + "type": "boolean", + "default": true + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "iRule": { + "$ref": "#/definitions/IRule_Core" + } + }, + "required": [ + "class", + "iRule" + ], + "additionalProperties": false + }, + "IRule_Core": { + "title": "iRule Core definition", + "description": "Reference to an iRule or text of an iRule", + "allOf": [ + { + "$ref": "#/definitions/F5_String" + }, + { + "f5PostProcess": { + "tag": "expand", + "data": { + "when": "1/expand" + } + } + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "string" + } + } + ] + }, + "JWE": { + "title": "JWE cryptogram", + "description": "A value in a cryptogram which is a Flattened JWE JSON Serialization object. If 'miniJWE' is true then enc=(none|f5sv) only (in JOSE header)", + "type": "object", + "properties": { + "ciphertext": { + "title": "Ciphertext", + "description": "Put base64url(data_value) here", + "type": "string", + "minLength": 2, + "allOf": [ + { + "$ref": "#/definitions/Resource_Base64" + } + ] + }, + "ignoreChanges": { + "title": "Ignore changes", + "description": "If false (default), the system updates the ciphertext in every BIG-IP AS3 declaration deployment. If true, BIG-IP AS3 creates the ciphertext on first deployment, and leaves it untouched afterwards", + "type": "boolean", + "default": false + }, + "miniJWE": { + "title": "Mini JWE", + "description": "If true (default), object is an f5 mini-JWE", + "type": "boolean", + "default": true + }, + "protected": { + "title": "JOSE header", + "description": "JOSE header: alg=dir, enc=(none|f5sv); default enc=none (encoded default is 'protected'='eyJhbGciOiJkaXIiLCJlbmMiOiJub25lIn0', use with secret simply base64 url-encoded into 'ciphertext'). If you see 'protected'='eyJhbGciOiJkaXIiLCJlbmMiOiJmNXN2In0', 'ciphertext' contains base64url-encoded SecureVault cryptogram", + "type": "string", + "minLength": 2, + "allOf": [ + { + "$ref": "#/definitions/Resource_Base64" + } + ], + "default": "eyJhbGciOiJkaXIiLCJlbmMiOiJub25lIn0" + } + }, + "required": [ + "protected" + ] + }, + "L4_Profile": { + "title": "L4 Profile", + "description": "Configures a Fast Layer 4 profile", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "L4_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "clientTimeout": { + "title": "Client timeout", + "description": "Number of seconds allowed for a client to transmit enough data to select a server when you have late binding enabled. Value -1 means indefinite (not recommended)", + "type": "integer", + "maximum": 86400, + "minimum": -1, + "default": 30 + }, + "idleTimeout": { + "title": "Idle timeout", + "description": "Number of seconds (default 300; may not be 0) connection may remain idle before it becomes eligible for deletion. Value -1 (not recommended) means infinite", + "type": "integer", + "default": 300, + "anyOf": [ + { + "maximum": 86400, + "minimum": 1 + }, + { + "const": -1 + } + ] + }, + "keepAliveInterval": { + "title": "Keep-alive interval", + "description": "Number of seconds between keep-alive probes. A value of 0 seconds disables the feature.", + "type": "integer", + "default": 0, + "maximum": 4294967295, + "minimum": 0 + }, + "looseClose": { + "title": "Loose close", + "description": "When true, system closes a loosely-initiated connection when the system receives the first FIN packet from either the client or the server (default false).", + "type": "boolean", + "default": false + }, + "looseInitialization": { + "title": "Loose initialization", + "description": "When true, system initializes a connection when it receives any TCP packet, rather than requiring a SYN packet for connection initiation (default false).", + "type": "boolean", + "default": false + }, + "maxSegmentSize": { + "title": "MSS", + "description": "Sets MSS advertised to peer. Value 0 (default) will set MSS automatically in proportion to interface MTU. Default 0 is usually the best choice", + "type": "integer", + "default": 0, + "anyOf": [ + { + "maximum": 9162, + "minimum": 256 + }, + { + "const": 0 + } + ] + }, + "resetOnTimeout": { + "title": "Reset on timeout", + "description": "If true (default), connections which time out will be reset (that is, the system sends an RST packet to the peer) before the system expunges them", + "type": "boolean", + "default": true + }, + "synCookieAllowlist": { + "title": "Syn Cookie Allowlist", + "description": "Specifies whether or not to use a SYN Cookie Allowlist when doing software SYN Cookies. This means not doing a SYN Cookie for the same src IP address if it has been done already in the previous tm.flowstate.timeout (30) seconds. The default value is disabled.", + "type": "boolean", + "default": false + }, + "synCookieEnable": { + "title": "SYN cookie enable", + "description": "Enables syn-cookies capability on this virtual server. If true (default), the system may use SYN cookies to avert connection-table overflow (for example, from DoS attacks)", + "type": "boolean", + "default": true + }, + "tcpCloseTimeout": { + "title": "TCP Close timeout", + "description": "Specifies an TCP close timeout in seconds. Value -1 means indefinite (not recommended)", + "type": "integer", + "default": 5, + "maximum": 86400, + "minimum": -1 + }, + "tcpHandshakeTimeout": { + "title": "TCP Handshake timeout", + "description": "Specifies a TCP handshake timeout in seconds. The default value is 5 seconds. Value -1 means indefinite (not recommended)", + "type": "integer", + "maximum": 86400, + "default": 5, + "minimum": -1 + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "Log_Destination": { + "title": "Log Destination", + "description": "Configures a log destination", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Log_Destination" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "type": { + "description": "The type of the log destination", + "type": "string", + "enum": [ + "management-port", + "remote-high-speed-log", + "remote-syslog", + "splunk" + ] + } + }, + "required": [ + "class", + "type" + ], + "allOf": [ + { + "if": { + "properties": { + "type": { + "const": "management-port" + } + } + }, + "then": { + "$ref": "#/definitions/Log_Destination_Management_Port" + } + }, + { + "if": { + "properties": { + "type": { + "const": "remote-syslog" + } + } + }, + "then": { + "$ref": "#/definitions/Log_Destination_Remote_Syslog" + } + }, + { + "if": { + "properties": { + "type": { + "const": "remote-high-speed-log" + } + } + }, + "then": { + "$ref": "#/definitions/Log_Destination_Remote_High_Speed_Log" + } + }, + { + "if": { + "properties": { + "type": { + "const": "splunk" + } + } + }, + "then": { + "$ref": "#/definitions/Log_Destination_Splunk" + } + } + ] + }, + "Log_Destination_Management_Port": { + "title": "Log Destination Management Port", + "description": "Sends received messages to a specified IP address and port through the management interface", + "type": "object", + "properties": { + "address": { + "description": "Specifies the IP address that will receive messages from the specified local Log Destination", + "type": "string", + "format": "f5ip" + }, + "port": { + "description": "Specifies the port of the IP address that will receive messages from the specified local Log Destination", + "type": "integer", + "minimum": 0, + "maximum": 65535 + }, + "protocol": { + "description": "Specifies the protocol for the system to use to send logs to the specified location", + "type": "string", + "enum": [ + "tcp", + "udp" + ], + "default": "tcp" + } + }, + "required": [ + "address", + "port" + ] + }, + "Log_Destination_Remote_High_Speed_Log": { + "title": "Log Destination Remote High Speed Log", + "description": "Sends received messages to a specified pool", + "type": "object", + "properties": { + "distribution": { + "description": "Specifies the distribution method used to send messages to pool members", + "type": "string", + "enum": [ + "adaptive", + "balanced", + "replicated" + ], + "default": "adaptive" + }, + "protocol": { + "description": "Specifies the protocol for the system to use to send logs to the pool", + "type": "string", + "enum": [ + "tcp", + "udp" + ], + "default": "tcp" + }, + "pool": { + "$ref": "#/definitions/Pointer_Pool" + } + }, + "required": [ + "pool" + ] + }, + "Log_Destination_Remote_Syslog": { + "title": "Log Destination Remote Syslog", + "description": "Configures Remote Syslog destinations to format log messages into Syslog format and forward them to a Remote High-Speed Log destination", + "type": "object", + "properties": { + "format": { + "description": "Specifies the method to use to format the logs", + "type": "string", + "enum": [ + "legacy-bigip", + "rfc3164", + "rfc5424" + ], + "default": "rfc3164" + }, + "defaultFacility": { + "description": "Specifies the facility given to log messages received that do not already have a facility listed", + "type": "string", + "enum": [ + "local0", + "local1", + "local2", + "local3", + "local4", + "local5", + "local6", + "local7" + ], + "default": "local0" + }, + "defaultSeverity": { + "description": "Specifies the severity given to log messages received that do not already have a severity listed", + "type": "string", + "enum": [ + "alert", + "crit", + "debug", + "emerg", + "err", + "info", + "notice", + "warn" + ], + "default": "info" + }, + "remoteHighSpeedLog": { + "description": "Specifies a remote high-speed log destination, which the system uses to forward the logs to a pool of remote log servers", + "allOf": [ + { + "$ref": "#/definitions/Pointer_BIGIP_Or_Use" + }, + { + "type": "object", + "properties": { + "use": { + "description": "BIG-IP AS3 pointer to remote high speed log declaration", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Log_Destination" + }, + "type": { + "const": "remote-high-speed-log" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP remote high speed log", + "format": "f5bigip" + } + }, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys log-config destination remote-high-speed-log" + ] + } + } + ], + "minProperties": 1, + "maxProperties": 1 + } + }, + "required": [ + "remoteHighSpeedLog" + ] + }, + "Log_Destination_Splunk": { + "title": "Log Destination Splunk", + "description": "Configures Splunk formatting destinations to format incoming log messages into Splunk format", + "type": "object", + "properties": { + "forwardTo": { + "description": "Specifies the log destination to which logs are forwarded", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Log_Destination" + } + ] + } + }, + "required": [ + "forwardTo" + ] + }, + "Log_Publisher": { + "title": "Log_Publisher", + "description": "Configures lists of destinations for the common logging interface", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Log_Publisher" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "destinations": { + "description": "specify log destinations for this log publisher to use", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Log_Destination" + } + } + }, + "required": [ + "class", + "destinations" + ] + }, + "Pointer_BIGIP": { + "title": "Pointer BIG-IP", + "description": "Reference for a BIG-IP object", + "type": "object", + "properties": { + "bigip": { + "description": "Path to BIG-IP object", + "type": "string" + } + }, + "required": [ + "bigip" + ], + "additionalProperties": false + }, + "Pointer_BIGIP_Or_Use": { + "title": "Pointer BIG-IP or Use", + "description": "Reference for a BIG-IP or Use object", + "if": { + "type": "object", + "required": [ + "bigip" + ] + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/Pointer_BIGIP" + } + ] + }, + "else": { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Use" + } + ] + } + }, + "Pointer_CA_Bundle": { + "title": "Pointer CA Bundle", + "description": "Reference to a Ca Bundle", + "additionalProperties": false, + "maxProperties": 1, + "minProperties": 1, + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP Ca Bundle", + "format": "f5bigip", + "type": "string" + }, + "use": { + "description": "BIG-IP AS3 pointer to Ca Bundle declaration", + "minLength": 1, + "type": "string", + "f5PostProcess": { + "data": { + "properties": { + "class": { + "enum": [ + "CA_Bundle" + ] + } + }, + "required": [ + "class" + ] + }, + "tag": "pointer" + } + } + }, + "type": "object", + "allOf": [ + { + "f5PostProcess": { + "data": [ + "query sys file ssl-cert" + ], + "tag": "bigComponent" + } + } + ] + }, + "Pointer_Certificate_Validator_OCSP": { + "title": "Pointer Certificate Validator OCSP", + "description": "Reference to a OCSP Cert Validator", + "additionalProperties": false, + "allOf": [ + { + "f5PostProcess": { + "data": [ + "query sys crypto cert-validator ocsp" + ], + "tag": "bigComponent" + } + } + ], + "maxProperties": 1, + "minProperties": 1, + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP OCSP Cert Validator", + "format": "f5bigip", + "type": "string" + }, + "use": { + "description": "BIG-IP AS3 pointer to OCSP Cert Validator declaration", + "f5PostProcess": { + "data": { + "properties": { + "class": { + "enum": [ + "Certificate_Validator_OCSP" + ] + } + }, + "required": [ + "class" + ] + }, + "tag": "pointer" + }, + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "Pointer_Copy_From": { + "title": "Copy from pointer", + "description": "pointer to declaration object/property from which to copy value", + "type": "string" + }, + "Pointer_DNS_Resolver": { + "title": "Pointer DNS Resolver", + "description": "Reference to a DNS resolver", + "type": "object", + "allOf": [ + { + "f5PostProcess": { + "data": [ + "query net dns-resolver" + ], + "tag": "bigComponent" + } + } + ], + "maxProperties": 1, + "minProperties": 1, + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP DNS resolver", + "format": "f5bigip", + "type": "string" + } + }, + "additionalProperties": false + }, + "Pointer_F5_String_Or_BIGIP": { + "title": "Pointer F5 String or BIG-IP", + "description": "Reference for a property or BIG-IP object", + "if": { + "type": "object", + "required": [ + "bigip" + ] + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/Pointer_BIGIP" + } + ] + }, + "else": { + "allOf": [ + { + "$ref": "#/definitions/F5_String" + } + ] + } + }, + "Pointer_HTTP_Acceleration_Profile": { + "title": "Pointer HTTP Acceleration Profile", + "additionalProperties": false, + "allOf": [ + { + "f5PostProcess": { + "data": [ + "query ltm profile web-acceleration" + ], + "tag": "bigComponent" + } + } + ], + "description": "Reference to a HTTP Acceleration Profile", + "maxProperties": 1, + "minProperties": 1, + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP HTTP Acceleration Profile", + "format": "f5bigip", + "type": "string" + }, + "use": { + "description": "AS3 pointer to HTTP Acceleration Profile declaration", + "f5PostProcess": { + "data": { + "properties": { + "class": { + "enum": [ + "HTTP_Acceleration_Profile" + ] + } + }, + "required": [ + "class" + ] + }, + "tag": "pointer" + }, + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "Pointer_HTTP_Profile": { + "title": "Pointer HTTP Profile", + "allOf": [ + { + "$ref": "#/definitions/Pointer_BIGIP_Or_Use" + }, + { + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP HTTP Profile", + "format": "f5bigip" + }, + "use": { + "description": "AS3 pointer to HTTP Profile declaration", + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "HTTP_Profile" + ] + } + }, + "required": [ + "class" + ] + } + }, + "minLength": 1 + } + }, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile http" + ] + } + } + ], + "description": "Reference to a HTTP Profile", + "maxProperties": 1, + "minProperties": 1 + }, + "Pointer_L4_Profile": { + "title": "Pointer L4 Profile", + "description": "Reference to a fast L4 profile", + "maxProperties": 1, + "minProperties": 1, + "allOf": [ + { + "$ref": "#/definitions/Pointer_BIGIP_Or_Use" + }, + { + "type": "object", + "properties": { + "use": { + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "L4_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "format": "f5bigip" + } + }, + "f5PostProcess": { + "data": [ + "query ltm profile fastl4" + ], + "tag": "bigComponent" + } + } + ] + }, + "Pointer_Log_Destination": { + "title": "Pointer Log Destination", + "description": "Reference to a log destination", + "allOf": [ + { + "$ref": "#/definitions/Pointer_BIGIP_Or_Use" + }, + { + "type": "object", + "properties": { + "use": { + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Log_Destination" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "format": "f5bigip" + } + }, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys log-config destination alertd", + "query sys log-config destination arcsight", + "query sys log-config destination ipfix", + "query sys log-config destination local-database", + "query sys log-config destination local-syslog", + "query sys log-config destination management-port", + "query sys log-config destination remote-high-speed-log", + "query sys log-config destination remote-syslog", + "query sys log-config destination splunk" + ] + } + } + ] + }, + "Pointer_Log_Publisher": { + "title": "Pointer Log Publisher", + "description": "Reference to a log publisher", + "allOf": [ + { + "$ref": "#/definitions/Pointer_BIGIP_Or_Use" + }, + { + "type": "object", + "properties": { + "use": { + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Log_Publisher" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "format": "f5bigip" + } + }, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys log-config publisher" + ] + } + } + ] + }, + "Pointer_Pool": { + "title": "Pointer Pool", + "description": "Reference to a pool", + "allOf": [ + { + "$ref": "#/definitions/Pointer_BIGIP_Or_Use" + }, + { + "type": "object", + "properties": { + "use": { + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Pool" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP pool", + "format": "f5bigip" + } + }, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm pool" + ] + } + } + ], + "minProperties": 1, + "maxProperties": 1 + }, + "Pointer_SSL_Certificate": { + "title": "Pointer SSL Certificate", + "description": "Reference to a SSL certificate", + "type": "object", + "allOf": [ + { + "f5PostProcess": { + "data": [ + "query sys file ssl-cert" + ], + "tag": "bigComponent" + } + } + ], + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP SSL certificate", + "format": "f5bigip", + "type": "string" + }, + "use": { + "description": "BIG-IP AS3 pointer to SSL certificate declaration", + "f5PostProcess": { + "data": { + "properties": { + "class": { + "enum": [ + "Certificate" + ] + } + }, + "required": [ + "class" + ] + }, + "tag": "pointer" + }, + "minLength": 1, + "type": "string" + } + }, + "maxProperties": 1, + "minProperties": 1, + "additionalProperties": false + }, + "Pointer_String": { + "title": "Pointer String", + "description": "Reference that is a string", + "type": "string" + }, + "Pointer_Use": { + "title": "Pointer Use", + "description": "Reference for use property", + "type": "object", + "properties": { + "use": { + "description": "Path to object in declaration", + "type": "string" + } + }, + "required": [ + "use" + ], + "additionalProperties": false + }, + "Pointer_WebSocket_Profile": { + "title": "Pointer WebSocket Profile", + "additionalProperties": false, + "allOf": [ + { + "f5PostProcess": { + "data": [ + "query ltm profile websocket" + ], + "tag": "bigComponent" + } + } + ], + "description": "Reference to a WebSocket Profile", + "maxProperties": 1, + "minProperties": 1, + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP WebSocket Profile", + "format": "f5bigip", + "type": "string" + }, + "use": { + "description": "AS3 pointer to WebSocket Profile declaration", + "f5PostProcess": { + "data": { + "properties": { + "class": { + "enum": [ + "WebSocket_Profile" + ] + } + }, + "required": [ + "class" + ] + }, + "tag": "pointer" + }, + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "Property_Base64": { + "title": "Property Base64", + "description": "A Base64-encoded value (base64 property)", + "allOf": [ + { + "$ref": "#/definitions/Resource_Base64" + } + ] + }, + "Property_Passphrase": { + "title": "Property Passphrase", + "description": "A passphrase (passphrase property)", + "allOf": [ + { + "$ref": "#/definitions/Secret" + } + ], + "f5PostProcess": { + "tag": "secret" + } + }, + "Property_Text": { + "title": "Property Text", + "description": "A text value (text property)", + "allOf": [ + { + "$ref": "#/definitions/Resource_Text" + } + ] + }, + "Resource_Base64": { + "title": "Resource Base64", + "description": "A Base64-encoded value", + "type": "string", + "pattern": "^([0-9A-Za-z/+_-]*|[0-9A-Za-z/+_-]+={1,2})$" + }, + "Resource_Text": { + "title": "Resource Text", + "description": "UTF-8 text (in JSON string)", + "type": "string" + }, + "Resource_URL": { + "title": "Resource URL", + "description": "The URL for a required resource", + "oneOf": [ + { + "type": "string", + "f5PostProcess": { + "tag": "expand" + }, + "format": "uri" + }, + { + "type": "object", + "properties": { + "authentication": { + "description": "Authentication to the remote source", + "oneOf": [ + { + "$ref": "#/definitions/Basic_Auth" + }, + { + "$ref": "#/definitions/Bearer_Token" + } + ] + }, + "ignoreChanges": { + "type": "boolean", + "description": "If false (default), the URL will be fetched in each BIG-IP AS3 declaration deployment. If true, the resource will be created on the first deployment, but not on additional deployments", + "default": false + }, + "skipCertificateCheck": { + "type": "boolean", + "description": "Skip verification of SSL certificates (default false)", + "default": false + }, + "url": { + "type": "string", + "description": "URL from which to retrieve value", + "f5PostProcess": { + "tag": "expand" + }, + "format": "uri" + } + }, + "required": [ + "url" + ], + "additionalProperties": false + } + ] + }, + "Secret": { + "title": "Secret value", + "description": "A value: (a) in a cryptogram in this object; (b) in a cryptogram elsewhere in this declaration; or (c) available from a URL", + "oneOf": [ + { + "type": "object", + "properties": { + "allowReuse": { + "title": "Allow reuse", + "description": "If true, other declaration objects may reuse this value", + "type": "boolean" + }, + "reuseFrom": { + "title": "Reuse from", + "description": "BIG-IP AS3 pointer to another JWE cryptogram in this declaration to copy", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "type": "object", + "required": [ + "ciphertext" + ] + } + } + }, + "url": { + "title": "URL", + "description": "URL from which secret should be fetched", + "allOf": [ + { + "$ref": "#/definitions/Secret_Resource_URL" + } + ] + } + }, + "oneOf": [ + { + "required": [ + "ciphertext" + ] + }, + { + "required": [ + "reuseFrom" + ] + }, + { + "required": [ + "url" + ] + } + ], + "if": { + "required": [ + "ciphertext" + ] + }, + "then": { + "$ref": "#/definitions/JWE" + } + } + ] + }, + "Secret_Resource_URL": { + "title": "Secret Resource URL", + "description": "Describes the URL to remote resource and optional parameters", + "oneOf": [ + { + "type": "string", + "format": "uri", + "f5PostProcess": { + "tag": "expand" + } + }, + { + "type": "object", + "properties": { + "url": { + "description": "URL from which to retrieve value", + "type": "string", + "format": "uri", + "f5PostProcess": { + "tag": "expand" + } + }, + "skipCertificateCheck": { + "description": "Skip verification of SSL certificates (default false)", + "type": "boolean", + "default": false + } + }, + "required": [ + "url" + ] + } + ] + }, + "UDP_Profile": { + "title": "UDP Profile", + "description": "Configures a User Datagram Protocol (UDP) profile", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "UDP_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "allowNoPayload": { + "title": "Allow empty payload", + "description": "When true, forward UDP datagrams with empty payloads (default false)", + "type": "boolean", + "default": false + }, + "bufferMaxBytes": { + "title": "Buffer maximum-bytes", + "description": "Limit to number of octets which the system may buffer for a UDP flow (default 655350)", + "type": "integer", + "minimum": 65535, + "maximum": 16777215, + "default": 655350 + }, + "bufferMaxPackets": { + "title": "Buffer maximum-packets", + "description": "Limit to number of packets which the system may buffer for a UDP flow (default 0)", + "type": "integer", + "minimum": 0, + "maximum": 255, + "default": 0 + }, + "datagramLoadBalancing": { + "title": "Datagram load-balancing", + "description": "When true, process UDP datagrams independently, without recognizing flows (default false)", + "type": "boolean", + "default": false + }, + "idleTimeout": { + "title": "Idle timeout", + "description": "Number of seconds (default 60) flow may remain idle before it becomes eligible for deletion. Value 0 allows system to recover per-flow resources whenever convenient (always safe with UDP). Value -1 means indefinite (not recommended)", + "type": "integer", + "minimum": -1, + "maximum": 86400, + "default": 60 + }, + "ipDfMode": { + "title": "IP DF mode", + "description": "Controls DF (Don't Fragment) flag in outgoing datagrams. Value 'pmtu' (default) sets DF based on IP PMTU value. Value 'preserve' copies DF from received datagram. Value 'set' forces DF true in all outgoing datagrams. Value 'clear' forces DF false in all outgoing datagrams", + "type": "string", + "enum": [ + "clear", + "pmtu", + "preserve", + "set" + ], + "default": "pmtu" + }, + "ipTosToClient": { + "title": "IP TOS/DSCP to client", + "description": "Specifies the IP TOS/DSCP value in packets sent to clients (default 0). Numeric values in this property are decimal representations of eight-bit numbers, of which the leftmost six bits are the DSCP code per rfc2474 (and the rightmost two bits reserved). You may have to calculate the value of this property by multiplying a DSCP code, such as CS5+EF = 46, by four, to obtain the 'ipTosToClient' value, such as 184. Value 'pass-through' sets DSCP from the initial server-side value. Value 'mimic' copies DSCP from the most-recently received server-side packet (allowing DSCP to vary during the life of a connection)", + "oneOf": [ + { + "type": "integer", + "minimum": 0, + "maximum": 252, + "multipleOf": 4 + }, + { + "type": "string", + "enum": [ + "pass-through", + "mimic" + ] + } + ], + "default": 0 + }, + "linkQosToClient": { + "title": "Link QOS to client", + "description": "Specifies the Layer-2 QOS value in packets sent to clients (default 0). Ethernet-type networks recognize numeric codes from 0 to 7. Value 'pass-through' sets QOS from the initial server-side value", + "oneOf": [ + { + "type": "integer", + "minimum": 0, + "maximum": 7 + }, + { + "type": "string", + "const": "pass-through" + } + ], + "default": 0 + }, + "proxyMSS": { + "title": "Proxy MSS", + "description": "When true, MSS advertised on the server side will match that negotiated with the client, if permitted by MTU and other constraints (default false)", + "type": "boolean", + "default": false + }, + "ttlIPv4": { + "title": "TTL for IPv4", + "description": "TTL the system sets in outgoing IPv4 datagrams", + "type": "integer", + "minimum": 1, + "maximum": 255, + "default": 255 + }, + "ttlIPv6": { + "title": "TTL for IPv6", + "description": "TTL the system sets in outgoing IPv6 datagrams", + "type": "integer", + "minimum": 1, + "maximum": 255, + "default": 64 + }, + "ttlMode": { + "title": "TTL mode", + "description": "Controls IP TTL in outgoing datagrams. Value 'set' forces TTL to value of property 'ttlIPv4' or 'ttlIPv6' as appropriate. Value 'proxy' forces TTL to the default value for IPv4 or IPv6 as appropriate. Value 'preserve' copies TTL from received datagram. Value 'decrement' sets TTL to one less than received datagram's TTL", + "type": "string", + "enum": [ + "decrement", + "preserve", + "proxy", + "set" + ], + "default": "proxy" + }, + "useChecksum": { + "title": "Use checksum", + "description": "When true, system will validate UDP checksums for IPv4 datagrams (default false). Checksums are always validated for IPv6", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false, + "required": [ + "class" + ] + } + } +} \ No newline at end of file diff --git a/schema/README.md b/schema/README.md index 6d5e89e9..d48f99f8 100644 --- a/schema/README.md +++ b/schema/README.md @@ -1,4 +1,4 @@ ## AS3 Schema files In this directory you will find the JSON schema files used by AS3. There are folders with schema files for all of the supported AS3 versions, including our long-term support (LTS) version (3.5.1), and the latest release. Beginning with AS3 3.8.0, the schema files have been consolidated into a single file: as3-schema.json. -For more information on versioning, see https://github.com/F5Networks/f5-appsvcs-extension/blob/master/SUPPORT.md. \ No newline at end of file +For more information on versioning, see https://github.com/F5Networks/f5-appsvcs-extension/blob/main/SUPPORT.md. diff --git a/schema/latest/as3-schema-3.46.0-4.json b/schema/latest/as3-schema-3.46.0-4.json new file mode 100644 index 00000000..0148cb6d --- /dev/null +++ b/schema/latest/as3-schema-3.46.0-4.json @@ -0,0 +1,35462 @@ +{ + "$id": "urn:uuid:85626792-9ee7-46bb-8fc8-4ba708cfdc1d", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "AS3 API Request", + "description": "BIG-IP AS3 API request body", + "oneOf": [ + { + "$ref": "#/definitions/AS3" + }, + { + "$ref": "#/definitions/ADC" + }, + { + "$ref": "#/definitions/AS3_Patch_Body" + }, + { + "$ref": "#/definitions/AS3_Array" + }, + { + "$ref": "#/definitions/ADC_Array" + } + ], + "definitions": { + "ADC": { + "title": "ADC", + "description": "A declarative configuration for an ADC such as F5 BIG-IP", + "type": "object", + "properties": { + "class": { + "title": "Class", + "description": "Indicates this JSON document is an ADC declaration", + "type": "string", + "const": "ADC" + }, + "$schema": { + "description": "URL of schema against which to validate. Used by validation in your local environment only (via Visual Studio Code, for example)", + "type": "string", + "format": "uri" + }, + "updateMode": { + "title": "Update mode", + "description": "When set to 'selective' (default) BIG-IP AS3 does not modify Tenants not referenced in the declaration. Otherwise ('complete') BIG-IP AS3 removes unreferenced Tenants.", + "type": "string", + "enum": [ + "complete", + "selective" + ], + "default": "selective" + }, + "schemaVersion": { + "title": "Schema version", + "description": "Version of ADC Declaration schema this declaration uses", + "type": "string", + "$comment": "IMPORTANT: In enum array, please put current schema version first, oldest-supported version last. Keep enum array sorted most-recent-first.", + "enum": [ + "3.46.0", + "3.45.0", + "3.44.0", + "3.43.0", + "3.42.0", + "3.41.0", + "3.40.0", + "3.39.0", + "3.38.0", + "3.37.0", + "3.36.0", + "3.35.0", + "3.34.0", + "3.33.0", + "3.32.0", + "3.31.0", + "3.30.0", + "3.29.0", + "3.28.0", + "3.27.0", + "3.26.0", + "3.25.0", + "3.24.0", + "3.23.0", + "3.22.0", + "3.21.0", + "3.20.0", + "3.19.0", + "3.18.0", + "3.17.0", + "3.16.0", + "3.15.0", + "3.14.0", + "3.13.0", + "3.12.0", + "3.11.0", + "3.10.0", + "3.9.0", + "3.8.0", + "3.7.0", + "3.6.0", + "3.5.0", + "3.4.0", + "3.3.0", + "3.2.0", + "3.1.0", + "3.0.0" + ] + }, + "id": { + "title": "Declaration ID", + "description": "Unique identifier for this declaration (max 255 printable chars with no spaces, quotation marks, angle brackets, nor backslashes)", + "type": "string", + "pattern": "^[^\\x00-\\x20\\x22'<>\\x5c^`|\\x7f]*$", + "minLength": 0, + "maxLength": 255 + }, + "target": { + "title": "Target Device", + "description": "Trusted target for config when configuring with BIG-IQ", + "type": "object", + "properties": { + "hostname": { + "title": "Host Name", + "description": "Host name of managed device to be configured", + "type": "string" + }, + "address": { + "title": "IP Address", + "description": "IP address of managed device to be configured", + "type": "string", + "format": "f5ip" + } + }, + "maxProperties": 1 + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "constants": { + "title": "Constants", + "description": "Declaration metadata and/or named values for (re-)use by declaration objects", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Constants", + "default": "Constants" + }, + "version": { + "title": "Declaration version", + "description": "Version number of declaration; update when you change contents but not ID (optional but recommended)", + "type": [ + "number", + "string" + ] + }, + "timestamp": { + "title": "Declaration timestamp", + "description": "Date+time (this version of) declaration was created (optional but recommended)", + "type": "string", + "format": "date-time" + } + }, + "additionalProperties": { + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object" + ], + "if": { + "type": "object", + "required": [ + "protected", + "ciphertext" + ] + }, + "then": { + "properties": { + "allowReuse": { + "title": "Allow reuse", + "description": "If true (default), different declaration objects may reuse a cryptogram, WHICH MAY POSE A SECURITY RISK!", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false, + "allOf": [ + { + "$ref": "#/definitions/JWE" + } + ] + } + }, + "propertyNames": { + "pattern": "^[A-Za-z][0-9A-Za-z_]*$", + "maxLength": 64 + } + }, + "Common": { + "title": "Common tenant", + "description": "Special tenant Common holds objects other tenants can share", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Tenant", + "default": "Tenant" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "verifiers": { + "title": "Verifiers", + "description": "Data (in 'key':'value' properties) used to verify automated tests. Ordinary declarations do not need this", + "type": "object" + }, + "enable": { + "title": "Enable", + "description": "If declared, you must enable the Common tenant", + "type": "boolean", + "const": true + }, + "Shared": { + "$ref": "#/definitions/Application_Shared" + }, + "constants": { + "$ref": "#/definitions/Constants" + }, + "controls": { + "$ref": "#/definitions/Controls" + }, + "optimisticLockKey": { + "title": "Optimistic lock key", + "description": "When you deploy a declaration with a non-empty 'key' value here, that activates an optimistic lock on changes to this Tenant. If the key in your declaration does not match the key BIG-IP AS3 computes for the most-recent previous declaration, then BIG-IP AS3 will NOT update this Tenant and will return an error code. To use optimistic locking, first retrieve a declaration using option 'showHash=true' to get the current per-Tenant keys. Make any changes you desire, then deploy your updated declaration. Deployment of each Tenant with a key will succeed only if that Tenant has not been modified since the time you retrieved the declaration. (To overwrite all previous changes to a Tenant simply do NOT include any opportunistic-lock key for that Tenant when you deploy a declaration. That is the default.) Note that only keys computed by BIG-IP AS3 may be used here-- you cannot generate your own. If 'showHash=true' is used on a POST then the optimisticLockKey will be shown as a part of the output (This helps to avoid the need to do a GET request).", + "type": "string", + "maxLength": 128, + "default": "" + } + }, + "additionalProperties": false + }, + "controls": { + "$ref": "#/definitions/Controls" + }, + "scratch": { + "title": "f5 scratch", + "description": "Holds some system data during declaration processing", + "type": "string", + "readOnly": true + } + }, + "additionalProperties": { + "$ref": "#/definitions/Tenant" + }, + "propertyNames": { + "oneOf": [ + { + "pattern": "^[A-Za-z][0-9A-Za-z_.-]*$", + "maxLength": 190 + }, + { + "enum": [ + "$schema" + ] + } + ] + }, + "required": [ + "class", + "schemaVersion" + ] + }, + "ADC_Array": { + "title": "Declaration Array", + "description": "An array of declarations (ADC) to process", + "type": "array", + "items": { + "$ref": "#/definitions/ADC" + }, + "minItems": 1 + }, + "AS3_Patch_Item": { + "type": "object", + "title": "AS3 PATCH item", + "description": "Defines a PATCH operation to perform", + "properties": { + "op": { + "title": "Op", + "description": "Operation to perform", + "type": "string" + }, + "path": { + "title": "Path", + "description": "Declaration Object Path relative to URI on which the operation is to be performed", + "type": "string" + }, + "value": { + "title": "Value", + "description": "Value to use for the operation", + "type": [ + "string", + "number", + "boolean", + "object", + "array" + ] + }, + "target": { + "title": "Optional Target Device", + "description": "Optional target device (only applies when configuring with certain hosts such as BIG-IQ)", + "type": "object", + "properties": { + "hostname": { + "title": "Host Name", + "description": "Host name of managed device to be configured", + "type": "string" + }, + "address": { + "title": "IP Address", + "description": "IP address of managed device to be configured", + "type": "string", + "format": "f5ip" + } + }, + "maxProperties": 1 + } + }, + "required": [ + "op", + "path" + ] + }, + "AS3_Patch_Body": { + "title": "AS3 PATCH Body", + "description": "An array containing the patch operations to apply on the declaration", + "type": "array", + "items": { + "$ref": "#/definitions/AS3_Patch_Item" + }, + "$comment": "Refer to docs for additional information on patch request syntax", + "minItems": 1 + }, + "AS3": { + "title": "AS3 Request", + "description": "A body with AS3 Class", + "type": "object", + "properties": { + "class": { + "title": "Class", + "description": "Indicates a BIG-IP AS3 request", + "type": "string", + "const": "AS3" + }, + "$schema": { + "description": "URL of schema against which to validate. Used by validation in your local environment only (via Visual Studio Code, for example)", + "type": "string", + "format": "uri" + }, + "action": { + "title": "Action", + "description": "Indicates desired action: 'deploy' means deploy the included declaration to targetHost; 'dry-run' does NOT deploy the declaration but does do everything short of changing targetHost's configuration; 'patch' modifies the declaration based on the provided set of commands and then deploys the updated declaration; 'redeploy' causes an old declaration from targetHost's declaration history to be re-deployed (property redeployAge (default 0) selects the old declaration, and note redeployUpdateMode as well); 'retrieve' returns a copy of a previously-deployed declaration; 'remove' deletes the declaration or declaration component.", + "type": "string", + "enum": [ + "deploy", + "dry-run", + "patch", + "redeploy", + "retrieve", + "remove" + ], + "default": "deploy" + }, + "redeployAge": { + "title": "Redeploy age", + "description": "For action=redeploy (only), chooses which old declaration to deploy again. Value 0 (default) means re-deploy the most recent declaration (the one which set the current configuration of targetHost-- useful to erase changes introduced by manual configuration). Value 1 means re-deploy the declaration prior to the most-recent one, etc. Note that whenever re-deploying an old declaration causes ADC configuration changes, that declaration becomes the current declaration (age 0) and the ages of all other declarations in the history increase (0 => 1, 1 => 2, u.s.w.)", + "type": "integer", + "minimum": 0, + "maximum": 15, + "default": 0 + }, + "redeployUpdateMode": { + "title": "Redeploy update mode", + "description": "Value 'original' (default) means re-deploy the chosen declaration using its original updateMode (which if not explicitly specified in that declaration will default to 'selective'). Otherwise, forces the updateMode for re-deployment to 'complete' or 'selective' as specified. Remember, 'selective' updates do not affect Tenants not explicitly named. To simply roll-back the targetHost configuration to the state it had immediately after deploying some earlier declaration, put 'complete' here (that will remove Tenants created later than the redeployAge declaration). To use action=redeploy as a simple roll-back facility, always deploy (updateMode=)complete declarations.", + "type": "string", + "enum": [ + "original", + "complete", + "selective" + ], + "default": "original" + }, + "persist": { + "title": "Persist on device", + "description": "When true (default) make the whole working configuration persistent on targetHost after (and only if) this request deploys any changes. If false, leave the working configuration in memory only (if targetHost restart, you may lose the configuration from memory)", + "type": "boolean", + "default": true + }, + "syncToGroup": { + "title": "Sync to device group", + "description": "Name (like /Common/my_dg) of the config-sync group TO which the system should synchronize the targetHost configuration after (and only if) this request deploys any changes. When empty (default) this request will not affect config-sync at all. Leave undefined or empty whenever you use auto-sync or manage configuration synchronization separately", + "type": "string", + "default": "" + }, + "historyLimit": { + "title": "History limit", + "description": "This value (default 4) limits the number of previously-deployed declarations saved on targetHost for review using GET and for use with POST action=redeploy and redeployAge=N. The limit includes the current and immediately-previous declarations so may not be less than two", + "type": "number", + "minimum": 2, + "maximum": 15, + "default": 4 + }, + "logLevel": { + "title": "Log level", + "description": "Controls level of detail in logs using RFC 5424 severity levels (default is 'warning'). Portions of declaration may use different logLevels", + "type": "string", + "enum": [ + "emergency", + "alert", + "critical", + "error", + "warning", + "notice", + "info", + "debug" + ], + "default": "warning" + }, + "trace": { + "title": "Trace", + "description": "If true, BIG-IP AS3 creates a detailed trace of the configuration process for subsequent analysis (default false). May be overridden on a per-Declaration and/or per-Tenant basis. Warning: trace files may contain sensitive configuration data", + "type": "boolean", + "default": false + }, + "retrieveAge": { + "title": "Retrieve age", + "description": "Use this property with action=retrieve. You can usually get a copy of the declaration most recently deployed to targetHost, and often copies of previously-deployed declarations are also available. Value 0 (default) means 'the last-deployed declaration,' value 1 means 'the declaration previous to 0' and so-forth. To get a list of available declarations, set value 'list'", + "oneOf": [ + { + "type": "integer", + "minimum": 0 + }, + { + "type": "string", + "const": "list" + } + ], + "default": 0 + }, + "targetHost": { + "title": "Target host", + "description": "Hostname or IP address of ADC to which request applies (default localhost)", + "type": "string", + "anyOf": [ + { + "format": "hostname" + }, + { + "format": "f5ip" + } + ], + "default": "localhost" + }, + "targetPort": { + "title": "Target port", + "description": "TCP port number of management service on targetHost; default 0 means auto-discover", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 0 + }, + "targetUsername": { + "title": "Target username", + "description": "Username of principal authorized to modify configuration of targetHost (may not include the character ':'). NOTE: this is generally not required to configure 'localhost' because client authentication and authorization precede invocation of BIG-IP AS3. It is also not required for any targetHost if you populate targetTokens", + "type": "string", + "pattern": "^[^:]*$", + "maxLength": 254 + }, + "targetPassphrase": { + "title": "Target passphrase", + "description": "Passphrase for targetUsername account. This is generally not required to configure 'localhost' and is not required when you populate targetTokens", + "type": "string", + "maxLength": 254 + }, + "targetTokens": { + "title": "Target tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABC123') you want to send with queries to the targetHost management service as authentication/authorization tokens", + "type": "object", + "patternProperties": { + "^[^\\x00-\\x20:\\x7f-\\xff]{1,254}$": { + "title": "HTTP header", + "type": "string", + "pattern": "^[^\\x00-\\x1f\\x7f-\\xff]*$", + "maxLength": 8192 + } + }, + "additionalProperties": false + }, + "targetTimeout": { + "title": "Target timeout", + "description": "Maximum delay allowed while communicating with targetHost device (seconds, default 150)", + "type": "integer", + "minimum": 1, + "maximum": 900, + "default": 150 + }, + "resourceTimeout": { + "title": "Resource timeout", + "description": "Maximum delay allowed while communicating with URL resources (seconds, default 5)", + "type": "integer", + "minimum": 1, + "maximum": 900, + "default": 5 + }, + "declaration": { + "$ref": "#/definitions/ADC" + }, + "patchBody": { + "$ref": "#/definitions/AS3_Patch_Body" + } + }, + "dependencies": { + "declaration": { + "not": { + "required": [ + "patchBody" + ] + } + }, + "patchBody": { + "not": { + "required": [ + "declaration" + ] + } + } + }, + "required": [ + "class" + ] + }, + "AS3_Array": { + "title": "AS3 Array", + "description": "An array of BIG-IP AS3 requests to process", + "type": "array", + "items": { + "$ref": "#/definitions/AS3" + }, + "minItems": 1 + }, + "Include": { + "title": "Include", + "description": "Defines inclusion of one part of the schema into another", + "type": "object", + "properties": { + "include": { + "description": "Keyword to allow for inclusion of one part of the declaration into another", + "oneOf": [ + { + "type": "string", + "format": "f5pointer" + }, + { + "type": "array", + "items": { + "type": "string", + "format": "f5pointer" + } + } + ], + "f5PostProcess": { + "tag": "include", + "data": "object" + } + } + } + }, + "Tenant": { + "title": "Tenant", + "description": "Declares a Tenant", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Tenant" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "verifiers": { + "title": "Verifiers", + "description": "Data (in 'key':'value' properties) used to verify automated tests. Ordinary declarations do not need this", + "type": "object" + }, + "enable": { + "title": "Enable", + "description": "Tenant handles traffic only when enabled (default)", + "type": "boolean", + "default": true + }, + "defaultRouteDomain": { + "title": "Default route domain", + "description": "Using the route-domain ID, this property selects the default route domain for IP traffic to and from this Tenant's application resources (note: affects declared IP addresses which do not include a %RD route-domain specifier). You must choose an existing route domain--this option cannot create one. Route domain 0 (default) is always available", + "$comment": "TMSH forces this value to be an integer", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 0, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query net route-domain" + ] + } + }, + "Shared": { + "$ref": "#/definitions/Application_Shared" + }, + "constants": { + "$ref": "#/definitions/Constants" + }, + "controls": { + "$ref": "#/definitions/Controls" + }, + "optimisticLockKey": { + "title": "Optimistic lock key", + "description": "When you deploy a declaration with a non-empty 'key' value here, that activates an optimistic lock on changes to this Tenant. If the key in your declaration does not match the key BIG-IP AS3 computes for the most-recent previous declaration, then BIG-IP AS3 will NOT update this Tenant and will return an error code. To use optimistic locking, first retrieve a declaration using option 'showHash=true' to get the current per-Tenant keys. Make any changes you desire, then deploy your updated declaration. Deployment of each Tenant with a key will succeed only if that Tenant has not been modified since the time you retrieved the declaration. (To overwrite all previous changes to a Tenant simply do NOT include any opportunistic-lock key for that Tenant when you deploy a declaration. That is the default.) Note that only keys computed by BIG-IP AS3 may be used here-- you cannot generate your own. If 'showHash=true' is used on a POST then the optimisticLockKey will be shown as a part of the output (This helps to avoid the need to do a GET request).", + "type": "string", + "maxLength": 128, + "default": "" + } + }, + "additionalProperties": { + "$ref": "#/definitions/Application" + }, + "propertyNames": { + "pattern": "^[A-Za-z][0-9A-Za-z_.-]*$", + "maxLength": 190 + }, + "required": [ + "class" + ] + }, + "Application_Shared": { + "title": "Shared Application", + "description": "Special application Shared holds objects other applications can share", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Application" + }, + "template": { + "title": "Template Name", + "description": "Shared Application template is always generic", + "type": "string", + "const": "shared" + }, + "enable": { + "title": "Enable", + "description": "If declared, you must enable the Shared Application", + "type": "boolean", + "const": true, + "default": true + } + }, + "allOf": [ + { + "$ref": "#/definitions/Application" + } + ], + "required": [ + "class", + "template" + ] + }, + "Application": { + "title": "Application", + "description": "Application declaration main schema", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Application" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "template": { + "title": "Template Name", + "description": "Each application type has certain required and default elements and selects appropriate setup of various ADC/Security features", + "type": "string", + "default": "generic" + }, + "schemaOverlay": { + "title": "Schema Overlay", + "description": "BIG-IQ name for a supplemental validation schema is applied to the Application class definition before the main BIG-IP AS3 schema", + "type": "string" + }, + "enable": { + "title": "Enable", + "description": "Application handles traffic only when enabled (default)", + "type": "boolean", + "default": true + }, + "constants": { + "$ref": "#/definitions/Constants" + }, + "serviceMain": { + "description": "Primary service of the application" + } + }, + "additionalProperties": { + "properties": { + "class": { + "type": "string", + "enum": [ + "Service_HTTP", + "Service_HTTPS", + "Service_TCP", + "Service_UDP", + "Service_SCTP", + "Service_L4", + "Service_Generic", + "Service_Forwarding", + "Service_Address", + "SNAT_Pool", + "SNAT_Translation", + "WAF_Policy", + "Persist", + "Pool", + "Address_Discovery", + "Monitor", + "TLS_Server", + "TLS_Client", + "FIX_Profile", + "RTSP_Profile", + "SIP_Profile", + "Statistics_Profile", + "TFTP_Profile", + "FTP_Profile", + "HTML_Rule", + "HTML_Profile", + "WebSocket_Profile", + "Multiplex_Profile", + "SOCKS_Profile", + "TCP_Profile", + "Classification_Profile", + "Radius_Profile", + "IP_Other_Profile", + "Rewrite_Profile", + "Stream_Profile", + "Access_Profile", + "Per_Request_Access_Policy", + "ICAP_Profile", + "Adapt_Profile", + "Cipher_Rule", + "Cipher_Group", + "iFile", + "Firewall_Address_List", + "Firewall_Port_List", + "Firewall_Rule_List", + "Firewall_Policy", + "NAT_Policy", + "NAT_Source_Translation", + "Protocol_Inspection_Profile", + "SSH_Proxy_Profile", + "Data_Group", + "DNS_Cache", + "DNS_Profile", + "DNS_TSIG_Key", + "DNS_Zone", + "DNS_Nameserver", + "DOS_Profile", + "GSLB_Domain", + "GSLB_iRule", + "GSLB_Monitor", + "GSLB_Pool", + "GSLB_Server", + "GSLB_Data_Center", + "GSLB_Prober_Pool", + "GSLB_Topology_Records", + "GSLB_Topology_Region", + "ALG_Log_Profile", + "Security_Log_Profile", + "Traffic_Log_Profile", + "Endpoint_Policy", + "Endpoint_Strategy", + "Bandwidth_Control_Policy", + "Idle_Timeout_Policy", + "Net_Address_List", + "Net_Port_List", + "Enforcement_Policy", + "Enforcement_Diameter_Endpoint_Profile", + "Enforcement_iRule", + "Enforcement_Radius_AAA_Profile", + "Enforcement_Profile", + "Enforcement_Subscriber_Management_Profile", + "Enforcement_Listener", + "Enforcement_Interception_Endpoint", + "Enforcement_Format_Script", + "Enforcement_Forwarding_Endpoint", + "Enforcement_Service_Chain_Endpoint", + "Analytics_Profile", + "Analytics_TCP_Profile", + "CA_Bundle", + "Certificate", + "Certificate_Validator_OCSP", + "DNS_Logging_Profile", + "HTTP_Acceleration_Profile", + "HTTP_Compress", + "HTTP_Profile", + "HTTP2_Profile", + "iRule", + "L4_Profile", + "Log_Destination", + "Log_Publisher", + "UDP_Profile" + ] + } + }, + "allOf": [ + { + "if": { + "properties": { + "class": { + "const": "Service_HTTP" + } + } + }, + "then": { + "$ref": "#/definitions/Service_HTTP" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Service_HTTPS" + } + } + }, + "then": { + "$ref": "#/definitions/Service_HTTPS" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Service_TCP" + } + } + }, + "then": { + "$ref": "#/definitions/Service_TCP" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Service_UDP" + } + } + }, + "then": { + "$ref": "#/definitions/Service_UDP" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Service_SCTP" + } + } + }, + "then": { + "$ref": "#/definitions/Service_SCTP" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Service_L4" + } + } + }, + "then": { + "$ref": "#/definitions/Service_L4" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Service_Generic" + } + } + }, + "then": { + "$ref": "#/definitions/Service_Generic" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Service_Forwarding" + } + } + }, + "then": { + "$ref": "#/definitions/Service_Forwarding" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Service_Address" + } + } + }, + "then": { + "$ref": "#/definitions/Service_Address" + } + }, + { + "if": { + "properties": { + "class": { + "const": "SNAT_Pool" + } + } + }, + "then": { + "$ref": "#/definitions/SNAT_Pool" + } + }, + { + "if": { + "properties": { + "class": { + "const": "SNAT_Translation" + } + } + }, + "then": { + "$ref": "#/definitions/SNAT_Translation" + } + }, + { + "if": { + "properties": { + "class": { + "const": "WAF_Policy" + } + } + }, + "then": { + "$ref": "#/definitions/WAF_Policy" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Persist" + } + } + }, + "then": { + "$ref": "#/definitions/Persist" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Pool" + } + } + }, + "then": { + "$ref": "#/definitions/Pool" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Address_Discovery" + } + } + }, + "then": { + "$ref": "#/definitions/Address_Discovery" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Monitor" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor" + } + }, + { + "if": { + "properties": { + "class": { + "const": "TLS_Server" + } + } + }, + "then": { + "$ref": "#/definitions/TLS_Server" + } + }, + { + "if": { + "properties": { + "class": { + "const": "TLS_Client" + } + } + }, + "then": { + "$ref": "#/definitions/TLS_Client" + } + }, + { + "if": { + "properties": { + "class": { + "const": "FIX_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/FIX_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "RTSP_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/RTSP_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "SIP_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/SIP_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Statistics_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Statistics_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "TFTP_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/TFTP_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "FTP_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/FTP_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "HTML_Rule" + } + } + }, + "then": { + "$ref": "#/definitions/HTML_Rule" + } + }, + { + "if": { + "properties": { + "class": { + "const": "HTML_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/HTML_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "WebSocket_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/WebSocket_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Multiplex_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Multiplex_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "SOCKS_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/SOCKS_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "TCP_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/TCP_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Classification_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Classification_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Radius_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Radius_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "IP_Other_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/IP_Other_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Rewrite_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Rewrite_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Stream_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Stream_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Access_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Access_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Per_Request_Access_Policy" + } + } + }, + "then": { + "$ref": "#/definitions/Per_Request_Access_Policy" + } + }, + { + "if": { + "properties": { + "class": { + "const": "ICAP_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/ICAP_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Adapt_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Adapt_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Cipher_Rule" + } + } + }, + "then": { + "$ref": "#/definitions/Cipher_Rule" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Cipher_Group" + } + } + }, + "then": { + "$ref": "#/definitions/Cipher_Group" + } + }, + { + "if": { + "properties": { + "class": { + "const": "iFile" + } + } + }, + "then": { + "$ref": "#/definitions/iFile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Firewall_Address_List" + } + } + }, + "then": { + "$ref": "#/definitions/Firewall_Address_List" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Firewall_Port_List" + } + } + }, + "then": { + "$ref": "#/definitions/Firewall_Port_List" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Firewall_Rule_List" + } + } + }, + "then": { + "$ref": "#/definitions/Firewall_Rule_List" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Firewall_Policy" + } + } + }, + "then": { + "$ref": "#/definitions/Firewall_Policy" + } + }, + { + "if": { + "properties": { + "class": { + "const": "NAT_Policy" + } + } + }, + "then": { + "$ref": "#/definitions/NAT_Policy" + } + }, + { + "if": { + "properties": { + "class": { + "const": "NAT_Source_Translation" + } + } + }, + "then": { + "$ref": "#/definitions/NAT_Source_Translation" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Protocol_Inspection_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Protocol_Inspection_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "SSH_Proxy_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/SSH_Proxy_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Data_Group" + } + } + }, + "then": { + "$ref": "#/definitions/Data_Group" + } + }, + { + "if": { + "properties": { + "class": { + "const": "DNS_Cache" + } + } + }, + "then": { + "$ref": "#/definitions/DNS_Cache" + } + }, + { + "if": { + "properties": { + "class": { + "const": "DNS_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/DNS_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "DNS_TSIG_Key" + } + } + }, + "then": { + "$ref": "#/definitions/DNS_TSIG_Key" + } + }, + { + "if": { + "properties": { + "class": { + "const": "DNS_Zone" + } + } + }, + "then": { + "$ref": "#/definitions/DNS_Zone" + } + }, + { + "if": { + "properties": { + "class": { + "const": "DNS_Nameserver" + } + } + }, + "then": { + "$ref": "#/definitions/DNS_Nameserver" + } + }, + { + "if": { + "properties": { + "class": { + "const": "DOS_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/DOS_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "GSLB_Domain" + } + } + }, + "then": { + "$ref": "#/definitions/GSLB_Domain" + } + }, + { + "if": { + "properties": { + "class": { + "const": "GSLB_iRule" + } + } + }, + "then": { + "$ref": "#/definitions/GSLB_iRule" + } + }, + { + "if": { + "properties": { + "class": { + "const": "GSLB_Monitor" + } + } + }, + "then": { + "$ref": "#/definitions/GSLB_Monitor" + } + }, + { + "if": { + "properties": { + "class": { + "const": "GSLB_Pool" + } + } + }, + "then": { + "$ref": "#/definitions/GSLB_Pool" + } + }, + { + "if": { + "properties": { + "class": { + "const": "GSLB_Server" + } + } + }, + "then": { + "$ref": "#/definitions/GSLB_Server" + } + }, + { + "if": { + "properties": { + "class": { + "const": "GSLB_Data_Center" + } + } + }, + "then": { + "$ref": "#/definitions/GSLB_Data_Center" + } + }, + { + "if": { + "properties": { + "class": { + "const": "GSLB_Prober_Pool" + } + } + }, + "then": { + "$ref": "#/definitions/GSLB_Prober_Pool" + } + }, + { + "if": { + "properties": { + "class": { + "const": "GSLB_Topology_Records" + } + } + }, + "then": { + "$ref": "#/definitions/GSLB_Topology_Records" + } + }, + { + "if": { + "properties": { + "class": { + "const": "GSLB_Topology_Region" + } + } + }, + "then": { + "$ref": "#/definitions/GSLB_Topology_Region" + } + }, + { + "if": { + "properties": { + "class": { + "const": "ALG_Log_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/ALG_Log_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Security_Log_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Security_Log_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Traffic_Log_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Traffic_Log_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Endpoint_Policy" + } + } + }, + "then": { + "$ref": "#/definitions/Endpoint_Policy" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Endpoint_Strategy" + } + } + }, + "then": { + "$ref": "#/definitions/Endpoint_Strategy" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Bandwidth_Control_Policy" + } + } + }, + "then": { + "$ref": "#/definitions/Bandwidth_Control_Policy" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Idle_Timeout_Policy" + } + } + }, + "then": { + "$ref": "#/definitions/Idle_Timeout_Policy" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Net_Address_List" + } + } + }, + "then": { + "$ref": "#/definitions/Net_Address_List" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Net_Port_List" + } + } + }, + "then": { + "$ref": "#/definitions/Net_Port_List" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Enforcement_Policy" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Policy" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Enforcement_Diameter_Endpoint_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Diameter_Endpoint_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Enforcement_iRule" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_iRule" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Enforcement_Radius_AAA_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Radius_AAA_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Enforcement_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Enforcement_Subscriber_Management_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Subscriber_Management_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Enforcement_Listener" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Listener" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Enforcement_Interception_Endpoint" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Interception_Endpoint" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Enforcement_Format_Script" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Format_Script" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Enforcement_Forwarding_Endpoint" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Forwarding_Endpoint" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Enforcement_Service_Chain_Endpoint" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Service_Chain_Endpoint" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Analytics_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Analytics_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Analytics_TCP_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/Analytics_TCP_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "CA_Bundle" + } + } + }, + "then": { + "$ref": "#/definitions/CA_Bundle" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Certificate" + } + } + }, + "then": { + "$ref": "#/definitions/Certificate" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Certificate_Validator_OCSP" + } + } + }, + "then": { + "$ref": "#/definitions/Certificate_Validator_OCSP" + } + }, + { + "if": { + "properties": { + "class": { + "const": "DNS_Logging_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/DNS_Logging_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "HTTP_Acceleration_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/HTTP_Acceleration_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "HTTP_Compress" + } + } + }, + "then": { + "$ref": "#/definitions/HTTP_Compress" + } + }, + { + "if": { + "properties": { + "class": { + "const": "HTTP_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/HTTP_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "HTTP2_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/HTTP2_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "iRule" + } + } + }, + "then": { + "$ref": "#/definitions/IRule" + } + }, + { + "if": { + "properties": { + "class": { + "const": "L4_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/L4_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Log_Destination" + } + } + }, + "then": { + "$ref": "#/definitions/Log_Destination" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Log_Publisher" + } + } + }, + "then": { + "$ref": "#/definitions/Log_Publisher" + } + }, + { + "if": { + "properties": { + "class": { + "const": "UDP_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/UDP_Profile" + } + } + ] + }, + "propertyNames": { + "pattern": "^[A-Za-z]([0-9A-Za-z_.-]{0,188}[0-9A-Za-z_.])?$", + "maxLength": 190 + }, + "allOf": [ + { + "if": { + "required": [ + "template" + ], + "properties": { + "template": { + "const": "https" + } + } + }, + "then": { + "$ref": "#/definitions/Template_https" + } + }, + { + "if": { + "required": [ + "template" + ], + "properties": { + "template": { + "const": "http" + } + } + }, + "then": { + "$ref": "#/definitions/Template_http" + } + }, + { + "if": { + "required": [ + "template" + ], + "properties": { + "template": { + "const": "tcp" + } + } + }, + "then": { + "$ref": "#/definitions/Template_tcp" + } + }, + { + "if": { + "required": [ + "template" + ], + "properties": { + "template": { + "const": "udp" + } + } + }, + "then": { + "$ref": "#/definitions/Template_udp" + } + }, + { + "if": { + "required": [ + "template" + ], + "properties": { + "template": { + "const": "sctp" + } + } + }, + "then": { + "$ref": "#/definitions/Template_sctp" + } + }, + { + "if": { + "required": [ + "template" + ], + "properties": { + "template": { + "const": "l4" + } + } + }, + "then": { + "$ref": "#/definitions/Template_l4" + } + }, + { + "if": { + "required": [ + "template" + ], + "properties": { + "template": { + "const": "generic" + } + } + }, + "then": { + "$ref": "#/definitions/Template_generic" + } + } + ], + "required": [ + "class" + ] + }, + "Template_https": { + "title": "HTTPS application", + "description": "Declares an HTTPS application", + "type": "object", + "properties": { + "serviceMain": { + "$ref": "#/definitions/Service_HTTPS" + } + }, + "required": [ + "serviceMain" + ] + }, + "Template_http": { + "title": "HTTP application", + "description": "Declares an HTTP application", + "type": "object", + "properties": { + "serviceMain": { + "$ref": "#/definitions/Service_HTTP" + } + }, + "required": [ + "serviceMain" + ] + }, + "Template_tcp": { + "title": "TCP application", + "description": "Declares a TCP application", + "type": "object", + "properties": { + "serviceMain": { + "$ref": "#/definitions/Service_TCP" + } + }, + "required": [ + "serviceMain" + ] + }, + "Template_udp": { + "title": "UDP application", + "description": "Declares a UDP application", + "type": "object", + "properties": { + "serviceMain": { + "$ref": "#/definitions/Service_UDP" + } + }, + "required": [ + "serviceMain" + ] + }, + "Template_sctp": { + "title": "SCTP application", + "description": "Declares a SCTP application", + "type": "object", + "properties": { + "serviceMain": { + "$ref": "#/definitions/Service_SCTP" + } + }, + "required": [ + "serviceMain" + ] + }, + "Template_l4": { + "title": "L4 application", + "description": "Declares a L4 application", + "type": "object", + "properties": { + "serviceMain": { + "$ref": "#/definitions/Service_L4" + } + }, + "required": [ + "serviceMain" + ] + }, + "Template_generic": { + "title": "Generic application", + "description": "Declares a generic application", + "type": "object", + "properties": { + "template": { + "title": "Template Name", + "description": "In addition to 'generic' and 'shared' other values may appear here for extensibility", + "type": "string" + }, + "serviceMain": { + "$ref": "#/definitions/Service_Generic" + } + } + }, + "Service_HTTP": { + "title": "Service_HTTP", + "description": "HTTP virtual server", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Service_HTTP" + }, + "virtualPort": { + "title": "Virtual server TCP port", + "description": "Default 80 is well-known HTTP port. Accepts either an integer or a reference to a Firewall_Port_List that contains the ports on which to listen. Firewall_Port_List is only supported on BIG-IP 14.1 and later. If a Firewall_Port_List is provided, BIG-IP AS3 will create a traffic-matching-criteria for the virtual.", + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Port_List" + }, + { + "f5PostProcess": { + "tag": "minVersion", + "data": { + "version": "14.1", + "strict": true + } + } + } + ] + } + ], + "default": 80 + } + }, + "allOf": [ + { + "$ref": "#/definitions/Service_HTTP_Core" + } + ], + "dependencies": { + "serverTLS": { + "not": {} + }, + "profileConnectivity": { + "oneOf": [ + { + "required": [ + "profileAccess" + ] + }, + { + "required": [ + "policyIAM" + ] + } + ] + }, + "policyPerRequestAccess": { + "oneOf": [ + { + "required": [ + "profileAccess" + ] + }, + { + "required": [ + "policyIAM" + ] + } + ] + } + }, + "required": [ + "class" + ] + }, + "Service_HTTPS": { + "title": "Service_HTTPS", + "description": "HTTPS (HTTP+TLS) virtual server", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Service_HTTPS" + }, + "virtualPort": { + "title": "Virtual server TCP port", + "description": "Default 443 is well-known HTTPS port. Accepts either an integer or a reference to a Firewall_Port_List that contains the ports on which to listen. Firewall_Port_List is only supported on BIG-IP 14.1 and later. If a Firewall_Port_List is provided, BIG-IP AS3 will create a traffic-matching-criteria for the virtual.", + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Port_List" + }, + { + "f5PostProcess": { + "tag": "minVersion", + "data": { + "version": "14.1", + "strict": true + } + } + } + ] + } + ], + "default": 443 + }, + "redirect80": { + "title": "Redirect HTTP", + "description": "If true, BIG-IP AS3 redirects HTTP traffic to any virtualAddress on port 80 to virtualPort", + "type": "boolean", + "default": true + }, + "profileHTTP2": { + "title": "HTTP/2 profile", + "type": [ + "string", + "object" + ], + "description": "HTTP/2 profile; name of built-in or else BIG-IP AS3 pointer", + "oneOf": [ + { + "type": "string", + "enum": [ + "basic" + ] + }, + { + "$ref": "#/definitions/Pointer_HTTP2_Profile" + }, + { + "type": "object", + "properties": { + "ingress": { + "type": "object", + "description": "Ingress (client-side context) HTTP2 profile. This property is available on BIGIP 14.1 and above.", + "allOf": [ + { + "$ref": "#/definitions/Pointer_HTTP2_Profile" + } + ] + }, + "egress": { + "type": "object", + "description": "Egress (server-side context) HTTP2 profile. This property is available on BIGIP 14.1 and above.", + "allOf": [ + { + "$ref": "#/definitions/Pointer_HTTP2_Profile" + } + ] + } + }, + "minProperties": 1, + "maxProperties": 1, + "additionalProperties": false + } + ] + } + }, + "allOf": [ + { + "$ref": "#/definitions/Service_HTTP_Core" + } + ], + "dependencies": { + "serverTLS": { + "properties": { + "serverTLS": { + "minLength": 1 + } + } + } + }, + "required": [ + "class", + "serverTLS" + ] + }, + "Service_HTTP_Core": { + "title": "HTTP VS core", + "type": "object", + "description": "Core attributes of HTTP(S) virtual server", + "properties": { + "persistenceMethods": { + "title": "Persistence methods", + "description": "Default 'cookie' is generally good. Use 'persistenceMethods: []' for no persistence.", + "type": "array", + "items": { + "$ref": "#/definitions/Basic_Persist" + }, + "default": [ + "cookie" + ] + }, + "profileAnalytics": { + "$ref": "#/definitions/Pointer_Analytics_Profile" + }, + "profileAnalyticsTcp": { + "$ref": "#/definitions/Pointer_Analytics_TCP_Profile" + }, + "profileHTTP": { + "title": "HTTP profile", + "description": "HTTP profile; name of built-in or else BIG-IP AS3 pointer", + "oneOf": [ + { + "type": "string", + "enum": [ + "basic" + ] + }, + { + "$ref": "#/definitions/Pointer_HTTP_Profile" + } + ], + "default": "basic" + }, + "profileHTTPCompression": { + "title": "HTTP compression profile", + "description": "HTTP compression profile; name of built-in or else BIG-IP AS3 pointer", + "if": { + "not": { + "type": "object" + } + }, + "then": { + "type": "string", + "enum": [ + "basic", + "wan" + ] + }, + "else": { + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to HTTP compression profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "HTTP_Compress" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP HTTP compression profile", + "description": "Pathname of existing BIG-IP HTTP compression profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile http-compression" + ] + } + } + }, + "profileHTTPAcceleration": { + "title": "Web acceleration profile", + "description": "Web acceleration profile; name of built-in or else BIG-IP AS3 pointer", + "if": { + "not": { + "type": "object" + } + }, + "then": { + "type": "string", + "enum": [ + "basic" + ] + }, + "else": { + "$ref": "#/definitions/Pointer_HTTP_Acceleration_Profile" + } + }, + "profileHTML": { + "$ref": "#/definitions/Pointer_HTML_Profile" + }, + "profileMultiplex": { + "title": "Multiplex profile", + "description": "Multiplex (OneConnect) profile; name of built-in or else BIG-IP AS3 pointer", + "if": { + "not": { + "type": "object" + } + }, + "then": { + "type": "string", + "enum": [ + "basic" + ] + }, + "else": { + "$ref": "#/definitions/Pointer_Multiplex_Profile" + } + }, + "profileNTLM": { + "$ref": "#/definitions/Pointer_NTLM_Profile" + }, + "policyWAF": { + "$ref": "#/definitions/Pointer_WAF_Policy" + }, + "policyIAM": { + "title": "IAM policy", + "description": "BIG-IP AS3 pointer to IAM (APM) policy declaration", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "apm" + ] + } + }, + { + "$ref": "#/definitions/Pointer_Access_Profile" + } + ] + }, + "profileFPS": { + "description": "FPS Profile to attach to service", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "fps" + ] + } + }, + { + "$ref": "#/definitions/Pointer_FPS_Profile" + } + ] + }, + "profileRequestAdapt": { + "$ref": "#/definitions/Pointer_Request_Adapt_Profile" + }, + "profileResponseAdapt": { + "$ref": "#/definitions/Pointer_Response_Adapt_Profile" + }, + "profileAccess": { + "title": "Access profile", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "apm" + ] + } + }, + { + "$ref": "#/definitions/Pointer_Access_Profile" + } + ] + }, + "profileConnectivity": { + "title": "Connectivity profile", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "apm" + ] + } + }, + { + "$ref": "#/definitions/Pointer_Connectivity_Profile" + } + ] + }, + "policyPerRequestAccess": { + "title": "Per Request Access Policy", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "apm" + ] + } + }, + { + "$ref": "#/definitions/Pointer_Per_Request_Access_Policy" + } + ] + }, + "profileVdi": { + "title": "VDI profile", + "description": "VDI profile to attach to service.", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "apm" + ] + } + }, + { + "$ref": "#/definitions/Pointer_VDI_Profile" + } + ] + }, + "profileApiProtection": { + "title": "API Protection Profile", + "description": "API protection profile to attach to service. This property is available on BIGIP 14.1 and above.", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "apm", + "asm" + ] + } + }, + { + "$ref": "#/definitions/Pointer_API_Protection_Profile" + } + ] + }, + "profileDOS": { + "$ref": "#/definitions/Pointer_DOS_Profile" + }, + "profileBotDefense": { + "description": "Attaches a Bot Defense profile to the service. This property is available on BIGIP 14.1 and above.", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Bot_Defense_Profile" + } + ] + }, + "profileWebSocket": { + "description": "Attaches a WebSocket profile to the Service.", + "allOf": [ + { + "$ref": "#/definitions/Pointer_WebSocket_Profile" + } + ] + } + }, + "allOf": [ + { + "if": { + "properties": { + "policyIAM": {} + }, + "required": [ + "policyIAM" + ] + }, + "then": { + "not": { + "properties": { + "profileAccess": {} + }, + "required": [ + "profileAccess" + ] + } + } + }, + { + "$ref": "#/definitions/Service_TCP_Core" + } + ], + "required": [ + "class" + ] + }, + "Service_TCP": { + "title": "Service_TCP", + "description": "Declares a TCP virtual server (w/optional TLS)", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Service_TCP" + }, + "mqttEnabled": { + "title": "MQTT profile", + "description": "Attaches the MQTT profile /Common/mqtt. MQTT profiles have no configurable properties.", + "type": "boolean", + "default": false + }, + "persistenceMethods": { + "title": "Persistence methods", + "description": "Default 'source-address' is generally good. Use 'persistenceMethods: []' for no persistence.", + "type": "array", + "items": { + "$ref": "#/definitions/Basic_Persist" + }, + "default": [ + "source-address" + ] + }, + "profileSIP": { + "$ref": "#/definitions/Pointer_SIP_Profile" + }, + "profileFTP": { + "$ref": "#/definitions/Pointer_FTP_Profile" + }, + "profileILX": { + "$ref": "#/definitions/Pointer_ILX_Profile" + }, + "profilePPTP": { + "$ref": "#/definitions/Pointer_PPTP_Profile" + }, + "profileRTSP": { + "$ref": "#/definitions/Pointer_RTSP_Profile" + }, + "profileSOCKS": { + "$ref": "#/definitions/Pointer_SOCKS_Profile" + }, + "profileICAP": { + "$ref": "#/definitions/Pointer_ICAP_Profile" + } + }, + "allOf": [ + { + "$ref": "#/definitions/Service_TCP_Core" + } + ], + "required": [ + "class" + ], + "if": { + "not": { + "properties": { + "virtualType": { + "const": "internal" + } + } + } + }, + "then": { + "required": [ + "virtualPort" + ], + "not": { + "required": [ + "profileICAP" + ] + } + } + }, + "Service_TCP_Core": { + "title": "Service_TCP core", + "description": "Core attributes of TCP virtual server", + "type": "object", + "properties": { + "virtualType": { + "title": "Virtual addresses", + "description": "Type of the virtual", + "type": "string", + "enum": [ + "standard", + "internal" + ], + "default": "standard" + }, + "virtualPort": { + "title": "virtual server TCP port", + "description": "Accepts either an integer or a reference to a Firewall_Port_List that contains the ports on which to listen. Firewall_Port_List is only supported on BIG-IP 14.1 and later. If a Firewall_Port_List is provided, BIG-IP AS3 will create a traffic-matching-criteria for the virtual.", + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Port_List" + }, + { + "f5PostProcess": { + "tag": "minVersion", + "data": { + "version": "14.1", + "strict": true + } + } + } + ] + } + ], + "minimum": 0, + "maximum": 65535 + }, + "layer4": { + "title": "L4 protocol", + "description": "For TCP virtual server, Layer 4 protocol must be TCP", + "type": "string", + "const": "tcp", + "default": "tcp" + }, + "profileFIX": { + "$ref": "#/definitions/Pointer_FIX_Profile" + }, + "profileTCP": { + "title": "TCP profile", + "description": "TCP profile; name of built-in or else BIG-IP AS3 pointer", + "if": { + "not": { + "type": "object" + } + }, + "then": { + "type": "string", + "enum": [ + "normal", + "lan", + "wan", + "mobile" + ] + }, + "else": { + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to TCP profile declaration for ingress and egress", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "TCP_Profile" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP TCP profile", + "description": "Pathname of existing BIG-IP TCP profile for both ingress and egress", + "type": "string", + "format": "f5bigip" + }, + "ingress": { + "title": "Ingress profile", + "description": "Ingress (client-side context) TCP profile", + "if": { + "not": { + "type": "object" + } + }, + "then": { + "type": "string", + "enum": [ + "normal", + "lan", + "wan", + "mobile" + ], + "default": "normal" + }, + "else": { + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to TCP profile declaration for incoming connections", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "TCP_Profile" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP TCP profile", + "description": "Pathname of existing BIG-IP TCP profile in client-side context", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1 + } + }, + "egress": { + "title": "Egress TCP profile", + "description": "Egress (server-side context) TCP profile", + "if": { + "not": { + "type": "object" + } + }, + "then": { + "type": "string", + "enum": [ + "normal", + "lan", + "wan", + "mobile" + ], + "default": "normal" + }, + "else": { + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to TCP profile declaration for outgoing connections", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "TCP_Profile" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP server-side TCP profile", + "description": "Pathname of existing BIG-IP TCP profile in server-side context", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1 + } + } + }, + "additionalProperties": false, + "dependencies": { + "use": { + "minProperties": 1, + "maxProperties": 1 + }, + "bigip": { + "minProperties": 1, + "maxProperties": 1 + }, + "ingress": { + "minProperties": 2, + "maxProperties": 2 + }, + "egress": { + "minProperties": 2, + "maxProperties": 2 + } + }, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile tcp" + ] + } + }, + "default": "normal" + }, + "profileAnalyticsTcp": { + "$ref": "#/definitions/Pointer_Analytics_TCP_Profile" + }, + "profileSSHProxy": { + "$ref": "#/definitions/Pointer_SSH_Proxy_Profile" + }, + "serverTLS": { + "title": "TLS server", + "description": "BIG-IP AS3 pointer to TLS Server declaration", + "if": { + "type": "string" + }, + "then": { + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "TLS_Server" + } + }, + "required": [ + "class" + ] + } + } + }, + "else": { + "if": { + "type": "object" + }, + "then": { + "$ref": "#/definitions/Pointer_Existing_TLS_Server_Profile" + }, + "else": { + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Existing_TLS_Server_Profile" + } + } + } + }, + "clientTLS": { + "title": "TLS client", + "description": "BIG-IP AS3 pointer to TLS Client declaration", + "if": { + "type": "string" + }, + "then": { + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "TLS_Client" + } + }, + "required": [ + "class" + ] + } + } + }, + "else": { + "if": { + "type": "object" + }, + "then": { + "$ref": "#/definitions/Pointer_Existing_TLS_Client_Profile" + }, + "else": { + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Existing_TLS_Client_Profile" + } + } + } + }, + "policyEndpoint": { + "title": "Endpoint policy", + "description": "BIG-IP AS3 pointer to Endpoint policy declaration", + "if": { + "type": "array" + }, + "then": { + "items": { + "$ref": "#/definitions/Pointer_Endpoint_Policy" + } + }, + "else": { + "$ref": "#/definitions/Pointer_Endpoint_Policy" + } + }, + "profileStream": { + "$ref": "#/definitions/Pointer_Stream_Profile" + } + }, + "allOf": [ + { + "$ref": "#/definitions/Service_Core" + } + ] + }, + "Service_UDP": { + "title": "Service_UDP", + "description": "Declares a UDP virtual server (w/optional (D)TLS)", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Service_UDP" + }, + "persistenceMethods": { + "title": "Persistence methods", + "description": "Default 'source-address' is generally good. Use 'persistenceMethods: []' for no persistence.", + "type": "array", + "items": { + "$ref": "#/definitions/Basic_Persist" + }, + "default": [ + "source-address" + ] + } + }, + "allOf": [ + { + "$ref": "#/definitions/Service_UDP_Core" + } + ], + "required": [ + "class" + ], + "if": { + "not": { + "properties": { + "virtualType": { + "const": "internal" + } + } + } + }, + "then": { + "required": [ + "virtualPort" + ] + }, + "dependencies": { + "virtualType": { + "if": { + "properties": { + "virtualType": { + "const": "stateless" + } + } + }, + "then": { + "properties": { + "translateClientPort": { + "const": false + }, + "translateServerPort": { + "const": false + } + }, + "required": [ + "pool" + ] + } + } + } + }, + "Service_UDP_Core": { + "title": "Service_UDP core", + "description": "Core attributes of UDP virtual server", + "type": "object", + "properties": { + "virtualType": { + "title": "Virtual addresses", + "description": "Type of the virtual", + "type": "string", + "enum": [ + "standard", + "internal", + "stateless" + ], + "default": "standard" + }, + "virtualPort": { + "title": "Virtual server UDP port", + "description": "Accepts either an integer or a reference to a Firewall_Port_List that contains the ports on which to listen. Firewall_Port_List is only supported on BIG-IP 14.1 and later. If a Firewall_Port_List is provided, BIG-IP AS3 will create a traffic-matching-criteria for the virtual.", + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Port_List" + }, + { + "f5PostProcess": { + "tag": "minVersion", + "data": { + "version": "14.1", + "strict": true + } + } + } + ] + } + ], + "minimum": 0, + "maximum": 65535 + }, + "layer4": { + "title": "L4 protocol", + "description": "For UDP virtual server, Layer 4 protocol must be UDP", + "type": "string", + "const": "udp", + "default": "udp" + }, + "profileUDP": { + "title": "UDP profile", + "description": "UDP profile; name of built-in or else BIG-IP AS3 pointer", + "if": { + "not": { + "type": "object" + } + }, + "then": { + "type": "string", + "enum": [ + "normal" + ] + }, + "else": { + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to UDP profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "UDP_Profile" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP UDP profile", + "description": "Pathname of existing BIG-IP UDP profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile udp" + ] + } + }, + "default": "normal" + }, + "serverTLS": { + "title": "TLS server", + "description": "BIG-IP AS3 pointer to TLS Server declaration", + "if": { + "type": "string" + }, + "then": { + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "TLS_Server" + } + }, + "required": [ + "class" + ] + } + } + }, + "else": { + "if": { + "type": "object" + }, + "then": { + "$ref": "#/definitions/Pointer_Existing_TLS_Server_Profile" + }, + "else": { + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Existing_TLS_Server_Profile" + } + } + } + }, + "clientTLS": { + "title": "TLS client", + "description": "BIG-IP AS3 pointer to TLS Client declaration", + "if": { + "type": "string" + }, + "then": { + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "TLS_Client" + } + }, + "required": [ + "class" + ] + } + } + }, + "else": { + "if": { + "type": "object" + }, + "then": { + "$ref": "#/definitions/Pointer_Existing_TLS_Client_Profile" + }, + "else": { + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Existing_TLS_Client_Profile" + } + } + } + }, + "policyEndpoint": { + "title": "Endpoint policy", + "description": "BIG-IP AS3 pointer to Endpoint policy declaration", + "if": { + "type": "array" + }, + "then": { + "items": { + "$ref": "#/definitions/Pointer_Endpoint_Policy" + } + }, + "else": { + "$ref": "#/definitions/Pointer_Endpoint_Policy" + } + }, + "profileRADIUS": { + "$ref": "#/definitions/Pointer_Radius_Profile" + }, + "profileSIP": { + "$ref": "#/definitions/Pointer_SIP_Profile" + }, + "profileTFTP": { + "$ref": "#/definitions/Pointer_TFTP_Profile" + } + }, + "allOf": [ + { + "$ref": "#/definitions/Service_Core" + } + ] + }, + "Service_SCTP": { + "title": "Service_SCTP", + "description": "Declares a SCTP virtual server", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Service_SCTP" + }, + "virtualPort": { + "title": "virtual server SCTP port", + "description": "Accepts either an integer or a reference to a Firewall_Port_List that contains the ports on which to listen. Firewall_Port_List is only supported on BIG-IP 14.1 and later. If a Firewall_Port_List is provided, BIG-IP AS3 will create a traffic-matching-criteria for the virtual.", + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Port_List" + }, + { + "f5PostProcess": { + "tag": "minVersion", + "data": { + "version": "14.1", + "strict": true + } + } + } + ] + } + ], + "minimum": 0, + "maximum": 65535 + }, + "profileSCTP": { + "$ref": "#/definitions/Pointer_SCTP_Profile" + }, + "layer4": { + "title": "L4 protocol", + "description": "For SCTP virtual server, Layer 4 protocol must be SCTP", + "type": "string", + "const": "sctp", + "default": "sctp" + } + }, + "allOf": [ + { + "$ref": "#/definitions/Service_Core" + } + ], + "required": [ + "class", + "virtualPort" + ] + }, + "Service_L4": { + "title": "Service_L4", + "description": "Declares a L4 (FastL4) virtual server", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Service_L4" + }, + "persistenceMethods": { + "title": "Persistence methods", + "description": "Default 'source-address' is generally good. Use 'persistenceMethods: []' for no persistence.", + "type": "array", + "items": { + "$ref": "#/definitions/Basic_Persist" + }, + "default": [ + "source-address" + ] + } + }, + "allOf": [ + { + "$ref": "#/definitions/Service_L4_Core" + } + ], + "required": [ + "class", + "virtualPort" + ], + "not": { + "required": [ + "profileTrafficLog" + ] + } + }, + "Service_Generic": { + "title": "Service_Generic", + "description": "Declares an 'Any IP' (IPOther) virtual server", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Service_Generic" + }, + "layer4": { + "title": "L4 protocol", + "description": "The L4 protocol type for this virtual server", + "type": "string", + "default": "any" + }, + "profileIPOther": { + "allOf": [ + { + "$ref": "#/definitions/Pointer_IP_Other_Profile" + } + ], + "default": { + "bigip": "/Common/ipother" + } + } + }, + "allOf": [ + { + "$ref": "#/definitions/Service_L4_Core" + } + ], + "required": [ + "class" + ] + }, + "Service_L4_Core": { + "title": "Service_L4 core", + "description": "Core attributes of L4 virtual server", + "type": "object", + "properties": { + "virtualPort": { + "title": "virtual server TCP port", + "description": "Accepts either an integer or a reference to a Firewall_Port_List that contains the ports on which to listen. Firewall_Port_List is only supported on BIG-IP 14.1 and later. If a Firewall_Port_List is provided, BIG-IP AS3 will create a traffic-matching-criteria for the virtual.", + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Port_List" + }, + { + "f5PostProcess": { + "tag": "minVersion", + "data": { + "version": "14.1", + "strict": true + } + } + } + ] + } + ], + "minimum": 0, + "maximum": 65535 + }, + "layer4": { + "title": "L4 protocol", + "description": "The L4 protocol type for this virtual server", + "type": "string", + "enum": [ + "any", + "tcp", + "udp", + "3pc", + "a/n", + "ah", + "argus", + "aris", + "ax.25", + "bbn-rcc", + "bna", + "br-sat-mon", + "cbt", + "cftp", + "chaos", + "compaq-peer", + "cphb", + "cpnx", + "crdup", + "crtp", + "dccp", + "dcn", + "ddp", + "ddx", + "dgp", + "dsr", + "egp", + "eigrp", + "emcon", + "encap", + "esp", + "etherip", + "fc", + "fire", + "ggp", + "gmtp", + "gre", + "hip", + "hmp", + "hopopt", + "i-nlsp", + "iatp", + "icmp", + "idpr", + "idpr-cmtp", + "idrp", + "ifmp", + "igmp", + "igp", + "il", + "ip", + "ipcomp", + "ipcv", + "ipencap", + "ipip", + "iplt", + "ippc", + "ipv6", + "ipv6-auth", + "ipv6-crypt", + "ipv6-frag", + "ipv6-icmp", + "ipv6-nonxt", + "ipv6-opts", + "ipv6-route", + "ipx-in-ip", + "irtp", + "isis", + "iso-ip", + "iso-tp4", + "kryptolan", + "l2tp", + "larp", + "leaf-1", + "leaf-2", + "manet", + "merit-inp", + "mfe-nsp", + "micp", + "mobile", + "mpls-in-ip", + "mtp", + "mux", + "narp", + "netblt", + "nsfnet-igp", + "nvp", + "ospf", + "pgm", + "pim", + "pipe", + "pnni", + "prm", + "ptp", + "pup", + "pvp", + "qnx", + "rdp", + "rsvp", + "rsvp-e2e-ignore", + "rvd", + "sat-expak", + "sat-mon", + "scc-sp", + "scps", + "sctp", + "sdrp", + "secure-vmtp", + "shim6", + "skip", + "sm", + "smp", + "snp", + "sprite-rpc", + "sps", + "srp", + "sscopmce", + "st", + "stp", + "sun-nd", + "swipe", + "tcf", + "tlsp", + "tp++", + "trunk-1", + "trunk-2", + "ttp", + "udplite", + "uti", + "vines", + "visa", + "vmtp", + "vrrp", + "wb-expak", + "wb-mon", + "wesp", + "wsn", + "xnet", + "xns-idp", + "xtp" + ], + "default": "tcp" + }, + "profileFIX": { + "$ref": "#/definitions/Pointer_FIX_Profile" + }, + "profileL4": { + "title": "L4 profile", + "description": "L4 profile; name of built-in or else BIG-IP AS3 pointer", + "if": { + "not": { + "type": "object" + } + }, + "then": { + "type": "string", + "enum": [ + "basic" + ] + }, + "else": { + "$ref": "#/definitions/Pointer_L4_Profile" + }, + "default": "basic" + }, + "profileAnalyticsTcp": { + "$ref": "#/definitions/Pointer_Analytics_TCP_Profile" + } + }, + "allOf": [ + { + "$ref": "#/definitions/Service_Core" + } + ] + }, + "Service_Forwarding": { + "title": "Service_Forwarding", + "description": "Attributes of a forwarding virtual server. ARP and ICMP Echo will be disabled on virtualAddresses by default.", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Service_Forwarding" + }, + "forwardingType": { + "title": "Forwarding Type", + "description": "Controls whether the forwarding service uses IP or L2 forwarding", + "type": "string", + "enum": [ + "ip", + "l2" + ] + }, + "layer4": { + "title": "L4 protocol", + "description": "Layer 4 protocol", + "type": "string", + "default": "any" + }, + "profileL4": { + "title": "L4 profile", + "description": "L4 profile; name of built-in or else BIG-IP AS3 pointer", + "if": { + "not": { + "type": "object" + } + }, + "then": { + "type": "string", + "enum": [ + "basic" + ] + }, + "else": { + "$ref": "#/definitions/Pointer_L4_Profile" + } + } + }, + "allOf": [ + { + "if": { + "properties": { + "forwardingType": { + "const": "ip" + } + } + }, + "then": { + "properties": { + "translateServerPort": { + "type": "boolean", + "default": false, + "const": false + }, + "translateServerAddress": { + "type": "boolean", + "default": false, + "const": false + } + } + } + }, + { + "$ref": "#/definitions/Service_Core" + } + ], + "required": [ + "class", + "forwardingType" + ], + "not": { + "anyOf": [ + { + "required": [ + "fallbackPersistenceMethod" + ] + }, + { + "required": [ + "persistenceMethods" + ] + }, + { + "required": [ + "pool" + ] + }, + { + "required": [ + "profileBotDefense" + ] + }, + { + "required": [ + "profileDiameterEndpoint" + ] + }, + { + "required": [ + "profileDNS" + ] + }, + { + "required": [ + "profileIPOther" + ] + }, + { + "required": [ + "profileProtocolInspection" + ] + }, + { + "required": [ + "profileRewrite" + ] + }, + { + "required": [ + "profileTrafficLog" + ] + }, + { + "required": [ + "sourceAddress" + ] + } + ] + } + }, + "Service_Core": { + "title": "Virtual-server core", + "description": "Core attributes of a virtual server", + "type": "object", + "properties": { + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "virtualAddresses": { + "title": "Virtual addresses", + "description": "Accepts either an array or a reference to an Address_List which contains destination addresses to which this virtual will listen. To accept connections only from certain subnet(s), replace IP address in the provided array with array [IP-address, accept-from-subnet]. IP address in the provided array can also be replaced by a reference to a Service_Address. A reference to an Address_List is only supported on BIG-IP 14.1 and later. If an Address_List is provided, BIG-IP AS3 will create a traffic-matching-criteria for the virtual.", + "oneOf": [ + { + "type": "array", + "f5PostProcess": { + "tag": "virtualAddress" + }, + "items": { + "if": { + "type": "string" + }, + "then": { + "format": "f5ip" + }, + "else": { + "if": { + "type": "array" + }, + "then": { + "type": "array", + "items": { + "title": "Virtual address", + "if": { + "type": "string" + }, + "then": { + "format": "f5ip" + }, + "else": { + "$ref": "#/definitions/Pointer_Service_Address" + } + }, + "minItems": 2, + "maxItems": 2, + "uniqueItems": true + }, + "else": { + "$ref": "#/definitions/Pointer_Service_Address" + } + } + }, + "minItems": 1, + "uniqueItems": true + }, + { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Address_List" + }, + { + "f5PostProcess": { + "tag": "minVersion", + "data": { + "version": "14.1", + "strict": true + } + } + } + ] + } + ] + }, + "serviceDownImmediateAction": { + "title": "Service Down Immediate Action", + "description": "Specifies the immediate action the BIG-IP system should respond with upon the receipt of the initial client's SYN packet if the availability status of the virtual server is Offline or Unavailable. This is supported for the virtual server of Standard type and TCP protocol. The default value is none.", + "type": "string", + "enum": [ + "none", + "drop", + "reset" + ], + "default": "none" + }, + "shareAddresses": { + "title": "Share addresses", + "description": "A user set boolean that indicates whether the virtualAddresses should be added to or checked for /Common instead of the tenant. This value defaults to false, and so will put the virtualAddresses into their tenant.", + "type": "boolean", + "default": false + }, + "sourceAddress": { + "title": "Source address", + "description": "Accepts either a string or a reference to an Address_List which contains source addresses from which this virtual will listen. A reference to an Address_List is only supported on BIG-IP 14.1 and later. If an Address_List is provided, BIG-IP AS3 will create a traffic-matching-criteria for the virtual.", + "oneOf": [ + { + "type": "string", + "format": "f5ip" + }, + { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Address_List" + }, + { + "f5PostProcess": { + "tag": "minVersion", + "data": { + "version": "14.1", + "strict": true + } + } + } + ] + } + ] + }, + "enable": { + "title": "Enable", + "description": "Virtual server handles traffic only when enabled (default)", + "type": "boolean", + "default": true + }, + "maxConnections": { + "title": "Maximum connections", + "description": "Specifies the maximum number of concurrent connections you want to allow for the virtual server", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "snat": { + "title": "SNAT", + "description": "Name of built-in SNAT method or BIG-IP AS3 pointer to SNAT pool. If 'self', the system uses the virtual-server address as SNAT address", + "if": { + "not": { + "type": "object" + } + }, + "then": { + "type": "string", + "enum": [ + "none", + "self", + "auto" + ] + }, + "else": { + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to SNAT pool declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "SNAT_Pool" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP SNAT pool", + "description": "Pathname of existing BIG-IP SNAT pool", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm snatpool" + ] + } + }, + "default": "auto" + }, + "iRules": { + "title": "iRules", + "description": "List iRules for this virtual server (order is significant)", + "type": "array", + "items": { + "title": "iRule", + "description": "BIG-IP AS3 pointer to iRule (declared separately)", + "if": { + "type": "string" + }, + "then": { + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "iRule" + } + }, + "required": [ + "class" + ] + } + } + }, + "else": { + "type": "object", + "properties": { + "bigip": { + "title": "BIG-IP iRule", + "description": "Pathname of existing BIG-IP iRule", + "type": "string", + "format": "f5bigip" + }, + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to iRule (declared separately)", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "iRule" + } + }, + "required": [ + "class" + ] + } + } + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm rule" + ] + } + } + }, + "$comment": "uniqueItems: true" + }, + "pool": { + "title": "Pool", + "description": "BIG-IP AS3 pointer to pool if any (declared separately)", + "if": { + "type": "string" + }, + "then": { + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Pool" + } + }, + "required": [ + "class" + ] + } + } + }, + "else": { + "type": "object", + "properties": { + "bigip": { + "title": "BIG-IP pool", + "description": "Pathname of existing BIG-IP pool", + "type": "string", + "format": "f5bigip" + }, + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to pool if any (declared separately)", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Pool" + } + }, + "required": [ + "class" + ] + } + } + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm pool" + ] + } + } + }, + "addressStatus": { + "title": "Address status", + "description": "Specifies whether the virtual server will contribute to the operational status of the associated virtual address", + "type": "boolean", + "default": true + }, + "mirroring": { + "title": "Mirroring", + "description": "Controls connection-mirroring for high-availability", + "type": "string", + "enum": [ + "none", + "L4" + ], + "default": "none" + }, + "policyBandwidthControl": { + "title": "Bandwidth Control Policy", + "description": "BIG-IP AS3 pointer to Bandwidth Control Policy (policy must be static)", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Bandwidth_Control_Policy" + } + ] + }, + "policyFirewallEnforced": { + "title": "Firewall policy (enforced)", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + } + }, + { + "$ref": "#/definitions/Pointer_Firewall_Policy" + } + ] + }, + "policyFirewallStaged": { + "title": "Firewall policy (staged)", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + } + }, + { + "$ref": "#/definitions/Pointer_Firewall_Policy" + } + ] + }, + "policyNAT": { + "description": "BIG-IP AS3 pointer to NAT policy declaration", + "type": "object", + "properties": { + "bigip": { + "title": "BIG-IP NAT policy", + "description": "Pathname of existing BIG-IP NAT policy", + "type": "string", + "format": "f5bigip" + }, + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to NAT policy declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "NAT_Policy" + } + }, + "required": [ + "class" + ] + } + } + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + } + }, + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security nat policy" + ] + } + } + ] + }, + "policyIdleTimeout": { + "$ref": "#/definitions/Pointer_Idle_Timeout_Policy" + }, + "lastHop": { + "title": "Last hop", + "description": "Name of built-in last-hop method or BIG-IP AS3 pointer to last-hop pool (default 'default' means use system setting)", + "if": { + "not": { + "type": "object" + } + }, + "then": { + "type": "string", + "enum": [ + "default", + "auto", + "disable" + ] + }, + "else": { + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to last-hop pool declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Pool" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP last-hop pool", + "description": "Pathname of existing BIG-IP pool", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm pool" + ] + } + }, + "default": "default" + }, + "translateClientPort": { + "title": "Translate client port", + "description": "If true, hide client's port number from server. A value of true is the same as the string 'change' while a value of false is the same as the string 'preserve'. The value 'preserve-strict' is the only other allowed value for a string", + "type": [ + "boolean", + "string" + ], + "default": false, + "oneOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "change", + "preserve", + "preserve-strict" + ] + } + ] + }, + "translateServerAddress": { + "title": "Translate server address", + "description": "If true (default), make server-side connection to server address (otherwise, treat server as gateway to virtual-server address)", + "type": "boolean", + "default": true + }, + "translateServerPort": { + "title": "Translate server port", + "description": "If true (default), make server-side connection to server port (otherwise, connect to server on virtual-server port)", + "type": "boolean", + "default": true + }, + "nat64Enabled": { + "title": "Translate IPv6 to IPv4", + "description": "If true, translate IPv6 traffic into IPv4 (default false)", + "type": "boolean", + "default": false + }, + "httpMrfRoutingEnabled": { + "title": "HTTP MRF Router", + "description": "Specifies whether to use the HTTP message routing framework (MRF) functionality. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + }, + "persistenceMethods": { + "title": "Persistence method(s)", + "description": "List of persistence methods (each by name or BIG-IP AS3 pointer). Element 0 is primary (default) persistence method. Use 'persistenceMethods: []' for no persistence.", + "type": "array", + "items": { + "$ref": "#/definitions/Basic_Persist" + }, + "$comment": "uniqueItems: true" + }, + "fallbackPersistenceMethod": { + "$ref": "#/definitions/Basic_Persist" + }, + "allowVlans": { + "title": "VLAN list to allow", + "description": "Names of existing VLANs to add to this virtual server to allow.", + "type": "array", + "items": { + "bigip": { + "title": "BIG-IP VLAN", + "description": "Pathname of existing BIG-IP VLAN", + "type": "string", + "format": "f5bigip" + } + } + }, + "rejectVlans": { + "title": "VLAN list to reject", + "description": "Names of existing VLANs to add to this virtual server to reject.", + "type": "array", + "items": { + "bigip": { + "title": "BIG-IP VLAN", + "description": "Pathname of existing BIG-IP VLAN", + "type": "string", + "format": "f5bigip" + } + } + }, + "securityLogProfiles": { + "title": "Security Log Profiles", + "description": "Specifies the log profile applied to the virtual server", + "type": "array", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm", + "asm" + ] + }, + "items": { + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to security log profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Security_Log_Profile" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP security log profile", + "description": "Pathname of existing BIG-IP security log profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security log profile" + ] + } + } + }, + "profileDiameterEndpoint": { + "$ref": "#/definitions/Pointer_Enforcement_Diameter_Endpoint_Profile" + }, + "profileEnforcement": { + "$ref": "#/definitions/Pointer_Enforcement_Profile" + }, + "profileSubscriberManagement": { + "$ref": "#/definitions/Pointer_Enforcement_Subscriber_Management_Profile" + }, + "profileIPOther": { + "$ref": "#/definitions/Pointer_IP_Other_Profile" + }, + "profileClassification": { + "$ref": "#/definitions/Pointer_Classification_Profile" + }, + "profileDNS": { + "$ref": "#/definitions/Pointer_DNS_Profile" + }, + "profileStatistics": { + "$ref": "#/definitions/Pointer_Statistics_Profile" + }, + "profileTrafficLog": { + "$ref": "#/definitions/Pointer_Traffic_Log_Profile" + }, + "profileRewrite": { + "$ref": "#/definitions/Pointer_Rewrite_Profile" + }, + "profileProtocolInspection": { + "description": "BIG-IP AS3 pointer to Protocol Inspection Profile declaration", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + } + }, + { + "$ref": "#/definitions/Pointer_Protocol_Inspection_Profile" + } + ] + }, + "metadata": { + "$ref": "#/definitions/Metadata" + }, + "rateLimit": { + "description": "Specifies the maximum number of connections per second allowed for a virtual server", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "clonePools": { + "$ref": "#/definitions/Clone_Pools" + }, + "maximumBandwidth": { + "description": "Specifies the maximum bandwidth allowed, in Mbps.", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + }, + "oneOf": [ + { + "type": "integer", + "minimum": 10, + "maximum": 1000000 + }, + { + "type": "string", + "const": "infinite" + } + ] + }, + "ipIntelligencePolicy": { + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm", + "asm" + ] + } + }, + { + "$ref": "#/definitions/Pointer_IP_Intelligence_Policy" + } + ] + }, + "profileIntegratedBotDefense": { + "description": "BIG-IP AS3 pointer to an Integrated Bot Defense Profile. These are only supported in tmos version 17.0+.", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Integrated_Bot_Defense_Profile" + } + ] + }, + "adminState": { + "title": "Administration State", + "description": "Specifies the state of the Service. When set to disable the Service no longer accepts new connection requests, but will allow current connections to finish processing before going to a down state.", + "type": "string", + "enum": [ + "enable", + "disable" + ], + "default": "enable" + } + }, + "allOf": [ + { + "if": { + "properties": { + "allowVlans": {} + }, + "required": [ + "allowVlans" + ] + }, + "then": { + "not": { + "properties": { + "rejectVlans": {} + }, + "required": [ + "rejectVlans" + ] + } + } + }, + { + "if": { + "not": { + "required": [ + "virtualType" + ], + "properties": { + "virtualType": { + "const": "internal" + } + } + } + }, + "then": { + "required": [ + "virtualAddresses" + ] + } + }, + { + "$ref": "#/definitions/Include" + } + ], + "dependencies": { + "fallbackPersistenceMethod": [ + "persistenceMethods" + ] + } + }, + "Clone_Pools": { + "title": "Clone Pools", + "description": "Specifies a pool that the virtual server uses to replicate either client or server traffic", + "type": "object", + "properties": { + "ingress": { + "title": "Ingress Clone Pool", + "description": "Ingress (client-side context) clone pool", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Pool" + } + ] + }, + "egress": { + "title": "Egress Clone Pool", + "description": "Egress (server-side context) clone pool", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Pool" + } + ] + } + }, + "additionalProperties": false, + "anyOf": [ + { + "required": [ + "ingress" + ] + }, + { + "required": [ + "egress" + ] + } + ] + }, + "Service_Address": { + "title": "Service_Address", + "description": "Service IP address definition (BIG-IP virtual-address). NOTE: When BIG-IP AS3 creates a Service_Address, it is placed in /tenant/serviceAddress (and not /tenant/app/serviceAddress) on the BIG-IP system.", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Service_Address" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "virtualAddress": { + "title": "Virtual address", + "description": "The virtual IP address. Defaults to mask /32.", + "type": "string", + "format": "f5ip" + }, + "arpEnabled": { + "title": "Enable ARP", + "description": "If true (default), the system services ARP requests on this address", + "type": "boolean", + "default": true + }, + "icmpEcho": { + "title": "Enable ICMP echo", + "description": "If true (default), the system answers ICMP echo requests on this address", + "type": "string", + "enum": [ + "enable", + "disable", + "selective" + ], + "default": "enable" + }, + "routeAdvertisement": { + "title": "Enable route advertisement", + "description": "If true, the route is advertised", + "type": "string", + "enum": [ + "enable", + "disable", + "selective", + "always", + "any", + "all" + ], + "default": "disable" + }, + "spanningEnabled": { + "title": "Enable spanning", + "description": "Enable all BIG-IP systems in device group to listen for and process traffic on the same virtual address", + "type": "boolean", + "default": false + }, + "trafficGroup": { + "title": "Traffic Group", + "description": "Specifies the traffic group which the Service_Address belongs.", + "type": "string", + "default": "default" + } + }, + "dependencies": { + "arpEnabled": { + "$comment": "Only 1 of 2 can be true.", + "if": { + "properties": { + "arpEnabled": { + "const": true + } + } + }, + "then": { + "properties": { + "spanningEnabled": { + "const": false + } + } + } + } + }, + "required": [ + "virtualAddress" + ], + "additionalProperties": false + }, + "SNAT_Pool": { + "title": "SNAT_Pool", + "description": "Declares a list of SNAT addresses", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "SNAT_Pool" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "snatAddresses": { + "title": "SNAT addresses", + "description": "List of SNAT addresses-- may include both IPv4 and IPv6", + "type": "array", + "items": { + "title": "SNAT address", + "type": "string", + "format": "f5ip" + }, + "minItems": 1, + "uniqueItems": true + } + }, + "additionalProperties": false, + "required": [ + "class", + "snatAddresses" + ] + }, + "SNAT_Translation": { + "title": "SNAT_Translation", + "description": "Configures explicit secure network address translation (SNAT) address", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "SNAT_Translation" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "address": { + "title": "Address", + "description": "The IP address of the SNAT translation", + "type": "string", + "format": "f5ip" + }, + "adminState": { + "title": "Administration State", + "description": "Specifies the state of the SNAT translation", + "type": "string", + "enum": [ + "enable", + "disable" + ], + "default": "enable" + }, + "arpEnabled": { + "title": "Enable ARP", + "description": "Specifies that the NAT sends ARP requests", + "type": "boolean", + "default": true + }, + "ipIdleTimeout": { + "title": "IP Idle Timeout", + "description": "Specifies time in seconds that connections to an IP address initiated using a SNAT address are allowed to remain idle before being automatically disconnected. Specifying 'indefinite' prevents the connection from timing out.", + "oneOf": [ + { + "type": "integer", + "maximum": 4294967295, + "minimum": 1 + }, + { + "type": "string", + "const": "indefinite" + } + ], + "default": "indefinite" + }, + "maxConnections": { + "title": "Maximum Connections", + "description": "Specifies a limit on the number of connections a translation address must reach before it no longer initiates a connection. A value of 0 indicates the setting is disabled.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 0 + }, + "tcpIdleTimeout": { + "title": "TCP Idle Timeout", + "description": "Specifies time in seconds that TCP connections initiated using a SNAT address are allowed to remain idle before being automatically disconnected. Specifying 'indefinite' prevents the connection from timing out.", + "oneOf": [ + { + "type": "integer", + "maximum": 4294967295, + "minimum": 1 + }, + { + "type": "string", + "const": "indefinite" + } + ], + "default": "indefinite" + }, + "trafficGroup": { + "title": "Traffic Group", + "description": "Specifies the traffic group which the SNAT_Translation belongs", + "type": "string", + "default": "default" + }, + "udpIdleTimeout": { + "title": "UDP Idle Timeout", + "description": "Specifies time in seconds that UDP connections initiated using a SNAT address are allowed to remain idle before being automatically disconnected. Specifying 'indefinite' prevents the connection from timing out.", + "oneOf": [ + { + "type": "integer", + "maximum": 4294967295, + "minimum": 1 + }, + { + "type": "string", + "const": "indefinite" + } + ], + "default": "indefinite" + } + }, + "additionalProperties": false, + "required": [ + "class", + "address" + ] + }, + "WAF_Policy": { + "title": "WAF_Policy", + "description": "A Web Application Firewall Policy. Supports both traditional and advanced WAF policies. Advanced WAF policies require TMOS version 16.0 or newer.", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "asm" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "WAF_Policy" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "url": { + "title": "URL", + "description": "The URL to pull the ASM policy from", + "allOf": [ + { + "$ref": "#/definitions/Resource_URL" + } + ] + }, + "file": { + "title": "File", + "description": "The absolute file path for the ASM policy stored on the BIG-IP", + "type": "string", + "minLength": 3, + "allOf": [ + { + "f5PostProcess": { + "tag": "expand" + } + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "string" + } + } + ] + }, + "policy": { + "description": "Reference to a WAF Policy", + "allOf": [ + { + "$ref": "#/definitions/F5string" + }, + { + "f5PostProcess": { + "tag": "expand", + "data": { + "when": "1/expand" + } + } + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "string" + } + } + ] + }, + "ignoreChanges": { + "title": "Ignore changes", + "description": "If false (default), the system updates the policy in every BIG-IP AS3 declaration deployment. If true, BIG-IP AS3 creates the policy on first deployment, and leaves it untouched afterwards", + "type": "boolean", + "default": false + }, + "enforcementMode": { + "title": "Enforcement Mode", + "description": "Overrides the enforcement mode setting of the WAF policy. Ignored on Advanced WAF policies", + "type": "string", + "enum": [ + "blocking", + "transparent" + ] + }, + "serverTechnologies": { + "title": "Server Technologies", + "description": "Define server technologies for the WAF Policy, such as Java Servlets or Apache Struts. Ignored on Advanced WAF policies", + "type": "array", + "items": { + "title": "Server Technology", + "type": "string" + }, + "uniqueItems": true + }, + "disabledSignatures": { + "title": "Disabled attack signatures", + "description": "Disable various attack signatures by ID. Ignored on Advanced WAF policies", + "type": "array", + "items": { + "title": "Attack Signature ID", + "type": "integer", + "minimum": 200000000, + "maximum": 399999999 + }, + "uniqueItems": true + }, + "expand": { + "title": "Expand", + "description": "Performs AS3 string expansion on specified values within the WAF Policy. WAF Policies that are not in JSON format will be ignored", + "type": "array", + "items": { + "title": "JSON pointer", + "description": "A JSON pointer to a value within the WAF Policy that requires AS3 string expansion. Pointing to a parent property results in AS3 traversing the sub-properties and expanding any strings that it may find", + "type": "string" + }, + "uniqueItems": true + } + }, + "additionalProperties": false, + "required": [ + "class" + ], + "oneOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "file" + ] + }, + { + "required": [ + "policy" + ] + } + ] + }, + "Basic_Persist": { + "title": "Basic Persist", + "description": "Holds name of simple persistence method or BIG-IP AS3 pointer to persistence method", + "if": { + "type": "string" + }, + "then": { + "enum": [ + "cookie", + "destination-address", + "msrdp", + "source-address", + "tls-session-id" + ] + }, + "else": { + "$ref": "#/definitions/Pointer_Persist_Profile" + } + }, + "Persist": { + "title": "Persist", + "description": "Declares a persistence method", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Persist" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "persistenceMethod": { + "title": "Persistence method", + "description": "You may customize each basic persistence method", + "type": "string", + "enum": [ + "cookie", + "destination-address", + "hash", + "msrdp", + "sip-info", + "source-address", + "tls-session-id", + "universal" + ] + }, + "matchAcrossPools": { + "title": "Match across pools", + "description": "Specifies that the system can use any pool that contains this persistence record", + "type": "boolean", + "default": false + }, + "matchAcrossVirtualPorts": { + "title": "Match across virtual ports", + "description": "Specifies that all persistent connections from a client IP address that go to the same virtual IP address also go to the same node", + "type": "boolean", + "default": false + }, + "matchAcrossVirtualAddresses": { + "title": "Match across virtual addresses", + "description": "Specifies that all persistent connections from the same client IP address go to the same node", + "type": "boolean", + "default": false + }, + "mirror": { + "title": "Mirror", + "description": "If true, try to maintain persistence even after HA failover of ADC (default false)", + "type": "boolean", + "default": false + }, + "overrideConnectionLimit": { + "title": "Override connection limit", + "description": "If true, do not enforce pool member connection limit for persisted connections (default false)", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "if": { + "properties": { + "persistenceMethod": { + "const": "cookie" + } + } + }, + "then": { + "$ref": "#/definitions/Persist_Cookie" + } + }, + { + "if": { + "properties": { + "persistenceMethod": { + "enum": [ + "destination-address", + "source-address" + ] + } + } + }, + "then": { + "$ref": "#/definitions/Persist_Addr" + } + }, + { + "if": { + "properties": { + "persistenceMethod": { + "const": "hash" + } + } + }, + "then": { + "$ref": "#/definitions/Persist_Hash" + } + }, + { + "if": { + "properties": { + "persistenceMethod": { + "const": "msrdp" + } + } + }, + "then": { + "$ref": "#/definitions/Persist_MSRDP" + } + }, + { + "if": { + "properties": { + "persistenceMethod": { + "const": "sip-info" + } + } + }, + "then": { + "$ref": "#/definitions/Persist_SIP" + } + }, + { + "if": { + "properties": { + "persistenceMethod": { + "const": "tls-session-id" + } + } + }, + "then": { + "$ref": "#/definitions/Persist_TLS_Session" + } + }, + { + "if": { + "properties": { + "persistenceMethod": { + "const": "universal" + } + } + }, + "then": { + "$ref": "#/definitions/Persist_UIE" + } + } + ], + "dependencies": { + "use": { + "not": {} + }, + "bigip": { + "not": {} + } + }, + "required": [ + "class", + "persistenceMethod" + ] + }, + "Persist_Addr": { + "title": "Address persistence", + "description": "Configures an address affinity persistence profile", + "type": "object", + "properties": { + "duration": { + "title": "Duration", + "description": "Lifetime of persistence record (seconds, default 180)", + "type": "integer", + "minimum": 0, + "maximum": 604800, + "default": 180 + }, + "hashAlgorithm": { + "title": "Hash algorithm", + "description": "Specifies the algorithm the system uses for hash persistence load balancing. The hash result is the input for the algorithm.", + "type": "string", + "enum": [ + "carp", + "default" + ], + "default": "default" + }, + "addressMask": { + "title": "Address mask", + "description": "Optional mask selects portion of address used by simple persistence (if omitted the system uses all address bits)", + "type": "string", + "format": "f5ip" + } + } + }, + "Persist_Cookie": { + "title": "Cookie persistence", + "description": "Configures a cookie persistence profile", + "type": "object", + "properties": { + "duration": { + "title": "Duration", + "description": "Lifetime of persistence record (seconds, default 0 means indefinite)", + "type": "integer", + "minimum": 0, + "maximum": 604800, + "default": 0 + }, + "cookieMethod": { + "title": "Method", + "description": "Selects cookie processing method (default is insert)", + "type": "string", + "enum": [ + "insert", + "hash", + "passive", + "rewrite" + ], + "default": "insert" + }, + "cookieName": { + "title": "Cookie name", + "description": "Cookie name (for method 'insert', default (empty-string) yields system-generated name)", + "type": "string", + "pattern": "^[0-9A-Za-z.~#$%^&*_-]*$", + "maxLength": 64, + "default": "" + } + }, + "if": { + "properties": { + "cookieMethod": { + "const": "insert" + } + } + }, + "then": { + "properties": { + "ttl": { + "title": "TTL", + "description": "Requested cookie lifetime (seconds, default 0 means session cookie)", + "type": "integer", + "minimum": 0, + "maximum": 604800, + "default": 0 + }, + "httpOnly": { + "title": "HTTP only flag", + "description": "If true (default) the system sets the HTTPOnly flag", + "type": "boolean", + "default": true + }, + "secure": { + "title": "Secure flag", + "description": "If true (default) the system sets the Secure (TLS) flag", + "type": "boolean", + "default": true + }, + "alwaysSet": { + "title": "Always set", + "description": "If true, set cookie with every HTTP response (default false)", + "type": "boolean", + "default": false + }, + "encrypt": { + "title": "Encrypt cookie", + "description": "If true, prevent disclosure of (or tampering with) ADC info in cookie (default false, to reduce latency)", + "type": "boolean", + "default": false + }, + "passphrase": { + "title": "Passphrase", + "description": "Used to create secret key for cookie encryption", + "type": "object", + "properties": { + "allowReuse": { + "description": "If true, other declaration objects may reuse this value", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Secret" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "object" + } + }, + { + "f5PostProcess": { + "tag": "secret" + } + } + ] + } + }, + "if": { + "properties": { + "encrypt": { + "const": true + } + }, + "required": [ + "encrypt" + ] + }, + "then": { + "required": [ + "passphrase" + ] + } + }, + "else": { + "if": { + "properties": { + "cookieMethod": { + "const": "hash" + } + } + }, + "then": { + "properties": { + "cookieName": { + "minLength": 1 + }, + "startAt": { + "title": "Start at", + "description": "Index of first octet in cookie value to hash", + "type": "integer", + "minimum": 0, + "maximum": 4096, + "default": 0 + }, + "hashCount": { + "title": "Hash count", + "description": "Number of octets in cookie value to hash; 0 (default) means all", + "type": "integer", + "minimum": 0, + "maximum": 4096, + "default": 0 + } + } + }, + "else": { + "$comment": "No extra properties for passive or rewrite." + } + } + }, + "Persist_Hash": { + "title": "Hash persistence", + "description": "Configures a hash persistence profile", + "type": "object", + "properties": { + "duration": { + "title": "Duration", + "description": "Lifetime of persistence record (seconds, default 180)", + "type": "integer", + "minimum": 0, + "maximum": 604800, + "default": 180 + }, + "hashAlgorithm": { + "title": "Hash algorithm", + "description": "Specifies the algorithm the system uses for hash persistence load balancing. The hash result is the input for the algorithm.", + "type": "string", + "enum": [ + "carp", + "default" + ], + "default": "default" + }, + "startAt": { + "title": "Start at", + "description": "Index of first octet in packet to hash", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 0 + }, + "count": { + "title": "Hash count", + "description": "Number of octets in cookie value to hash; 0 (default) means all", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 0 + }, + "startPattern": { + "title": "Start pattern", + "description": "Regular expression which matches start of data to hash; default \"\" averts matching", + "type": "string", + "default": "" + }, + "endPattern": { + "title": "End pattern", + "description": "Regular expression which matches end of data to hash; default \"\" averts matching", + "type": "string", + "default": "" + }, + "bufferLimit": { + "title": "Buffer limit", + "description": "Number of octets to buffer while pattern-matching", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 0 + }, + "iRule": { + "title": "iRule", + "description": "BIG-IP AS3 pointer to iRule if any (declared separately)", + "if": { + "type": "string" + }, + "then": { + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "iRule" + } + }, + "required": [ + "class" + ] + } + } + }, + "else": { + "type": "object", + "properties": { + "bigip": { + "title": "BIG-IP iRule", + "description": "Pathname of existing BIG-IP iRule", + "type": "string", + "format": "f5bigip" + }, + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to iRule (declared separately)", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "iRule" + } + }, + "required": [ + "class" + ] + } + } + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm rule" + ] + } + } + } + } + }, + "Persist_MSRDP": { + "title": "MSRDP persistence", + "description": "Configures a Microsoft(r) Remote Display Protocol (MSRDP) persistence profile", + "type": "object", + "properties": { + "duration": { + "title": "Duration", + "description": "Lifetime of persistence record (seconds, default 300)", + "type": "integer", + "minimum": 0, + "maximum": 604800, + "default": 300 + }, + "sessionBroker": { + "title": "Session broker", + "description": "If true (default), the system will persist the client to the server chosen by session broker", + "type": "boolean", + "default": true + } + } + }, + "Persist_SIP": { + "title": "SIP info persistence", + "description": "Configures a Session Initiation Protocol (SIP) persistence profile", + "type": "object", + "properties": { + "duration": { + "title": "Duration", + "description": "Lifetime of persistence record (seconds, default 180)", + "type": "integer", + "minimum": 0, + "maximum": 604800, + "default": 180 + }, + "header": { + "title": "SIP header", + "description": "Suggested values include: Call-ID, To, From, SIP-ETag, and Subject", + "type": "string", + "minLength": 1 + } + }, + "required": [ + "header" + ] + }, + "Persist_TLS_Session": { + "title": "TLS session persistence", + "description": "Configures a Secure Socket Layer (SSL) persistence profile", + "type": "object", + "properties": { + "duration": { + "title": "Duration", + "description": "Lifetime of persistence record (seconds, default 300)", + "type": "integer", + "minimum": 0, + "maximum": 604800, + "default": 300 + } + } + }, + "Persist_UIE": { + "title": "Universal persistence", + "description": "Configures a universal persistence profile", + "type": "object", + "properties": { + "duration": { + "title": "Duration", + "description": "Lifetime of persistence record (seconds, default 180)", + "type": "integer", + "minimum": 0, + "maximum": 604800, + "default": 180 + }, + "iRule": { + "title": "iRule", + "description": "BIG-IP AS3 pointer to required iRule (declared separately)", + "if": { + "type": "string" + }, + "then": { + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "iRule" + } + }, + "required": [ + "class" + ] + } + } + }, + "else": { + "type": "object", + "properties": { + "bigip": { + "title": "BIG-IP iRule", + "description": "Pathname of existing BIG-IP iRule", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "required": [ + "bigip" + ], + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm rule" + ] + } + } + } + }, + "required": [ + "iRule" + ] + }, + "Pool": { + "title": "Pool", + "description": "Declares a service pool", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Pool" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "allowNATEnabled": { + "title": "Enable Allow NAT", + "description": "If true (default), NATs are automatically enabled for any connections using this pool.", + "type": "boolean", + "default": true + }, + "allowSNATEnabled": { + "title": "Enable Allow SNAT", + "description": "If true (default), SNATs are automatically enabled for any connections using this pool.", + "type": "boolean", + "default": true + }, + "loadBalancingMode": { + "title": "LB mode", + "description": "Load-balancing mode", + "type": "string", + "enum": [ + "dynamic-ratio-member", + "dynamic-ratio-node", + "fastest-app-response", + "fastest-node", + "least-connections-member", + "least-connections-node", + "least-sessions", + "observed-member", + "observed-node", + "predictive-member", + "predictive-node", + "ratio-least-connections-member", + "ratio-least-connections-node", + "ratio-member", + "ratio-node", + "ratio-session", + "round-robin", + "weighted-least-connections-member", + "weighted-least-connections-node" + ], + "default": "round-robin" + }, + "minimumMembersActive": { + "title": "Minimum active", + "description": "Pool is down when fewer than this number of members are up", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 1 + }, + "monitors": { + "title": "Monitors", + "description": "List of health monitors (each by name or BIG-IP AS3 pointer)", + "type": "array", + "items": { + "$ref": "#/definitions/Basic_Monitor" + }, + "$comment": "uniqueItems: true" + }, + "minimumMonitors": { + "title": "Minimum monitors", + "description": "Member is down when fewer than minimum monitors report it healthy. Specify 'all' to require all monitors to be up.", + "oneOf": [ + { + "type": "string", + "const": "all" + }, + { + "type": "integer", + "minimum": 1, + "maximum": 63 + } + ] + }, + "members": { + "title": "Members", + "description": "Set of Pool members", + "type": "array", + "items": { + "$ref": "#/definitions/Pool_Member" + }, + "$comment": "uniqueItems: true", + "f5PostProcess": { + "tag": "node" + } + }, + "metadata": { + "$ref": "#/definitions/Metadata" + }, + "reselectTries": { + "title": "Reselect tries", + "description": "Maximum number of attempts to find a responsive member for a connection", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 0 + }, + "serviceDownAction": { + "title": "Service-down action", + "description": "Specifies connection handling when member is non-responsive", + "type": "string", + "enum": [ + "drop", + "none", + "reselect", + "reset" + ], + "default": "none" + }, + "slowRampTime": { + "title": "Slow ramp time", + "description": "BIG-IP AS3 slowly the connection rate to a newly-active member slowly during this interval (seconds)", + "type": "integer", + "minimum": 0, + "maximum": 900, + "default": 10 + } + }, + "additionalProperties": false, + "if": { + "required": [ + "monitors" + ] + }, + "then": { + "properties": { + "minimumMonitors": { + "default": 1 + } + } + }, + "required": [ + "class" + ] + }, + "Address_Discovery_Common": { + "type": "object", + "allOf": [ + { + "if": { + "properties": { + "addressDiscovery": { + "enum": [ + "fqdn", + "aws", + "azure", + "gce", + "consul" + ] + } + }, + "required": [ + "addressDiscovery" + ] + }, + "then": { + "properties": { + "updateInterval": { + "title": "Update interval", + "description": "Server-discovery update interval (seconds)", + "type": "integer", + "minimum": 1, + "maximum": 3600, + "default": 60 + } + }, + "not": { + "required": [ + "bigip" + ] + } + } + }, + { + "if": { + "properties": { + "addressDiscovery": { + "const": "static" + } + } + }, + "then": { + "oneOf": [ + { + "required": [ + "bigip" + ] + }, + { + "properties": { + "serverAddresses": { + "title": "Server addresses", + "description": "Static IP addresses of servers (nodes). Shorthand for 'servers' where you only want to specify the address property.", + "type": "array", + "items": { + "title": "Server address", + "description": "Static IP address for this server (node)", + "type": "string", + "format": "f5ip" + }, + "uniqueItems": true + }, + "servers": { + "title": "Servers", + "description": "Same as serverAddresses, but allowing for further specification of each node.", + "type": "array", + "items": { + "title": "Servers", + "description": "Static IP address and other details for this server (node)", + "type": "object", + "properties": { + "address": { + "title": "Server address", + "description": "Static IP address for this server (node)", + "type": "string", + "format": "f5ip" + }, + "name": { + "title": "Name", + "type": "string", + "pattern": "^[A-Za-z][0-9A-Za-z_.-]*$", + "maxLength": 64 + } + }, + "required": [ + "address" + ], + "additionalProperties": false + } + } + }, + "if": { + "required": [ + "monitors" + ] + }, + "then": { + "properties": { + "minimumMonitors": { + "default": 1 + } + } + }, + "anyOf": [ + { + "required": [ + "serverAddresses" + ] + }, + { + "required": [ + "servers" + ] + } + ] + } + ] + } + }, + { + "if": { + "properties": { + "addressDiscovery": { + "const": "fqdn" + } + }, + "required": [ + "addressDiscovery" + ] + }, + "then": { + "properties": { + "hostname": { + "title": "Hostname", + "type": "string", + "format": "hostname" + }, + "addressFamily": { + "title": "Address family", + "description": "Selects IPv4/6 and DNS A/AAAA RR's", + "type": "string", + "enum": [ + "IPv4", + "IPv6" + ], + "default": "IPv4" + }, + "autoPopulate": { + "title": "Auto-populate", + "description": "If true use multiple server (node) addresses when available, otherwise use only one", + "type": "boolean", + "default": false + }, + "queryInterval": { + "title": "Query interval", + "description": "Normal DNS query interval (seconds, default 0 means RR TTL)", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "downInterval": { + "title": "Down interval", + "description": "DNS retry interval after resolution failure (seconds)", + "type": "integer", + "minimum": 0, + "default": 5 + }, + "fqdnPrefix": { + "description": "String to prepend onto the hostname to create the node name", + "type": "string", + "oneOf": [ + { + "pattern": "^[A-Za-z][0-9A-Za-z_.-]*$" + }, + { + "const": "" + } + ], + "default": "" + } + }, + "if": { + "required": [ + "monitors" + ] + }, + "then": { + "properties": { + "minimumMonitors": { + "default": 1 + } + } + }, + "required": [ + "hostname" + ] + } + }, + { + "if": { + "properties": { + "addressDiscovery": { + "const": "aws" + } + }, + "required": [ + "addressDiscovery" + ] + }, + "then": { + "$ref": "#/definitions/Service_Discovery_AWS" + } + }, + { + "if": { + "properties": { + "addressDiscovery": { + "const": "azure" + } + }, + "required": [ + "addressDiscovery" + ] + }, + "then": { + "$ref": "#/definitions/Service_Discovery_Azure" + } + }, + { + "if": { + "properties": { + "addressDiscovery": { + "const": "gce" + } + }, + "required": [ + "addressDiscovery" + ] + }, + "then": { + "$ref": "#/definitions/Service_Discovery_GCE" + } + }, + { + "if": { + "properties": { + "addressDiscovery": { + "const": "consul" + } + }, + "required": [ + "addressDiscovery" + ] + }, + "then": { + "$ref": "#/definitions/Service_Discovery_Consul" + } + } + ] + }, + "Address_Discovery": { + "title": "Address_Discovery", + "description": "Sharable Pool Member information", + "type": "object", + "properties": { + "class": { + "type": "string", + "const": "Address_Discovery" + }, + "addressDiscovery": { + "title": "Address discovery", + "description": "Selects how server (node) addresses are discovered", + "type": "string", + "enum": [ + "static", + "fqdn", + "event", + "aws", + "gce", + "azure", + "consul" + ], + "f5serviceDiscovery": true + }, + "shareNodes": { + "description": "If enabled, nodes are created in /Common instead of the tenant's partition", + "type": "boolean", + "default": false + } + }, + "required": [ + "addressDiscovery" + ], + "allOf": [ + { + "$ref": "#/definitions/Address_Discovery_Common" + } + ] + }, + "Pool_Member": { + "title": "Pool member", + "description": "Declares a service-pool member", + "type": "object", + "properties": { + "remark": { + "$ref": "#/definitions/Remark" + }, + "servicePort": { + "title": "Service port", + "description": "Service L4 port (optional port-discovery may override)", + "type": "integer", + "minimum": 0, + "maximum": 65535 + }, + "bigip": { + "title": "BIG-IP node", + "description": "If defined, pathname of existing BIG-IP node", + "type": "string", + "format": "f5bigip" + }, + "enable": { + "description": "Maps to BIG-IP pool member state", + "type": "boolean", + "default": true + }, + "connectionLimit": { + "title": "Connection limit", + "description": "Maximum concurrent connections to member", + "type": "integer", + "minimum": 0, + "maximum": 2147483647, + "default": 0 + }, + "rateLimit": { + "title": "Rate limit", + "description": "Value zero prevents use of member", + "type": "integer", + "minimum": -1, + "maximum": 2147483647, + "default": -1 + }, + "dynamicRatio": { + "title": "Dynamic ratio", + "description": "Specifies a range of numbers that you want the system to use in conjunction with the ratio load balancing method", + "type": "integer", + "minimum": 0, + "maximum": 100, + "default": 1 + }, + "ratio": { + "title": "Ratio", + "description": "Specifies the weight of the pool member for load balancing purposes", + "type": "integer", + "minimum": 0, + "maximum": 100, + "default": 1 + }, + "priorityGroup": { + "title": "Priority group", + "description": "Specifies the priority group within the pool for this pool member", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 0 + }, + "monitors": { + "title": "Monitors", + "description": "List of monitors (each by name or BIG-IP AS3 pointer)", + "type": "array", + "items": { + "$ref": "#/definitions/Basic_Monitor" + }, + "$comment": "uniqueItems: true" + }, + "minimumMonitors": { + "title": "Minimum monitors", + "description": "Member is down when fewer than minimum monitors report it healthy", + "type": "integer", + "minimum": 0, + "maximum": 63 + }, + "metadata": { + "$ref": "#/definitions/Metadata" + }, + "adminState": { + "title": "Administration State", + "description": "Setting adminState to enable will create the node in an operational state. Set to disable to disallow new connections but allow existing connections to drain. Set to offline to force immediate termination of all connections.", + "type": "string", + "enum": [ + "enable", + "disable", + "offline" + ], + "default": "enable" + }, + "addressDiscovery": { + "title": "Address discovery", + "description": "Selects how server (node) addresses are discovered", + "type": [ + "string", + "object" + ], + "if": { + "type": "string" + }, + "then": { + "enum": [ + "static", + "fqdn", + "event", + "aws", + "gce", + "azure", + "consul" + ] + }, + "else": { + "$ref": "#/definitions/Pointer_Address_Discovery" + }, + "default": "static", + "f5serviceDiscovery": { + "exceptions": [ + "static", + "fqdn" + ] + } + }, + "shareNodes": { + "description": "If enabled, nodes are created in /Common instead of the tenant's partition", + "type": "boolean", + "default": false + }, + "routeDomain": { + "description": "The Route Domain to use for the pool member", + "$comment": "Due to the fact the Route Domain id is required for address modification, BIG-IP AS3 does NOT support this route domain reference as anything but the id.", + "type": "integer", + "minimum": 0, + "maximum": 65534 + } + }, + "required": [ + "servicePort" + ], + "allOf": [ + { + "$ref": "#/definitions/Address_Discovery_Common" + }, + { + "if": { + "required": [ + "bigip" + ] + }, + "then": { + "if": { + "required": [ + "monitors" + ] + }, + "then": { + "properties": { + "minimumMonitors": { + "default": 1 + } + } + } + } + }, + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm node" + ] + } + } + ] + }, + "Service_Discovery_Polling_Core": { + "type": "object", + "properties": { + "addressRealm": { + "title": "Address realm", + "description": "Specifies whether to look for public or private IP addresses", + "type": "string", + "enum": [ + "public", + "private" + ], + "default": "private" + }, + "credentialUpdate": { + "title": "Credential Update", + "type": "boolean", + "description": "Specifies whether you are updating your credentials", + "default": false + }, + "undetectableAction": { + "title": "Undetectable Action", + "description": "Action to take when node cannot be detected", + "type": "string", + "enum": [ + "disable", + "remove" + ], + "default": "remove" + } + } + }, + "Service_Discovery_Polling_Core_Tagged": { + "properties": { + "tagKey": { + "title": "Tag key", + "type": "string", + "minLength": 1, + "description": "The tag key associated with the node to add to this pool" + }, + "tagValue": { + "title": "Tag value", + "type": "string", + "minLength": 1, + "description": "The tag value associated with the node to add to this pool" + } + }, + "allOf": [ + { + "$ref": "#/definitions/Service_Discovery_Polling_Core" + } + ] + }, + "Service_Discovery_AWS": { + "description": "Service Discovery properties for Amazon Web Services (AWS)", + "properties": { + "region": { + "title": "AWS region", + "description": "Empty string (default) means region in which ADC is running", + "type": "string", + "default": "" + }, + "roleARN": { + "title": "Role Amazon Resource Name", + "description": "Assume a role (also requires the externalId field)", + "type": "string", + "minLength": 1 + }, + "externalId": { + "title": "External Id", + "description": "External Id", + "type": "string", + "minLength": 1 + }, + "accessKeyId": { + "title": "Access Key Id", + "description": "Information for discovering AWS nodes that are not in the same region as your BIG-IP (also requires the secretAccessKey field", + "type": "string", + "minLength": 1 + }, + "secretAccessKey": { + "title": "Secret Access Key", + "description": "Will be stored in the declaration as an encrypted string", + "oneOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "allOf": [ + { + "required": [ + "ciphertext" + ] + }, + { + "$ref": "#/definitions/Secret" + } + ] + } + ], + "f5PostProcess": { + "tag": "longSecret" + } + } + }, + "dependencies": { + "roleARN": { + "required": [ + "externalId" + ] + }, + "externalId": { + "required": [ + "roleARN" + ] + }, + "accessKeyId": { + "required": [ + "secretAccessKey" + ] + }, + "secretAccessKey": { + "required": [ + "accessKeyId" + ] + } + }, + "if": { + "required": [ + "monitors" + ] + }, + "then": { + "properties": { + "minimumMonitors": { + "type": "integer", + "default": 1 + } + } + }, + "required": [ + "region", + "tagKey", + "tagValue" + ], + "allOf": [ + { + "$ref": "#/definitions/Service_Discovery_Polling_Core_Tagged" + } + ] + }, + "Service_Discovery_Azure": { + "description": "Service Discovery properties for Azure", + "properties": { + "resourceGroup": { + "title": "Resource group", + "description": "Azure Resource Group name", + "type": "string" + }, + "subscriptionId": { + "title": "Subscription ID", + "description": "Azure subscription ID", + "type": "string" + }, + "useManagedIdentity": { + "title": "Use Managed Identity", + "description": "Use Azure managed identity rather than directoryId, applicationId, and apiAccessKey", + "type": "boolean", + "default": false + }, + "directoryId": { + "title": "(Azure) Directory ID", + "description": "Azure Active Directory ID (AKA tenant ID)", + "type": "string" + }, + "applicationId": { + "title": "(Azure) Application ID", + "description": "Azure registered application ID (AKA client ID)", + "type": "string" + }, + "apiAccessKey": { + "title": "Azure API access key", + "description": "Azure registered application API access key (AKA service principal secret). Will be stored in the declaration in an encrypted format.", + "oneOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "allOf": [ + { + "required": [ + "ciphertext" + ] + }, + { + "$ref": "#/definitions/Secret" + } + ] + } + ], + "f5PostProcess": { + "tag": "longSecret" + } + }, + "resourceType": { + "description": "Type of resource identified by resourceId. This can be used in place of tagKey/tagValue.", + "type": "string", + "enum": [ + "tag", + "scaleSet" + ] + }, + "resourceId": { + "description": "ID of resource to find nodes by.", + "type": "string" + }, + "environment": { + "title": "Azure environment", + "description": "Azure environment name. Required if environment should not be determined by instance metadata.", + "type": "string", + "default": "Azure" + } + }, + "required": [ + "resourceGroup", + "subscriptionId" + ], + "allOf": [ + { + "$ref": "#/definitions/Service_Discovery_Polling_Core_Tagged" + }, + { + "if": { + "required": [ + "monitors" + ] + }, + "then": { + "properties": { + "minimumMonitors": { + "type": "integer", + "default": 1 + } + } + } + }, + { + "if": { + "required": [ + "tagKey", + "tagValue" + ] + }, + "then": { + "not": { + "required": [ + "resourceId", + "resourceType" + ] + } + }, + "else": { + "required": [ + "resourceId", + "resourceType" + ], + "not": { + "required": [ + "tagKey", + "tagValue" + ] + } + } + }, + { + "if": { + "properties": { + "useManagedIdentity": { + "const": true + } + } + }, + "then": { + "allOf": [ + { + "not": { + "required": [ + "directoryId" + ] + } + }, + { + "not": { + "required": [ + "applicationId" + ] + } + }, + { + "not": { + "required": [ + "apiAccessKey" + ] + } + } + ] + }, + "else": { + "required": [ + "directoryId", + "applicationId", + "apiAccessKey" + ] + } + } + ] + }, + "Service_Discovery_GCE": { + "description": "Service Discovery properties for Google Compute Engine (GCE)", + "properties": { + "region": { + "title": "GCE region", + "description": "Empty string (default) means region in which ADC is running", + "type": "string" + }, + "encodedCredentials": { + "title": "Encoded Service Account Credentials", + "description": "Base 64 encoded service account credentials JSON", + "oneOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "allOf": [ + { + "required": [ + "ciphertext" + ] + }, + { + "$ref": "#/definitions/Secret" + } + ] + } + ], + "f5PostProcess": { + "tag": "longSecret" + } + }, + "projectId": { + "title": "Project Id", + "description": "For Google Cloud Engine (GCE) only: The ID of the project in which the members are located", + "type": "string" + } + }, + "if": { + "required": [ + "monitors" + ] + }, + "then": { + "properties": { + "minimumMonitors": { + "type": "integer", + "default": 1 + } + } + }, + "required": [ + "region", + "tagKey", + "tagValue" + ], + "allOf": [ + { + "$ref": "#/definitions/Service_Discovery_Polling_Core_Tagged" + } + ] + }, + "Service_Discovery_Consul": { + "description": "Service Discovery properties for Consul", + "properties": { + "uri": { + "title": "URI", + "type": "string", + "minLength": 1, + "description": "The location of the node data" + }, + "encodedToken": { + "title": "Encoded ACL Token", + "description": "Base 64 encoded bearer token to make requests to the Consul API. Will be stored in the declaration in an encrypted format.", + "oneOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "allOf": [ + { + "required": [ + "ciphertext" + ] + }, + { + "$ref": "#/definitions/Secret" + } + ] + } + ], + "f5PostProcess": { + "tag": "longSecret" + } + }, + "trustCA": { + "title": "Trusted CA bundle", + "description": "CA Bundle to validate server certificates", + "allOf": [ + { + "$ref": "#/definitions/Pointer_CA_Bundle" + } + ] + }, + "rejectUnauthorized": { + "title": "Reject Unauthorized Connection", + "description": "If true, the server certificate is verified against the list of supplied/default CAs when making requests to the Consul API.", + "type": "boolean", + "default": true + }, + "jmesPathQuery": { + "title": "JMESPath Query", + "type": "string", + "description": "Custom JMESPath Query" + } + }, + "if": { + "required": [ + "monitors" + ] + }, + "then": { + "properties": { + "minimumMonitors": { + "type": "integer", + "default": 1 + } + } + }, + "required": [ + "uri" + ], + "allOf": [ + { + "$ref": "#/definitions/Service_Discovery_Polling_Core" + } + ] + }, + "Basic_Monitor": { + "title": "Basic Monitor", + "description": "Holds name of simple monitor or BIG-IP AS3 pointer to a monitor declaration", + "if": { + "type": "string" + }, + "then": { + "enum": [ + "http", + "https", + "http2", + "icmp", + "tcp-half-open", + "tcp" + ] + }, + "else": { + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to monitor declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Monitor" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP monitor", + "description": "Pathname of existing BIG-IP monitor", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "probe ltm monitor icmp" + ] + } + } + }, + "Monitor": { + "title": "Monitor", + "description": "Declares a (possibly complex) monitor", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Monitor" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "monitorType": { + "title": "Monitor type", + "description": "You may customize each monitor type", + "type": "string", + "enum": [ + "dns", + "external", + "ftp", + "http", + "https", + "http2", + "icmp", + "inband", + "ldap", + "mysql", + "postgresql", + "radius", + "sip", + "smtp", + "tcp", + "tcp-half-open", + "udp" + ] + } + }, + "allOf": [ + { + "if": { + "not": { + "properties": { + "monitorType": { + "const": "inband" + } + } + } + }, + "then": { + "properties": { + "targetAddress": { + "title": "Address", + "description": "IP address monitor should probe; if empty (default) then pool member address", + "type": "string", + "format": "f5ip", + "default": "" + }, + "interval": { + "title": "Interval", + "description": "Poll interval (seconds)", + "type": "integer", + "minimum": 0, + "maximum": 3600, + "default": 5 + }, + "upInterval": { + "title": "Up-Interval", + "description": "Poll interval when service is already up (seconds)", + "type": "integer", + "minimum": 0, + "maximum": 3600, + "default": 0 + }, + "timeUntilUp": { + "title": "Time until up", + "description": "Delay between successful probe and sending traffic to node (seconds)", + "type": "integer", + "minimum": 0, + "maximum": 1800, + "default": 0 + }, + "timeout": { + "title": "Timeout", + "description": "Time limit for node to respond (seconds)", + "type": "integer", + "minimum": 0, + "maximum": 900, + "default": 16 + } + } + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "icmp" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor_ICMP" + }, + "else": { + "if": { + "properties": { + "monitorType": { + "const": "inband" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor_Inband" + }, + "else": { + "properties": { + "targetPort": { + "title": "Port", + "description": "L4 port (if any) monitor should probe; if 0 (default) then pool member port", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 0 + } + } + } + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "http" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor_HTTP" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "https" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor_HTTPS" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "http2" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor_HTTP2" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "external" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor_External" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "tcp" + } + } + }, + "then": { + "properties": { + "dscp": { + "title": "IP DSCP", + "description": "Value for IP DSCP (ex-TOS) field (default 0)", + "type": "integer", + "minimum": 0, + "maximum": 63, + "default": 0 + } + }, + "allOf": [ + { + "$ref": "#/definitions/Monitor_TCP" + } + ] + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "udp" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor_UDP" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "smtp" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor_SMTP" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "mysql" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor_MySQL" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "postgresql" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor_PostgreSQL" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "sip" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor_SIP" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "tcp-half-open" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor_TCP_Half_Open" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "ldap" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor_LDAP" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "dns" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor_DNS" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "radius" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor_RADIUS" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "ftp" + } + } + }, + "then": { + "$ref": "#/definitions/Monitor_FTP" + } + } + ], + "required": [ + "class", + "monitorType" + ] + }, + "Monitor_May_Adapt": { + "description": "Additional Monitor class properties available when monitorType = http, https, tcp, udp, or icmp", + "type": "object", + "properties": { + "adaptive": { + "title": "Adaptive", + "description": "If true, use adaptive probe timing", + "type": "boolean", + "default": false + }, + "adaptiveDivergenceType": { + "title": "Adaptive divergence type", + "description": "Adaptive divergence, 'absolute' selects milliseconds, 'relative' (default) selects percentage", + "type": "string", + "enum": [ + "absolute", + "relative" + ], + "default": "relative" + }, + "adaptiveDivergenceMilliseconds": { + "title": "Adaptive divergence msec", + "description": "Probe fails if response latency exceeds mean by this number of milliseconds", + "type": "integer", + "minimum": 1, + "maximum": 10000, + "default": 500 + }, + "adaptiveDivergencePercentage": { + "title": "Adaptive divergence percent", + "description": "Probe fails if response latency exceeds mean by this percentage", + "type": "integer", + "minimum": 1, + "maximum": 500, + "default": 100 + }, + "adaptiveLimitMilliseconds": { + "title": "Adaptive limit msec", + "description": "Probe fails if response latency exceeds this number of milliseconds", + "type": "integer", + "minimum": 1, + "maximum": 10000, + "default": 1000 + }, + "adaptiveWindow": { + "title": "Adaptive window", + "description": "Time window over which the system samples latency (seconds)", + "type": "integer", + "minimum": 60, + "maximum": 1800, + "default": 180 + } + } + }, + "Monitor_External": { + "description": "Additional Monitor class properties available when monitorType = external", + "type": "object", + "properties": { + "pathname": { + "title": "pathname", + "description": "Tmsh object path name of an imported existing external monitor (e.g. /Common/arg_example)", + "type": "string", + "minLength": 2, + "f5PostProcess": { + "tag": "expand" + } + }, + "expand": { + "title": "Expand", + "description": "If true (default), expand backquoted variables in script", + "type": "boolean", + "default": true + }, + "script": { + "title": "External monitor script", + "description": "Bash(1) script which implements external monitor", + "allOf": [ + { + "$ref": "#/definitions/F5string" + }, + { + "f5PostProcess": { + "tag": "expand", + "data": { + "when": "1/expand" + } + } + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "string" + } + } + ] + }, + "arguments": { + "title": "Arguments", + "description": "Arguments to specified external monitor (will be backquote-expanded)", + "type": "string", + "default": "", + "f5PostProcess": { + "tag": "expand" + } + }, + "environmentVariables": { + "description": "Specifies user defined command line parameters that the external program requires.", + "type": "object", + "additionalProperties": { + "type": "string" + }, + "default": {} + } + }, + "oneOf": [ + { + "required": [ + "pathname" + ] + }, + { + "required": [ + "script" + ] + } + ] + }, + "Monitor_FTP": { + "description": "Additional Monitor class properties available when monitorType = ftp", + "type": "object", + "properties": { + "mode": { + "title": "Mode", + "description": "Specifies the data transfer process (DTP) mode. The default value is passive.", + "type": "string", + "default": "passive", + "enum": [ + "passive", + "port" + ] + }, + "username": { + "title": "Username", + "description": "Username if any for query authentication", + "type": "string" + }, + "passphrase": { + "title": "Passphrase", + "description": "Passphrase if any for query authentication", + "type": "object", + "properties": { + "allowReuse": { + "description": "If true, other declaration objects may reuse this value", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Secret" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "object" + } + }, + { + "f5PostProcess": { + "tag": "secret" + } + } + ] + }, + "filename": { + "title": "Filename", + "description": "Specifies the full path and file name of the file that the system attempts to download. The health check is successful if the system can download the file.", + "type": "string" + } + } + }, + "Monitor_HTTP": { + "description": "Additional Monitor class properties available when monitorType = http or https or http2", + "type": "object", + "properties": { + "send": { + "title": "Send", + "description": "Send this (backquote-expanded) string to query node", + "type": "string", + "default": "HEAD / HTTP/1.0\\r\\n\\r\\n", + "f5PostProcess": { + "tag": "expand" + } + }, + "receive": { + "title": "Receive = up", + "description": "Mark node up upon receipt of this (backquote-expanded) string", + "type": "string", + "default": "HTTP/1.", + "f5PostProcess": { + "tag": "expand" + } + }, + "receiveDown": { + "title": "Receive = down", + "description": "Mark node down upon receipt of this (backquote-expanded) string (optional; must be empty when 'reverse' is true)", + "type": "string", + "default": "", + "f5PostProcess": { + "tag": "expand" + } + }, + "reverse": { + "title": "Reverse", + "description": "If true, mark node down upon receipt of 'receive' string", + "type": "boolean", + "default": false + }, + "username": { + "title": "Username", + "description": "Username if any for query authentication", + "type": "string" + }, + "passphrase": { + "title": "Passphrase", + "description": "Passphrase if any for query authentication", + "type": "object", + "properties": { + "allowReuse": { + "description": "If true, other declaration objects may reuse this value", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Secret" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "object" + } + }, + { + "f5PostProcess": { + "tag": "secret" + } + } + ] + }, + "transparent": { + "title": "Transparent", + "description": "If true, treat pool member address as gateway to server (node) (default false)", + "type": "boolean", + "default": false + }, + "dscp": { + "title": "IP DSCP", + "description": "Value for IP DSCP (ex-TOS) field (default 0)", + "type": "integer", + "minimum": 0, + "maximum": 63, + "default": 0 + } + }, + "allOf": [ + { + "$ref": "#/definitions/Monitor_May_Adapt" + } + ], + "dependencies": { + "reverse": { + "if": { + "properties": { + "reverse": { + "const": true + } + } + }, + "then": { + "properties": { + "receiveDown": { + "const": "" + } + } + } + } + } + }, + "Monitor_HTTPS": { + "description": "Additional Monitor class properties available when monitorType = https", + "type": "object", + "properties": { + "ciphers": { + "title": "Ciphers", + "description": "Ciphersuite selection string", + "type": "string", + "default": "DEFAULT" + }, + "clientCertificate": { + "title": "Client certificate", + "description": "BIG-IP AS3 pointer to client Certificate declaration, for TLS authentication (optional)", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Certificate" + } + }, + "required": [ + "class" + ] + } + } + }, + "clientTLS": { + "title": "Client TLS", + "description": "BIG-IP AS3 pointer to client TLS Profile", + "allOf": [ + { + "$ref": "#/definitions/Pointer_TLS_Client" + } + ] + } + }, + "allOf": [ + { + "$ref": "#/definitions/Monitor_HTTP" + } + ] + }, + "Monitor_HTTP2": { + "description": "Additional Monitor class properties available when monitorType = http2. Requires TMOS version 15.1 or newer.", + "type": "object", + "properties": { + "clientTLS": { + "title": "Client TLS", + "description": "BIG-IP AS3 pointer to client TLS Profile", + "allOf": [ + { + "$ref": "#/definitions/Pointer_TLS_Client" + } + ] + }, + "receive": { + "title": "Receive = up", + "description": "Mark node up upon receipt of this (backquote-expanded) string", + "type": "string", + "default": "HTTP/2.", + "f5PostProcess": { + "tag": "expand" + } + }, + "send": { + "title": "Send", + "description": "Send this (backquote-expanded) string to query node", + "type": "string", + "default": "GET /\\r\\n\\r\\n", + "f5PostProcess": { + "tag": "expand" + } + } + }, + "allOf": [ + { + "$ref": "#/definitions/Monitor_HTTP" + } + ] + }, + "Monitor_ICMP": { + "description": "Additional Monitor class properties available when monitorType = icmp", + "type": "object", + "properties": { + "transparent": { + "title": "Transparent", + "description": "If true, treat pool member address as gateway to server (node) (default false)", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Monitor_May_Adapt" + } + ] + }, + "Monitor_MySQL": { + "description": "Additional Monitor class properties available when monitorType = mysql", + "type": "object", + "properties": { + "send": { + "title": "Send", + "description": "Send this (backquote-expanded) string to query node", + "type": "string", + "f5PostProcess": { + "tag": "expand" + } + }, + "receive": { + "title": "Receive = up", + "description": "Mark node up upon receipt of this (backquote-expanded) string", + "type": "string", + "f5PostProcess": { + "tag": "expand" + } + }, + "username": { + "title": "Username", + "description": "Username if any for query authentication", + "type": "string" + }, + "passphrase": { + "title": "Passphrase", + "description": "Passphrase if any for query authentication", + "type": "object", + "properties": { + "allowReuse": { + "description": "If true, other declaration objects may reuse this value", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Secret" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "object" + } + }, + { + "f5PostProcess": { + "tag": "secret" + } + } + ] + }, + "count": { + "title": "Count", + "description": "Number of monitor probes after which the connection to the database will be terminated. Count value of zero indicates that the connection will never be terminated.", + "type": "integer", + "minimum": 0, + "maximum": 2147483647, + "default": 0 + }, + "database": { + "title": "Database", + "description": "The name of the database with which the monitor attempts to communicate.", + "type": "string" + }, + "receiveColumn": { + "title": "Receive Column", + "description": "Specifies the column in the database where the system expects the specified Receive String to be located. Specify this property only if you configure the Send and Receive properties.", + "type": "integer", + "minimum": 1, + "maximum": 4096 + }, + "receiveRow": { + "title": "Receive Row", + "description": "Specifies the row in the database where the system expects the specified Receive String to be located. Specify this property only if you configure the Send and Recieve properties.", + "type": "integer", + "minimum": 1, + "maximum": 65535 + } + }, + "dependencies": { + "receiveColumn": { + "required": [ + "send", + "receive" + ] + }, + "receiveRow": { + "required": [ + "send", + "receive" + ] + } + } + }, + "Monitor_PostgreSQL": { + "description": "Additional Monitor class properties available when monitorType = postgresql", + "type": "object", + "properties": { + "send": { + "title": "Send", + "description": "Send this (backquote-expanded) string to query node", + "type": "string", + "f5PostProcess": { + "tag": "expand" + } + }, + "receive": { + "title": "Receive = up", + "description": "Mark node up upon receipt of this (backquote-expanded) string", + "type": "string", + "f5PostProcess": { + "tag": "expand" + } + }, + "username": { + "title": "Username", + "description": "Username if any for query authentication", + "type": "string" + }, + "passphrase": { + "title": "Passphrase", + "description": "Passphrase if any for query authentication", + "type": "object", + "properties": { + "allowReuse": { + "description": "If true, other declaration objects may reuse this value", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Secret" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "object" + } + }, + { + "f5PostProcess": { + "tag": "secret" + } + } + ] + }, + "count": { + "title": "Count", + "description": "Number of monitor probes after which the connection to the database will be terminated. Count value of zero indicates that the connection will never be terminated.", + "type": "integer", + "minimum": 0, + "maximum": 2147483647, + "default": 0 + }, + "database": { + "title": "Database", + "description": "The name of the database with which the monitor attempts to communicate.", + "type": "string" + }, + "receiveColumn": { + "title": "Receive Column", + "description": "Specifies the column in the database where the system expects the specified Receive String to be located. Specify this property only if you configure the Send and Receive properties.", + "type": "integer", + "minimum": 1, + "maximum": 1600 + }, + "receiveRow": { + "title": "Receive Row", + "description": "Specifies the row in the database where the system expects the specified Receive String to be located. Specify this property only if you configure the Send and Recieve properties.", + "type": "integer", + "minimum": 1, + "maximum": 4294967294 + } + }, + "dependencies": { + "receiveColumn": { + "required": [ + "send", + "receive" + ] + }, + "receiveRow": { + "required": [ + "send", + "receive" + ] + } + } + }, + "Monitor_SIP": { + "description": "Additional Monitor class properties available when monitorType = sip", + "type": "object", + "properties": { + "protocol": { + "title": "Protocol", + "description": "SIP transport protocol", + "type": "string", + "enum": [ + "sips", + "tcp", + "tls", + "udp" + ], + "default": "udp" + }, + "request": { + "title": "Request", + "description": "SIP request to send in probes (default empty)", + "type": "string", + "default": "" + }, + "headers": { + "title": "Headers", + "description": "SIP headers to send in probes (if any)--separate by newlines (backquote-expanded)", + "type": "string", + "default": "", + "f5PostProcess": { + "tag": "expand" + } + }, + "codesUp": { + "title": "Codes = up", + "description": "List of additional (to all 1/2/3xx) status codes meaning service is up (0 matches any code)", + "type": "array", + "items": { + "title": "Code = up", + "type": "integer", + "minimum": 0 + }, + "uniqueItems": true + }, + "codesDown": { + "title": "Codes = down", + "description": "List of status codes meaning service is down (0 matches any code)", + "type": "array", + "items": { + "title": "Code = down", + "type": "integer", + "minimum": 0 + }, + "uniqueItems": true + }, + "ciphers": { + "title": "Ciphers", + "description": "Ciphersuite selection string", + "type": "string", + "default": "DEFAULT" + }, + "clientCertificate": { + "title": "Client certificate", + "description": "BIG-IP AS3 pointer to client Certificate declaration, for TLS authentication (optional)", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Certificate" + } + }, + "required": [ + "class" + ] + } + } + } + }, + "dependencies": { + "clientCertificate": { + "properties": { + "protocol": { + "enum": [ + "sips", + "tls" + ] + } + } + } + } + }, + "Monitor_SMTP": { + "description": "Additional Monitor class properties available when monitorType = smtp", + "type": "object", + "properties": { + "domain": { + "title": "Domain", + "description": "Mail domain to check, if any (backquote-expanded)", + "type": "string", + "format": "hostname", + "default": "", + "f5PostProcess": { + "tag": "expand" + } + } + } + }, + "Monitor_TCP": { + "description": "Additional Monitor class properties available when monitorType = tcp", + "type": "object", + "properties": { + "send": { + "title": "Send", + "description": "Send this (backquote-expanded) string to node", + "type": "string", + "f5PostProcess": { + "tag": "expand" + }, + "default": "none" + }, + "receive": { + "title": "Receive = up", + "description": "Mark node up upon receipt of this (backquote-expanded) string", + "type": "string", + "f5PostProcess": { + "tag": "expand" + }, + "default": "none" + }, + "receiveDown": { + "title": "Receive = down", + "description": "Mark node down upon receipt of this (backquote-expanded) string (optional; must be empty when 'reverse' is true)", + "type": "string", + "default": "", + "f5PostProcess": { + "tag": "expand" + } + }, + "reverse": { + "title": "Reverse", + "description": "If true, mark node down upon receipt of 'receive' string", + "type": "boolean", + "default": false + }, + "transparent": { + "title": "Transparent", + "description": "If true, treat pool member address as gateway to server (node) (default false)", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Monitor_May_Adapt" + } + ], + "dependencies": { + "reverse": { + "if": { + "properties": { + "reverse": { + "const": true + } + } + }, + "then": { + "properties": { + "receiveDown": { + "const": "" + } + } + } + } + } + }, + "Monitor_UDP": { + "description": "Additional Monitor class properties available when monitorType = udp", + "type": "object", + "properties": { + "send": { + "title": "Send", + "description": "Send this (backquote-expanded) string to node", + "type": "string", + "f5PostProcess": { + "tag": "expand" + }, + "default": "default send string" + }, + "receive": { + "title": "Receive = up", + "description": "Mark node up upon receipt of this (backquote-expanded) string", + "type": "string", + "f5PostProcess": { + "tag": "expand" + }, + "default": "none" + }, + "receiveDown": { + "title": "Receive = down", + "description": "Mark node down upon receipt of this (backquote-expanded) string (optional; must be empty when 'reverse' is true)", + "type": "string", + "default": "", + "f5PostProcess": { + "tag": "expand" + } + }, + "reverse": { + "title": "Reverse", + "description": "If true, mark node down upon receipt of 'receive' string", + "type": "boolean", + "default": false + }, + "transparent": { + "title": "Transparent", + "description": "If true, treat pool member address as gateway to server (node) (default false)", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Monitor_May_Adapt" + } + ], + "dependencies": { + "reverse": { + "if": { + "properties": { + "reverse": { + "const": true + } + } + }, + "then": { + "properties": { + "receiveDown": { + "const": "" + } + } + } + } + } + }, + "Monitor_TCP_Half_Open": { + "description": "Additional Monitor class properties available when monitorType = tcp-half-open", + "type": "object", + "properties": { + "transparent": { + "title": "Transparent", + "description": "If true, treat pool member address as gateway to server (node) (default false)", + "type": "boolean", + "default": false + } + } + }, + "Monitor_Inband": { + "description": "Additional Monitor class properties available when monitorType = inband", + "type": "object", + "properties": { + "failureInterval": { + "title": "Failure Interval", + "description": "Specifies an interval, in seconds. If the number of failures specified in the failures option occurs within this interval, the system marks the pool member as being unavailable.", + "type": "integer", + "maximum": 1000, + "minimum": 2, + "default": 30 + }, + "failures": { + "title": "Failures", + "description": "Specifies the number of failures that the system allows to occur, within the time period specified in the failureInterval property, before marking a pool member unavailable. The multiple tmm processes use a per-process number to calculate failures, depending on the specified load. For example, for the Round Robin load balancing method, if there are N tmm processes and M pool members, and the Failures property is set to L, then up to N*M*L+1 failures can occur before the system marks the node as down. Specifying a value of 0 disables this option. A failure can be either a failure to connect or a failure of the pool member to respond within the time specified in the responseTime property.", + "type": "integer", + "default": 3, + "maximum": 1000, + "minimum": 0 + }, + "responseTime": { + "title": "Response Time", + "description": "Specifies an amount of time, in seconds. If the pool member does not respond with data after the specified amount of time has passed, the number of failures in this interval increments by 1. Specifying a value of 0 disables this option.", + "type": "integer", + "default": 10, + "maximum": 5000, + "minimum": 0 + }, + "retryTime": { + "title": "Retry Time", + "description": "Specifies the amount of time in seconds after the pool member has been marked unavailable before the system retries to connect to the pool member. Specifying a value of 0 disables this option.", + "type": "integer", + "default": 300, + "maximum": 5000, + "minimum": 0 + } + } + }, + "Monitor_LDAP": { + "description": "Additional Monitor class properties available when monitorType = smtp", + "type": "object", + "properties": { + "username": { + "title": "Username", + "description": "Username if any for query authentication", + "type": "string" + }, + "passphrase": { + "title": "Passphrase", + "description": "Passphrase if any for query authentication", + "type": "object", + "properties": { + "allowReuse": { + "description": "If true, other declaration objects may reuse this value", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Secret" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "object" + } + }, + { + "f5PostProcess": { + "tag": "secret" + } + } + ] + }, + "base": { + "title": "Base", + "description": "Specifies the location in the LDAP tree from which the monitor starts the health check", + "type": "string" + }, + "filter": { + "title": "Filter", + "description": "Specifies an LDAP key which the monitor searches", + "type": "string" + }, + "security": { + "title": "Security", + "description": "Specifies the secure protocol type for communications with the target", + "type": "string", + "enum": [ + "none", + "ssl", + "tls" + ], + "default": "none" + }, + "mandatoryAttributes": { + "title": "Mandatory Attributes", + "description": "Specifies whether the target must include attributes in its response to be considered up", + "type": "boolean", + "default": false + }, + "chaseReferrals": { + "title": "Chase Referrals", + "description": "Specifies, whether, upon receipt of an LDAP referral entry, the referral is followed", + "type": "boolean", + "default": true + } + } + }, + "Monitor_DNS": { + "description": "Additional Monitor class properties available when monitorType = dns", + "type": "object", + "properties": { + "acceptRCODE": { + "title": "Accept RCODE", + "description": "Specifies the RCODE required in the response for an up status", + "type": "string", + "enum": [ + "anything", + "no-error" + ], + "default": "no-error" + }, + "answerContains": { + "title": "Answer Section Contains", + "description": "Specifies the type of DNS query that the monitor sends", + "type": "string", + "enum": [ + "any-type", + "anything", + "query-type" + ], + "default": "query-type" + }, + "queryName": { + "title": "Query Name", + "description": "Specifies a query name for the monitor to use in a DNS query", + "type": "string", + "minLength": 1 + }, + "queryType": { + "title": "Query Type", + "description": "Specifies the type of DNS query that the monitor sends.", + "type": "string", + "enum": [ + "a", + "aaaa" + ], + "default": "a" + }, + "receive": { + "title": "Receive String", + "description": "IP address that the monitor uses from the resource records sections of the DNS response", + "type": "string" + }, + "reverse": { + "title": "Reverse", + "description": "If true, mark node down upon receipt of 'receive' string", + "type": "boolean", + "default": false + }, + "transparent": { + "title": "Transparent", + "description": "If true, treat pool member address as gateway to server (node) (default false)", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Monitor_May_Adapt" + }, + { + "if": { + "properties": { + "transparent": { + "const": true + } + }, + "required": [ + "transparent" + ] + }, + "then": { + "allOf": [ + { + "required": [ + "targetAddress", + "targetPort" + ] + }, + { + "properties": { + "targetAddress": { + "not": { + "const": "" + } + } + } + } + ] + } + }, + { + "if": { + "properties": { + "reverse": { + "const": true + } + }, + "required": [ + "reverse" + ] + }, + "then": { + "allOf": [ + { + "required": [ + "receive" + ] + }, + { + "properties": { + "receive": { + "not": { + "const": "" + } + } + } + } + ] + } + }, + { + "if": { + "properties": { + "answerContains": { + "const": "query-type" + }, + "acceptRCODE": { + "const": "no-error" + } + } + }, + "then": { + "properties": { + "receive": { + "default": "" + } + } + } + } + ], + "required": [ + "queryName" + ] + }, + "Monitor_RADIUS": { + "description": "Additional Monitor class properties available when monitorType = radius", + "type": "object", + "properties": { + "username": { + "title": "Username", + "description": "Specifies the user name, if the monitor target requires authentication", + "type": "string" + }, + "passphrase": { + "title": "Passphrase", + "description": "Specifies the password, if the monitored target requires authentication", + "type": "object", + "properties": { + "allowReuse": { + "description": "If true, other declaration objects may reuse this value", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Secret" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "object" + } + }, + { + "f5PostProcess": { + "tag": "secret" + } + } + ] + }, + "secret": { + "title": "Secret", + "description": "Specifies the secret the monitor needs to access the resource", + "type": "object", + "properties": { + "allowReuse": { + "description": "If true, other declaration objects may reuse this value", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Secret" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "object" + } + }, + { + "f5PostProcess": { + "tag": "secret" + } + } + ] + }, + "nasIpAddress": { + "title": "IP Address", + "description": "Specifies the networks access server's IP address (NAS IP address) for a RADIUS monitor", + "type": "string", + "format": "f5ip" + } + } + }, + "TLS_Server": { + "title": "TLS_Server", + "description": "TLS server parameters (connections arriving to ADC)", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "TLS_Server" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "requireSNI": { + "title": "Require SNI", + "description": "When a client sends no or unknown SNI and Require SNI is false (default), the system uses the primary certificate, otherwise the system rejects the client", + "type": "boolean", + "default": false + }, + "alertTimeout": { + "title": "Alert Timeout", + "description": "Specifies the duration of time, in seconds, for the system to try to close an SSL connection before resetting the connection. The default is 'indefinite'. You can also specify 'immediate', or an integer.", + "oneOf": [ + { + "type": "integer", + "maximum": 4294967294, + "minimum": 1 + }, + { + "type": "string", + "enum": [ + "immediate", + "indefinite" + ] + } + ], + "default": "indefinite" + }, + "cacheTimeout": { + "title": "Cache Timeout", + "description": "Sets the cache timeout (in seconds)", + "type": "integer", + "maximum": 86400, + "minimum": 0, + "default": 3600 + }, + "certificates": { + "title": "Certificates", + "description": "Primary and (optional) additional certificates (order is significant, element 0 is primary cert)", + "type": "array", + "items": { + "type": "object", + "properties": { + "matchToSNI": { + "title": "Match to SNI", + "description": "If value is FQDN (wildcard okay), ignore all names in certificate and select this cert when SNI matches value (or by default)", + "type": "string" + }, + "sniDefault": { + "title": "Default SNI", + "description": "When true, this profile is the default SSL profile when a client connection does not specify a known server name, or does not specify any server name at all. The default value is false", + "type": "boolean", + "default": false + }, + "enabled": { + "title": "Enabled", + "description": "Enables SSL processing", + "type": "boolean", + "default": true + }, + "certificate": { + "title": "Certificate", + "description": "BIG-IP AS3 pointer to Certificate declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Certificate" + } + }, + "required": [ + "class" + ] + } + } + }, + "proxyCertificate": { + "title": "Proxy Certificate", + "description": "BIG-IP AS3 pointer to Certificate declaration for SSL forward proxy", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Certificate" + } + }, + "required": [ + "class" + ] + } + } + } + }, + "additionalProperties": false, + "required": [ + "certificate" + ] + }, + "minItems": 1, + "$comment": "uniqueItems: true" + }, + "ciphers": { + "title": "Ciphers", + "description": "Ciphersuite selection string. ciphers and cipherGroup are mutually exclusive, only use one.", + "type": "string" + }, + "cipherGroup": { + "description": "Pointer to a cipherGroup. cipherGroup and ciphers are mutually exclusive, only use one.", + "$ref": "#/definitions/Pointer_Cipher_Group" + }, + "authenticationMode": { + "title": "Authentication mode", + "description": "Client certificate authentication mode", + "type": "string", + "enum": [ + "ignore", + "request", + "require" + ], + "default": "ignore" + }, + "authenticationFrequency": { + "title": "Authentication frequency", + "description": "Client certificate authentication frequency", + "type": "string", + "enum": [ + "one-time", + "every-time" + ], + "default": "one-time" + }, + "authenticationTrustCA": { + "title": "Authentication trust CA", + "description": "BIG-IP AS3 pointer to declaration of CA Bundle used to validate client certificates", + "if": { + "type": "string" + }, + "then": { + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "CA_Bundle" + } + }, + "required": [ + "class" + ] + } + } + }, + "else": { + "type": "object", + "properties": { + "bigip": { + "title": "BIG-IP CA bundle", + "description": "Pathname of existing BIG-IP CA bundle", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "required": [ + "bigip" + ], + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys file ssl-cert" + ] + } + } + }, + "authenticationInviteCA": { + "title": "Authentication invite CA", + "description": "BIG-IP AS3 pointer to declaration of CA Bundle used to invite client certificates", + "if": { + "type": "string" + }, + "then": { + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "CA_Bundle" + } + }, + "required": [ + "class" + ] + } + } + }, + "else": { + "type": "object", + "properties": { + "bigip": { + "title": "BIG-IP CA bundle", + "description": "Pathname of existing BIG-IP CA bundle", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "required": [ + "bigip" + ], + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys file ssl-cert" + ] + } + } + }, + "crlFile": { + "title": "Certificate Revocation List (CRL) File", + "description": "Specifies the name of a file containing a list of revoked client certificates", + "allOf": [ + { + "$ref": "#/definitions/Pointer_SSL_CRL_File" + } + ] + }, + "allowExpiredCRL": { + "title": "Allow Expired CRL", + "description": "Specifies if the CRL can be used even if it has expired", + "type": "boolean", + "default": false + }, + "cacheCertificateEnabled": { + "title": "Cache Certificate Enabled", + "description": "Enables or disables (default) caching certificates by IP address and port number", + "type": "boolean", + "default": false + }, + "c3dOCSPUnknownStatusAction": { + "title": "C3D OCSP Unknown Status Action", + "description": "Specifies the BIG-IP action when the OCSP returns unknown status. The default is drop", + "type": "string", + "enum": [ + "drop", + "ignore" + ], + "default": "drop" + }, + "c3dOCSP": { + "title": "C3D OCSP", + "description": "Specifies SSL Client Certificate Constrained Delegation (C3D) OCSP object that the BIG-IP SSL should use to connect to the OCSP responder and check the client certificate status", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Certificate_Validator_OCSP" + } + ] + }, + "c3dEnabled": { + "title": "C3D Delegation Enabled", + "description": "Enables or disables SSL Client Certificate Constrained Delegation (C3D). The default is false", + "type": "boolean", + "default": false + }, + "forwardProxyEnabled": { + "title": "Forward Proxy Enabled", + "description": "Enables or disables (default) SSL forward proxy", + "type": "boolean", + "default": false + }, + "forwardProxyBypassEnabled": { + "title": "Forward Proxy Bypass Enabled", + "description": "Enables or disables (default) SSL forward proxy bypass", + "type": "boolean", + "default": false + }, + "forwardProxyBypassAllowlist": { + "title": "Forward Proxy Bypass Allowlist", + "description": "Specifies the data group name of hostname allowlist when both SSL forwardProxyEnabled & forwardProxyBypassEnabled features are set to true.", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Data_Group" + } + ] + }, + "ldapStartTLS": { + "title": "Client-LDAP Profile", + "description": "Creates a client LDAP profile with the specified activation mode STARTTLS.", + "type": "string", + "enum": [ + "none", + "allow", + "require" + ] + }, + "smtpsStartTLS": { + "title": "Simple Mail Transfer Protocol Security (SMTPS) profile", + "description": "Creates a SMTPS profile with the specified activation mode STARTTTLS. Because HTTP profile is not compatible with SMTPS use with Service_TCP instead of Service_HTTPS. Also incompatible with ldapStartTLS. Use only one of the two.", + "type": "string", + "enum": [ + "none", + "allow", + "require" + ] + }, + "staplerOCSPEnabled": { + "description": "Specifies whether to enable OCSP stapling", + "type": "boolean", + "default": false + }, + "insertEmptyFragmentsEnabled": { + "title": "Insert Empty Fragments Enabled", + "description": "Enables a countermeasure against an SSL 3.0/TLS 1.0 protocol vulnerability affecting CBC ciphers. These ciphers cannot be handled by certain broken SSL implementations.", + "type": "boolean", + "default": false + }, + "singleUseDhEnabled": { + "title": "Single Use DH Enabled", + "description": "Creates a new key when using temporary/ephemeral DH parameters. This option must be used to prevent small subgroup attacks, when the DH parameters were not generated using strong primes (for example. when using DSA-parameters). If strong primes were used, it is not strictly necessary to generate a new DH key during each handshake, but F5 Networks recommends it. Enable the Single DH Use option whenever temporary or ephemeral DH parameters are used.", + "type": "boolean", + "default": false + }, + "tls1_3Enabled": { + "title": "TLS 1.3", + "description": "Allow TLS 1.3 Protocol. Note: tls1_3Enabled is only supported in tmos version 14.0+.", + "type": "boolean", + "default": false + }, + "tls1_2Enabled": { + "title": "TLS 1.2", + "description": "Allow TLS 1.2 Protocol.", + "type": "boolean", + "default": true + }, + "tls1_1Enabled": { + "title": "TLS 1.1", + "description": "Allow TLS 1.1 Protocol.", + "type": "boolean", + "default": true + }, + "tls1_0Enabled": { + "title": "TLS 1.0", + "description": "Allow TLS 1.0 Protocol.", + "type": "boolean", + "default": true + }, + "renegotiationEnabled": { + "title": "Renegotiation", + "description": "Controls on a per-connection basis how the system responds to mid-stream SSL reconnection requests.", + "type": "boolean", + "default": true + }, + "retainCertificateEnabled": { + "title": "Retain Certificate", + "description": "When enabled, server certificate is retained in SSL session.", + "type": "boolean", + "default": true + }, + "namingScheme": { + "description": "Scheme to use when naming generated tmsh configuration", + "type": "string", + "enum": [ + "numbered", + "certificate" + ], + "default": "numbered" + }, + "sslEnabled": { + "title": "SSL", + "description": "Allow SSL protocol", + "type": "boolean", + "default": true + }, + "ssl3Enabled": { + "title": "SSL v3", + "description": "Allow SSL v3 protocol", + "type": "boolean", + "default": true + }, + "proxySslEnabled": { + "title": "Proxy SSL Enabled", + "description": "When enabled, further modification of application traffic within an SSL tunnel is allowed while still allowing the server to perform necessary authorization, authentication, and auditing steps. Requires a corresponding TLS_Client with this enabled to perform transparent SSL decryption.", + "type": "boolean", + "default": false + }, + "proxySslPassthroughEnabled": { + "title": "Proxy SSL Passthrough Enabled", + "description": "When enabled, it allows Proxy SSL to passthrough the traffic when ciphersuite negotiated between the client and server is not supported. Requires a corresponding TLS_Client with this enabled to perform transparent SSL decryption.", + "type": "boolean", + "default": false + }, + "secureRenegotiation": { + "title": "Secure Renegotiation", + "description": "Specifies the secure renegotiation mode. When set to require, any client attempting to renegotiate that does not support secure renegotiation will have its connection aborted. When set to require-strict, any client attempting to connect that does not support secure renegotiation will have its initial handshake denied. When set to request, unpatched clients will be permitted to renegotiate. Setting to request is not recommended as it is subject to active man-in-the-middle attacks.", + "type": "string", + "enum": [ + "request", + "require", + "require-strict" + ], + "default": "require" + }, + "uncleanShutdownEnabled": { + "title": "Unclean Shutdown Enabled", + "description": "When enabled, the profile performs unclean shutdowns of all SSL connections, which means the underlying TCP connections are closed without exchanging the required SSL shutdown alerts.", + "type": "boolean", + "default": true + }, + "dtlsEnabled": { + "title": "DTLS Enabled", + "description": "Allows the DTLS protocol.", + "type": "boolean", + "default": true + }, + "dtls1_2Enabled": { + "title": "DTLS1.2 Enabled", + "description": "Allows the DTLS 1.2 protocol.", + "type": "boolean", + "default": true + }, + "certificateExtensions": { + "title": "Certificate Extensions", + "description": "Specifies the extensions of the web server certificates to be included in the generated certificates using SSL Forward Proxy.", + "type": "array", + "items": { + "type": "string", + "enum": [ + "authority-key-identifier", + "basic-constraints", + "certificate-policies", + "crl-distribution-points", + "extended-key-usage", + "fresh-crl", + "issuer-alternative-name", + "key-usage", + "subject-alternative-name", + "subject-directory-attribute", + "subject-key-identifier" + ] + } + }, + "nonSslConnectionsEnabled": { + "title": "Allow Non-SSL Connections", + "description": "Specifies if non-SSL connections are allowed.", + "type": "boolean", + "default": false + }, + "allowDynamicRecordSizing": { + "title": "Allow Dynamic Record Sizing", + "description": "Enables or disables dynamic application record sizing.", + "type": "boolean", + "default": false + }, + "dataZeroRoundTripTime": { + "title": "Data Zero Round Trip Time", + "description": "Specifies if TLSv1.3 should accept 0-RTT with early data, with or without anti-replay. To protect against packet replay, F5 recommends that you enable anti-replay. The default value is disabled, which means TLSv1.3 will discard any early data.", + "type": "string", + "enum": [ + "disabled", + "enabled-with-anti-replay", + "enabled-no-anti-replay" + ], + "default": "disabled" + }, + "renegotiateMaxRecordDelay": { + "title": "Renegotiate Max Record Delay", + "description": "Specifies the maximum number of SSL records that the traffic management system can receive before it renegotiates an SSL session. After the system receives this number of SSL records, it closes the connection. This setting applies to client profiles only.", + "oneOf": [ + { + "type": "integer", + "minimum": 0, + "maximum": 4294967295 + }, + { + "type": "string", + "const": "indefinite" + } + ], + "default": "indefinite" + }, + "renegotiatePeriod": { + "title": "Renegotiate Period", + "description": "Specifies the number of seconds required to renegotiate an SSL session.", + "oneOf": [ + { + "type": "integer", + "minimum": 0, + "maximum": 4294967295 + }, + { + "type": "string", + "const": "indefinite" + } + ], + "default": "indefinite" + }, + "renegotiateSize": { + "title": "Renegotiate Size", + "description": "Specifies the size of the application data, in megabytes, that is transmitted over the secure channel. If the size of the data is higher than this value, the traffic management system must renegotiate the SSL session.", + "oneOf": [ + { + "type": "integer", + "minimum": 0, + "maximum": 4294967295 + }, + { + "type": "string", + "const": "indefinite" + } + ], + "default": "indefinite" + } + }, + "additionalProperties": false, + "dependencies": { + "forwardProxyBypassAllowlist": { + "properties": { + "forwardProxyEnabled": { + "const": true + }, + "forwardProxyBypassEnabled": { + "const": true + } + } + }, + "smtpsStartTLS": { + "not": { + "required": [ + "ldapStartTLS" + ] + } + } + }, + "allOf": [ + { + "if": { + "properties": { + "c3dEnabled": { + "const": true + } + }, + "required": [ + "c3dEnabled" + ] + }, + "then": { + "properties": { + "authenticationMode": { + "enum": [ + "request", + "require" + ] + } + } + } + }, + { + "if": { + "properties": { + "authenticationMode": { + "enum": [ + "request", + "require" + ] + } + }, + "required": [ + "authenticationMode" + ] + }, + "then": { + "required": [ + "authenticationTrustCA" + ] + } + }, + { + "if": { + "required": [ + "ciphers" + ] + }, + "then": { + "not": { + "required": [ + "cipherGroup" + ] + } + } + }, + { + "if": { + "not": { + "required": [ + "ciphers", + "cipherGroup" + ] + } + }, + "then": { + "properties": { + "ciphers": { + "default": "DEFAULT" + } + } + } + } + ], + "required": [ + "class", + "certificates" + ] + }, + "TLS_Client": { + "title": "TLS_Client", + "description": "TLS client parameters (connections leaving ADC)", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "TLS_Client" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "sendSNI": { + "title": "Send SNI", + "description": "FQDN to send in SNI (optional)", + "type": "string", + "format": "hostname", + "default": "none" + }, + "sniDefault": { + "title": "Default SNI", + "description": "When true, this profile is the default SSL profile when a client connection does not specify a known server name, or does not specify any server name at all. The default value is false", + "type": "boolean", + "default": false + }, + "requireSNI": { + "title": "Require SNI", + "description": "When a client sends no or unknown SNI and Require SNI is false (default), the system uses the primary certificate, otherwise the system rejects the client", + "type": "boolean", + "default": false + }, + "alertTimeout": { + "title": "Alert Timeout", + "description": "Specifies the duration of time, in seconds, for the system to try to close an SSL connection before resetting the connection. The default is 'indefinite'. You can also specify 'immediate', or an integer.", + "oneOf": [ + { + "type": "integer", + "maximum": 4294967294, + "minimum": 1 + }, + { + "type": "string", + "enum": [ + "immediate", + "indefinite" + ] + } + ], + "default": "indefinite" + }, + "cacheTimeout": { + "title": "Cache Timeout", + "description": "Sets the cache timeout (in seconds)", + "type": "integer", + "maximum": 86400, + "minimum": 0, + "default": 3600 + }, + "ciphers": { + "title": "Ciphers", + "description": "Ciphersuite selection string. ciphers and cipherGroup are mutually exclusive, only use one.", + "type": "string" + }, + "cipherGroup": { + "description": "Pointer to a cipherGroup. cipherGroup and ciphers are mutually exclusive, only use one.", + "$ref": "#/definitions/Pointer_Cipher_Group" + }, + "authenticationFrequency": { + "title": "Authentication frequency", + "description": "Client certificate authentication frequency", + "type": "string", + "enum": [ + "one-time", + "every-time" + ], + "default": "one-time" + }, + "serverName": { + "title": "Server name", + "description": "FQDN which server certificate must match (optional)", + "type": "string", + "format": "hostname", + "default": "none" + }, + "validateCertificate": { + "title": "Validate certificate", + "description": "If false (default) accept any cert from server, else validate server cert against trusted CA bundle", + "type": "boolean", + "default": false + }, + "trustCA": { + "title": "Trusted CA bundle", + "description": "CA's trusted to validate server certificate; 'generic' (default) or else BIG-IP AS3 pointer to declaration of CA Bundle", + "if": { + "not": { + "type": "object" + } + }, + "then": { + "type": "string", + "enum": [ + "generic", + "none" + ], + "default": "generic" + }, + "else": { + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to declaration of CA bundle", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "CA_Bundle" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP CA bundle", + "description": "Pathname of existing BIG-IP CA bundle", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys file ssl-cert" + ] + } + } + }, + "ignoreExpired": { + "title": "Ignored expired", + "description": "If false (default) drop connections with expired server certificates", + "type": "boolean", + "default": false + }, + "ignoreUntrusted": { + "title": "Ignored untrusted", + "description": "If false (default) drop connections with untrusted server certificates", + "type": "boolean", + "default": false + }, + "sessionTickets": { + "title": "Session tickets", + "description": "If false (default) do not use rfc5077 session tickets", + "type": "boolean", + "default": false + }, + "clientCertificate": { + "title": "Client certificate", + "description": "BIG-IP AS3 pointer to client Certificate declaration (optional)", + "type": "string", + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Certificate" + } + }, + "required": [ + "class" + ] + } + } + }, + "crlFile": { + "title": "Certificate Revocation List (CRL) File", + "description": "Specifies the name of a file containing a list of revoked client certificates", + "allOf": [ + { + "$ref": "#/definitions/Pointer_SSL_CRL_File" + } + ] + }, + "allowExpiredCRL": { + "title": "Allow Expired CRL", + "description": "Specifies if the CRL can be used even if it has expired", + "type": "boolean", + "default": false + }, + "c3dCertificateAuthority": { + "title": "C3D Certificate Authority", + "description": "Pointer to a Certificate class which specifies the Certificate Authority values for C3D", + "type": "string", + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Certificate" + } + }, + "required": [ + "class" + ] + } + } + }, + "c3dCertificateExtensions": { + "title": "C3D Certificate Extensions", + "description": "Specifies the custom extension OID of the client certificates to be included in the generated certificates using SSL C3D", + "type": "array", + "items": { + "type": "string", + "enum": [ + "basic-constraints", + "extended-key-usage", + "key-usage", + "subject-alternative-name" + ] + }, + "default": [ + "basic-constraints", + "extended-key-usage", + "key-usage", + "subject-alternative-name" + ] + }, + "c3dCertificateLifespan": { + "title": "C3D Certificate Lifespan", + "description": "Specifies the lifespan of the certificate generated using the SSL client certificate constrained delegation", + "type": "integer", + "maximum": 8760, + "minimum": 0, + "default": 24 + }, + "c3dEnabled": { + "title": "C3D Enabled", + "description": "Enables or disables SSL Client certificate constrained delegation (C3D). Using C3D eliminates the need for requiring users to provide credentials twice for certain authentication actions", + "type": "boolean", + "default": false + }, + "forwardProxyEnabled": { + "title": "Forward Proxy Enabled", + "description": "Enables or disables (default) SSL forward proxy", + "type": "boolean", + "default": false + }, + "forwardProxyBypassEnabled": { + "title": "Forward Proxy Bypass Enabled", + "description": "Enables or disables (default) SSL forward proxy bypass", + "type": "boolean", + "default": false + }, + "ldapStartTLS": { + "title": "Server-LDAP Profile", + "description": "Creates a client LDAP profile with the specified activation mode STARTTLS.", + "type": "string", + "enum": [ + "none", + "allow", + "require" + ] + }, + "insertEmptyFragmentsEnabled": { + "title": "Insert Empty Fragments Enabled", + "description": "Enables a countermeasure against an SSL 3.0/TLS 1.0 protocol vulnerability affecting CBC ciphers. These ciphers cannot be handled by certain broken SSL implementations.", + "type": "boolean", + "default": false + }, + "singleUseDhEnabled": { + "title": "Single Use DH Enabled", + "description": "Creates a new key when using temporary/ephemeral DH parameters. This option must be used to prevent small subgroup attacks, when the DH parameters were not generated using strong primes (for example. when using DSA-parameters). If strong primes were used, it is not strictly necessary to generate a new DH key during each handshake, but F5 Networks recommends it. Enable the Single DH Use option whenever temporary or ephemeral DH parameters are used.", + "type": "boolean", + "default": false + }, + "tls1_3Enabled": { + "title": "TLS 1.3", + "description": "Allow TLS 1.3 Ciphers. Note: tls1_3Enabled is only supported in tmos version 14.0+.", + "type": "boolean", + "default": false + }, + "tls1_2Enabled": { + "title": "TLS 1.2", + "description": "Allow TLS 1.2 Ciphers.", + "type": "boolean", + "default": true + }, + "tls1_1Enabled": { + "title": "TLS 1.1", + "description": "Allow TLS 1.1 Ciphers.", + "type": "boolean", + "default": true + }, + "tls1_0Enabled": { + "title": "TLS 1.0", + "description": "Allow TLS 1.0 Ciphers.", + "type": "boolean", + "default": true + }, + "renegotiationEnabled": { + "title": "Renegotiation", + "description": "Controls on a per-connection basis how the system responds to mid-stream SSL reconnection requests.", + "type": "boolean", + "default": true + }, + "retainCertificateEnabled": { + "title": "Retain Certificate", + "description": "When enabled, server certificate is retained in SSL session.", + "type": "boolean", + "default": true + }, + "sslEnabled": { + "title": "SSL", + "description": "Allow SSL protocol", + "type": "boolean", + "default": true + }, + "ssl3Enabled": { + "title": "SSL v3", + "description": "Allow SSL v3 protocol", + "type": "boolean", + "default": true + }, + "proxySslEnabled": { + "title": "Proxy SSL Enabled", + "description": "When enabled, further modification of application traffic within an SSL tunnel is allowed while still allowing the server to perform necessary authorization, authentication, and auditing steps. Requires a corresponding TLS_Server with this enabled to perform transparent SSL decryption.", + "type": "boolean", + "default": false + }, + "proxySslPassthroughEnabled": { + "title": "Proxy SSL Passthrough Enabled", + "description": "When enabled, it allows Proxy SSL to passthrough the traffic when ciphersuite negotiated between the client and server is not supported. Requires a corresponding TLS_Server with this enabled to perform transparent SSL decryption.", + "type": "boolean", + "default": false + }, + "secureRenegotiation": { + "title": "Secure Renegotiation", + "description": "Specifies the secure renegotiation mode. When set to require, any connection to an unpatched server will be aborted. For TLS_Client, require and require-strict are the same. When set to request, connections to unpatched servers will be permitted. Setting to request is not recommended as it is subject to active man-in-the-middle attacks.", + "type": "string", + "enum": [ + "request", + "require", + "require-strict" + ], + "default": "require-strict" + }, + "uncleanShutdownEnabled": { + "title": "Unclean Shutdown Enabled", + "description": "When enabled, the profile performs unclean shutdowns of all SSL connections, which means the underlying TCP connections are closed without exchanging the required SSL shutdown alerts.", + "type": "boolean", + "default": true + }, + "dtlsEnabled": { + "title": "DTLS Enabled", + "description": "Allows the DTLS protocol.", + "type": "boolean", + "default": true + }, + "dtls1_2Enabled": { + "title": "DTLS1.2 Enabled", + "description": "Allows the DTLS 1.2 protocol.", + "type": "boolean", + "default": true + }, + "dataZeroRoundTripTime": { + "title": "Data Zero Round Trip Time", + "description": "Specifies if TLSv1.3 should send 0-RTT early data when available.", + "type": "boolean", + "default": false + }, + "renegotiatePeriod": { + "title": "Renegotiate Period", + "description": "Specifies the number of seconds from the initial connect time after which the system renegotiates an SSL session. The default value is indefinite, which means that you do not want the system to renegotiate SSL sessions.", + "oneOf": [ + { + "type": "integer", + "minimum": 0, + "maximum": 4294967295 + }, + { + "type": "string", + "const": "indefinite" + } + ], + "default": "indefinite" + }, + "renegotiateSize": { + "title": "Renegotiate Size", + "description": "Specifies a throughput size, in megabytes, of SSL renegotiation. This option forces the traffic management system to renegotiate an SSL session based on the size, in megabytes, of application data that is transmitted over the secure channel. The default value is indefinite, which specifies that you do not want a throughput size.", + "oneOf": [ + { + "type": "integer", + "minimum": 0, + "maximum": 4294967295 + }, + { + "type": "string", + "const": "indefinite" + } + ], + "default": "indefinite" + } + }, + "allOf": [ + { + "if": { + "required": [ + "ciphers" + ] + }, + "then": { + "not": { + "required": [ + "cipherGroup" + ] + } + } + }, + { + "if": { + "not": { + "required": [ + "ciphers", + "cipherGroup" + ] + } + }, + "then": { + "properties": { + "ciphers": { + "default": "DEFAULT" + } + } + } + } + ], + "additionalProperties": false, + "required": [ + "class" + ] + }, + "Sender_Tag_Mapping": { + "title": "Sender and Tag Data Group Mapping", + "description": "Establishes a mapping between a sender value and data group containing tag substitution values", + "type": "object", + "properties": { + "senderId": { + "title": "Sender ID", + "description": "Specifies sender ID value", + "type": "string" + }, + "tagDataGroup": { + "description": "Specifies tag substitution data group", + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to data group if any (declared separately)", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Data_Group" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP data group", + "description": "Pathname of existing BIG-IP data group", + "type": "string", + "format": "f5bigip" + } + }, + "dependencies": { + "bigip": { + "properties": { + "isExternal": { + "title": "External data group", + "description": "Toggles whether existing data group is internal or external", + "type": "boolean", + "default": false + } + } + } + }, + "if": { + "properties": { + "isExternal": { + "const": true + } + } + }, + "then": { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm data-group external" + ] + } + }, + "else": { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm data-group internal" + ] + } + }, + "minProperties": 1, + "maxProperties": 2 + } + }, + "additionalProperties": false, + "required": [ + "senderId", + "tagDataGroup" + ] + }, + "FIX_Profile": { + "title": "FIX_Profile", + "type": "object", + "description": "Configures a Financial Information eXchange Protocol (FIX) profile", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "FIX_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "parentProfile": { + "description": "Specifies the name of the profile object to inherit the settings from", + "allOf": [ + { + "$ref": "#/definitions/Pointer_FIX_Profile" + } + ], + "default": { + "bigip": "/Common/fix" + } + }, + "errorAction": { + "title": "Error Action", + "description": "Specifies the error handling method", + "type": "string", + "enum": [ + "dont-forward", + "drop-connection" + ], + "default": "dont-forward" + }, + "fullLogonParsingEnabled": { + "title": " Fully Parse Logon Message", + "description": "Enables or disables logon message as always fully parsed. Other messages are parsed according to the configuration of Quick Parsing", + "type": "boolean", + "default": true + }, + "messageLogPublisher": { + "title": "Message Log Publisher", + "description": "Specifies the publisher for message logging", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Log_Publisher" + } + ] + }, + "reportLogPublisher": { + "description": "Specifies the publisher for error messages and status reports", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Log_Publisher" + } + ] + }, + "quickParsingEnabled": { + "title": "Quick Parsing", + "description": "Enables or disables quick parsing which parses the basic standard fields and validates message length and checksum", + "type": "boolean", + "default": false + }, + "responseParsingEnabled": { + "title": "Response Parsing", + "description": "Enables or disables response parsing which parses the messages from the FIX server. Applies the same parser configuration and error handling at server side as at client side. If not enabled, server side messages are directly passed through", + "type": "boolean", + "default": false + }, + "statisticsSampleInterval": { + "title": "Statistics Sample Interval", + "description": "Specifies the sample interval of the message rate in seconds", + "type": "integer", + "default": 20, + "minimum": 10, + "maximum": 4294967295 + }, + "senderTagMappingList": { + "title": "Sender and Tag Substitution Mapping", + "description": "Specifies the mappings between sender ID and tag substitution data group.", + "type": "array", + "items": { + "$ref": "#/definitions/Sender_Tag_Mapping" + } + } + }, + "additionalProperties": false, + "required": [ + "class" + ] + }, + "RTSP_Profile": { + "title": "RTSP_Profile", + "type": "object", + "description": "Real Time Streaming Protocol Profile", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "RTSP_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "idleTimeout": { + "title": "Idle Timeout", + "description": "The number of seconds that a Real-time Transport Protocol (RTP) connection is idle before the connection is eligible for deletion", + "if": { + "type": "integer" + }, + "then": { + "type": "integer", + "minimum": 0, + "maximum": 4294967295 + }, + "else": { + "type": "string", + "enum": [ + "indefinite", + "immediate" + ] + }, + "default": 300 + }, + "maxHeaderSize": { + "title": "Maximum Header Size", + "description": "The largest RTSP request or response header, in bytes, that the RTSP filter accepts before dropping the connection", + "type": "integer", + "default": 4096, + "minimum": 0, + "maximum": 4294967295 + }, + "maxQueuedData": { + "title": "Maximum Queued Data", + "description": "The maximum amount of data, in bytes, that the RTSP filter buffers before dropping the connection", + "type": "integer", + "default": 32768, + "minimum": 0, + "maximum": 4294967295 + }, + "unicastRedirect": { + "title": "Unicast Redirect", + "description": "When enabled specifies that the client can select the destination port for the streamed data. The destination address for the data is the source of the request.", + "type": "boolean", + "default": false + }, + "multicastRedirect": { + "title": "Multicast Redirect", + "description": "When enabled, if you are using multicast streams, specifies that the client has permission to supply a different destination IP address for the streamed data", + "type": "boolean", + "default": false + }, + "sessionReconnect": { + "title": "Session Reconnect", + "description": "When enabled specifies that the system persists a resumed control connection to the correct server. Typical clients do not support this behavior.", + "type": "boolean", + "default": false + }, + "realHTTPPersistence": { + "title": "Real HTTP Persistence", + "description": "When enabled specifies that the system automatically persists Real Networks-tunneled RTSP data over HTTP, which is over the RTSP port. When disabled, a user can override the default behavior with an iRule.", + "type": "boolean", + "default": true + }, + "checkSource": { + "title": "Check Source", + "description": "When true the system uses the source attribute in the transport header to establish the target address of the RTP stream, and before the response is forwarded to the client, updates the value of the source attribute to be the virtual address of the BIG-IP system. When false the system does not change the source attribute.", + "type": "boolean", + "default": true + }, + "proxy": { + "title": "Proxy", + "description": "Specifies whether the RTSP profile is associated with an RTSP proxy configuration", + "type": "string", + "enum": [ + "external", + "internal", + "none" + ], + "default": "none" + }, + "proxyHeader": { + "title": "Proxy Header", + "description": "When set, specifies the name of the header in the RTSP proxy configuration that is passed from the client-side virtual server to the server-side virtual server. Note that the name of the header must begin with X-. To use the proxyHeader option, you must specify a value for the proxy option. Note that the system removes this header from the request prior to sending the request to the server for processing.", + "type": "string" + }, + "RTPPort": { + "title": "RTP Port", + "description": "The number of the port to use for the RTP service", + "type": "integer", + "default": 0, + "minimum": 0, + "maximum": 65535 + }, + "RTCPPort": { + "title": "RTCP Port", + "description": "The number of the port to use for the Real Time Control Protocol (RTCP) service. RTCP allows monitoring of real-time data delivery.", + "type": "integer", + "default": 0, + "minimum": 0, + "maximum": 65535 + }, + "algLogProfile": { + "description": "ALG log profile pointer", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "cgnat" + ] + } + }, + { + "$ref": "#/definitions/Pointer_ALG_Log_Profile" + } + ] + }, + "logPublisher": { + "description": "Log publisher pointer", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "cgnat" + ] + } + }, + { + "$ref": "#/definitions/Pointer_Log_Publisher" + } + ] + } + }, + "additionalProperties": false, + "required": [ + "class" + ], + "dependencies": { + "algLogProfile": { + "required": [ + "logPublisher" + ] + }, + "logPublisher": { + "required": [ + "algLogProfile" + ] + } + } + }, + "SIP_Profile": { + "title": "SIP_Profile", + "type": "object", + "description": "Configures a profile you can use to manage Session Initiation Protocol (SIP) traffic.", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "SIP_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + } + }, + "additionalProperties": false, + "required": [ + "class" + ] + }, + "Statistics_Profile": { + "title": "Statistics Profile", + "type": "object", + "description": "User-defined statistics fields. This object assigns field names for up to 32 fields. You can then use these field names from an iRule to record values.", + "patternProperties": { + "^field(3[0-2]|[1-2][0-9]|[1-9])$": { + "title": "Field Name", + "description": "This regular expression represents 32 field properties named 'field1' through 'field32'.", + "type": "string" + } + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Statistics_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + } + }, + "additionalProperties": false, + "required": [ + "class" + ] + }, + "TFTP_Profile": { + "title": "TFTP_Profile", + "type": "object", + "description": "Trivial File Transer Protocol (TFTP) profile", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "TFTP_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "idleTimeout": { + "description": "Specifies an idle timeout in seconds. This setting specifies the number of seconds that a connection is idle before the connection is eligible for deletion.", + "if": { + "type": "integer" + }, + "then": { + "type": "integer", + "minimum": 0, + "maximum": 4294967295 + }, + "else": { + "type": "string", + "const": "indefinite" + }, + "default": 30 + }, + "algLogProfile": { + "description": "ALG log profile pointer", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "cgnat" + ] + } + }, + { + "$ref": "#/definitions/Pointer_ALG_Log_Profile" + } + ] + }, + "logPublisher": { + "description": "Log publisher pointer", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "cgnat" + ] + } + }, + { + "$ref": "#/definitions/Pointer_Log_Publisher" + } + ] + } + }, + "additionalProperties": false, + "required": [ + "class" + ], + "dependencies": { + "algLogProfile": { + "required": [ + "logPublisher" + ] + }, + "logPublisher": { + "required": [ + "algLogProfile" + ] + } + } + }, + "FTP_Profile": { + "title": "FTP_Profile", + "type": "object", + "description": "File Transfer Protocol (FTP) profile", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "FTP_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "port": { + "description": "Specifies a service for the data channel port used for this profile", + "type": "integer", + "default": 20, + "minimum": 0, + "maximum": 65535 + }, + "ftpsMode": { + "description": "Specifies the policy for explicit FTPS negotiation on FTP command channel", + "type": "string", + "enum": [ + "disallow", + "allow", + "require" + ], + "default": "disallow" + }, + "enforceTlsSessionReuseEnabled": { + "description": "Enforce data connection to reuse TLS session", + "type": "boolean", + "default": false, + "f5PostProcess": { + "tag": "minVersion", + "data": "14.0" + } + }, + "activeModeEnabled": { + "description": "Specifies if the profile should allow FTP active transfer mode", + "type": "boolean", + "default": true, + "f5PostProcess": { + "tag": "minVersion", + "data": "14.0" + } + }, + "securityEnabled": { + "description": "Specifies whether to enable or disable secure FTP traffic for the BIG-IP Application Security Manager", + "type": "boolean", + "default": false + }, + "translateExtendedEnabled": { + "description": "Specifies if the profile should automatically translate RFC2428 extended requests EPSV and EPRT to PASV and PORT when communicating with IPv4servers", + "type": "boolean", + "default": true + }, + "inheritParentProfileEnabled": { + "description": "Specifies if the FTP data channel should inherit the TCP profile used by the control channel", + "type": "boolean", + "default": false + }, + "algLogProfile": { + "description": "ALG log profile pointer", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "cgnat" + ] + } + }, + { + "$ref": "#/definitions/Pointer_ALG_Log_Profile" + } + ] + }, + "logPublisher": { + "description": "Log publisher pointer", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "cgnat" + ] + } + }, + { + "$ref": "#/definitions/Pointer_Log_Publisher" + } + ] + } + }, + "additionalProperties": false, + "required": [ + "class" + ], + "dependencies": { + "algLogProfile": { + "required": [ + "logPublisher" + ] + }, + "logPublisher": { + "required": [ + "algLogProfile" + ] + } + } + }, + "HTML_Rule": { + "title": "HTML_Rule", + "type": "object", + "description": "HTML Rule with configurable options", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "HTML_Rule" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "ruleType": { + "title": "Rule type", + "description": "Type of rule", + "type": "string", + "enum": [ + "comment-raise-event", + "comment-remove", + "tag-append-html", + "tag-prepend-html", + "tag-raise-event", + "tag-remove", + "tag-remove-attribute" + ] + } + }, + "allOf": [ + { + "if": { + "properties": { + "ruleType": { + "const": "tag-append-html" + } + } + }, + "then": { + "$ref": "#/definitions/HTML_Rule_TagAppendHTML" + } + }, + { + "if": { + "properties": { + "ruleType": { + "const": "tag-prepend-html" + } + } + }, + "then": { + "$ref": "#/definitions/HTML_Rule_TagPrependHTML" + } + }, + { + "if": { + "properties": { + "ruleType": { + "const": "tag-raise-event" + } + } + }, + "then": { + "$ref": "#/definitions/HTML_Rule_TagRaiseEvent" + } + }, + { + "if": { + "properties": { + "ruleType": { + "const": "tag-remove" + } + } + }, + "then": { + "$ref": "#/definitions/HTML_Rule_TagRemove" + } + }, + { + "if": { + "properties": { + "ruleType": { + "const": "tag-remove-attribute" + } + } + }, + "then": { + "$ref": "#/definitions/HTML_Rule_TagRemoveAttribute" + } + } + ], + "required": [ + "class", + "ruleType" + ] + }, + "HTML_Rule_Match_Attribute_Optional": { + "title": "HTML_Rule_Match_Attribute_Optional", + "description": "Matches on the specified tag name, attribute name, and attribute value. Attribute name and value are optional.", + "type": "object", + "properties": { + "match": { + "title": "Match", + "description": "Properties the rule is to match", + "type": "object", + "properties": { + "attributeName": { + "title": "Attribute Name", + "description": "Name of attribute", + "type": "string" + }, + "attributeValue": { + "title": "Attribute Value", + "description": "Value of attribute", + "type": "string" + }, + "tagName": { + "title": "Tag Name", + "description": "Name of tag", + "type": "string" + } + }, + "dependencies": { + "attributeValue": { + "required": [ + "attributeName" + ] + } + }, + "required": [ + "tagName" + ] + } + }, + "required": [ + "match" + ] + }, + "HTML_Rule_Match_Attribute_Required": { + "title": "HTML_Rule_Match_Attribute_Required", + "description": "Matches on the specified tag name, attribute name, and attribute value. Attribute name and value are required.", + "type": "object", + "properties": { + "match": { + "title": "Match", + "description": "Properties the rule is to match", + "type": "object", + "properties": { + "attributeName": { + "title": "Attribute Name", + "description": "Name of attribute", + "type": "string" + }, + "attributeValue": { + "title": "Attribute Value", + "description": "Value of attribute", + "type": "string" + }, + "tagName": { + "title": "Tag Name", + "description": "Name of tag", + "type": "string" + } + }, + "required": [ + "tagName", + "attributeName", + "attributeValue" + ] + } + }, + "required": [ + "match" + ] + }, + "HTML_Rule_TagAppendHTML": { + "title": "Append HTML HTML_Rule", + "description": "Matches on the specified tag name and optional attribute name and attribute value, and then appends the specified HTML content to the tag delimiter.", + "type": "object", + "properties": { + "content": { + "title": "Content", + "description": "HTML content to append to tag delimiter", + "type": "string" + } + }, + "allOf": [ + { + "$ref": "#/definitions/HTML_Rule_Match_Attribute_Optional" + } + ], + "required": [ + "content" + ] + }, + "HTML_Rule_TagPrependHTML": { + "title": "HTML_Rule_TagPrependHTML", + "description": "Matches on the specified tag name and optional attribute name and attribute value, and then prepends the specified HTML content to the tag delimiter.", + "type": "object", + "properties": { + "content": { + "title": "Content", + "description": "HTML content to prepend to tag delimiter", + "type": "string" + } + }, + "allOf": [ + { + "$ref": "#/definitions/HTML_Rule_Match_Attribute_Optional" + } + ], + "required": [ + "content" + ] + }, + "HTML_Rule_TagRaiseEvent": { + "title": "HTML_Rule_TagRaiseEvent", + "description": "Matches on the specified tag name and optional attribute name and attribute value, and then raises an event.", + "type": "object", + "allOf": [ + { + "$ref": "#/definitions/HTML_Rule_Match_Attribute_Optional" + } + ] + }, + "HTML_Rule_TagRemove": { + "title": "HTML_Rule_TagRemove", + "description": "Matches on the specified tag name and optional attribute name and attribute value, and then removes the tag.", + "type": "object", + "allOf": [ + { + "$ref": "#/definitions/HTML_Rule_Match_Attribute_Optional" + } + ] + }, + "HTML_Rule_TagRemoveAttribute": { + "title": "Append HTML HTML_Rule", + "description": "Matches on the specified tag name, attribute name, and attribute value, and then removes a specified attribute. Tag name, attribute name, and value are required.", + "type": "object", + "properties": { + "attributeName": { + "title": "Attriute Name", + "description": "Name of the attribute to be removed", + "type": "string" + } + }, + "allOf": [ + { + "$ref": "#/definitions/HTML_Rule_Match_Attribute_Required" + } + ], + "required": [ + "attributeName" + ] + }, + "HTML_Profile": { + "title": "HTML_Profile", + "type": "object", + "description": "HTML profile with configurable options", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "HTML_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "contentDetectionEnabled": { + "title": "Content Detection Enabled", + "description": "Scans initial HTTP payload to look for HTML signatures and enables HTML profile if HTML-like patterns are detected", + "type": "boolean", + "default": false + }, + "contentSelection": { + "title": "Content Selection", + "description": "Matches content-type from response header against a list of the content-types and enables HTML profile if a match is found", + "type": "array", + "items": { + "title": "Content Type", + "type": "string" + }, + "default": [ + "text/html", + "text/xhtml" + ], + "uniqueItems": true + }, + "rules": { + "title": "HTML Rules", + "description": "HTML Rules followed by the profile", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_HTML_Rule" + } + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "WebSocket_Profile": { + "additionalProperties": false, + "allOf": [ + { + "if": { + "properties": { + "masking": { + "const": "preserve" + } + }, + "required": [ + "masking" + ] + }, + "then": { + "properties": { + "compressMode": { + "not": { + "const": "typed" + } + } + }, + "required": [ + "compressMode" + ] + } + } + ], + "description": "WebSocket profile with configurable options", + "properties": { + "class": { + "const": "WebSocket_Profile", + "title": "Class", + "type": "string" + }, + "compressMode": { + "default": "preserved", + "description": "Available when TMOS version is 16.1 or newer. Specifies the mode that controls what compression operations are performed. Setting 'masking' to 'preserve' and 'compressMode' to 'typed' will not be allowed because it results in an invalid configuration.", + "enum": [ + "preserved", + "typed" + ], + "title": "Compress Mode", + "type": "string" + }, + "compression": { + "default": true, + "description": "Available when TMOS version is 16.1 or newer and used when compressMode is 'typed'. Specifies whether compress will be negotiated with the endpoint.", + "title": "Compression", + "type": "boolean" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "masking": { + "default": "selective", + "description": "Specifies the masking operation for WebSocket frames", + "enum": [ + "preserve", + "unmask", + "remask", + "selective" + ], + "title": "Masking", + "type": "string" + }, + "maximumWindowSize": { + "default": 10, + "description": "Available when TMOS version is 16.1 or newer and used when compressMode is 'typed'. Specifies the maximum sliding window for compression negotiated with the endpoint.", + "maximum": 15, + "minimum": 8, + "title": "Maximum Window Size", + "type": "integer" + }, + "noDelay": { + "default": true, + "description": "Available when TMOS version is 16.1 or newer and used when compressMode is 'typed'. Specifies whether data should be buffered for efficient compression, or compressed without delay.", + "title": "No Delay", + "type": "boolean" + }, + "remark": { + "$ref": "#/definitions/Remark" + } + }, + "title": "WebSocket_Profile", + "type": "object" + }, + "Multiplex_Profile": { + "title": "Multiplex_Profile", + "type": "object", + "description": "Multiplex (OneConnect) profile with configurable options", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Multiplex_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "sourceMask": { + "title": "Source Address Mask", + "description": "Idle connection re-use applies to connections whose source address matches this mask", + "type": "string", + "format": "f5ip" + }, + "maxConnections": { + "title": "Maximum Connections", + "description": "Specifies the maximum number of connections that the system holds in the connection reuse pool.", + "type": "integer", + "minimum": 0, + "default": 10000 + }, + "maxConnectionAge": { + "title": "Maximum Connection Age", + "description": "Specifies the maximum age, in number of seconds, of a connection in the connection reuse pool.", + "type": "integer", + "minimum": 0, + "default": 86400 + }, + "maxConnectionReuse": { + "title": "Maximum Connection Reuse", + "description": "Specifies the maximum number of times that a server connection can be reused.", + "type": "integer", + "minimum": 0, + "default": 1000 + }, + "idleTimeoutOverride": { + "title": "Idle Timeout Override", + "description": "Specifies the number of seconds that a connection is idle before the connection flow is eligible for deletion.", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "connectionLimitEnforcement": { + "title": "Connection Limit Enforcement", + "description": "When the limit is 'none', simultaneous in-flight requests and responses over TCP connections to a pool member are counted toward the limit. When the limit is 'idle', idle connections will be dropped as the TCP connection limit is reached. When the limit is 'strict', idle connections will prevent new TCP connections from being made until they expire (not recommended).", + "type": "string", + "enum": [ + "none", + "idle", + "strict" + ], + "default": "none" + }, + "sharePools": { + "title": "Share Pools", + "description": "Indicates that TCP connections for the current pool may be shared among similar virtual servers using the same pool.", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false, + "required": [ + "class" + ] + }, + "SOCKS_Profile": { + "title": "SOCKS_Profile", + "description": "Configures a SOCKS (Socket Secure) profile", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "SOCKS_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "protocolVersions": { + "description": "Specifies the SOCKS protocol versions that are supported", + "type": "array", + "items": { + "type": "string", + "enum": [ + "socks4", + "socks4a", + "socks5" + ] + }, + "default": [ + "socks4", + "socks4a", + "socks5" + ], + "minItems": 1, + "uniqueItems": true + }, + "resolver": { + "title": "DNS resolver", + "description": "BIG-IP AS3 pointer to DNS resolver used to resolve hostnames in connect requests", + "type": "object", + "properties": { + "bigip": { + "title": "BIG-IP resolver", + "description": "Pathname of existing BIG-IP net DNS resolver", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "required": [ + "bigip" + ], + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query net dns-resolver" + ] + } + }, + "ipv6First": { + "title": "IPv6 first priority", + "description": "Specifies the relative order of IPv4 and IPv6 DNS resolutions for URIs. If false (default), then the system performs IPv4 lookup before IPv6.", + "type": "boolean", + "default": false + }, + "routeDomain": { + "description": "The route domain that will be used for outbound connect requests", + "oneOf": [ + { + "type": "integer", + "minimum": 0, + "maximum": 65534 + }, + { + "type": "string" + } + ], + "default": 0 + }, + "tunnelName": { + "title": "Tunnel name", + "description": "Name of tunnel used for outbound connect requests", + "type": "string", + "minLength": 1, + "maxLength": 63, + "default": "socks-tunnel", + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query net tunnels tunnel" + ] + } + }, + "defaultConnectAction": { + "title": "Default Connect Action", + "description": "Specifies the behavior of the proxy service for connect requests. If set to 'deny', connect requests will only be honored if there is another virtual server listening for the requested outbound connection. If set to 'allow' outbound connection will be made ragardless of other virtual servers.", + "type": "string", + "enum": [ + "deny", + "allow" + ], + "default": "deny" + } + }, + "additionalProperties": false, + "required": [ + "class", + "resolver" + ] + }, + "TCP_Profile": { + "title": "TCP_Profile", + "description": "Configures a Transmission Control Protocol (TCP) profile", + "type": "object", + "$comment": "Configures TCP settings. When deployed on BIG-IP, defaults match f5-tcp-progressive.", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "TCP_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "abc": { + "title": "Appropriate Byte Counting", + "description": "If true (default), BIG-IP AS3 adjusts the congestion window per rfc3465", + "type": "boolean", + "default": true + }, + "ackOnPush": { + "title": "ACK on PSH", + "description": "If true (default), the system immediately acknowledges segments with the PSH flag set", + "type": "boolean", + "default": true + }, + "autoProxyBufferSize": { + "title": "Automatic proxy-buffer size", + "description": "If true (default), BIG-IP AS3 adjusts the proxy buffer size automatically to optimize throughput", + "type": "boolean", + "default": true + }, + "autoReceiveWindowSize": { + "title": "Automatic receive-window size", + "description": "If true (default), BIG-IP AS3 adjusts the receive window size automatically to optimize throughput", + "type": "boolean", + "default": true + }, + "autoSendBufferSize": { + "title": "Automatic send-buffer size", + "description": "If true (default), BIG-IP AS3 adjusts the send buffer size automatically to optimize throughput", + "type": "boolean", + "default": true + }, + "closeWaitTimeout": { + "title": "Close-wait timeout", + "description": "Number of seconds (default 5) connection will remain in LAST-ACK state before exiting. Value -1 means indefinite, limited by maximum retransmission timeout", + "type": "integer", + "minimum": -1, + "maximum": 3600, + "default": 5 + }, + "congestionControl": { + "title": "Congestion-control algorithm", + "description": "Selects TCP congestion-control algorithm (default 'woodside'). The bbr option is available on BIGIP 14.1 and above.", + "type": "string", + "enum": [ + "bbr", + "cdg", + "chd", + "cubic", + "high-speed", + "illinois", + "new-reno", + "none", + "reno", + "scalable", + "vegas", + "westwood", + "woodside" + ], + "default": "woodside" + }, + "congestionMetricsCache": { + "title": "Congestion metrics cache", + "description": "If true (default), the system may cache congestion metrics to inform the congestion control algorithm", + "type": "boolean", + "default": true + }, + "congestionMetricsCacheTimeout": { + "title": "Congestion metrics cache timeout", + "description": "Number of seconds for which entries in the congestion metrics cache are valid (default 0 means use system default)", + "type": "integer", + "minimum": 0, + "maximum": 1000, + "default": 0 + }, + "deferredAccept": { + "title": "Deferred accept", + "description": "If true, ADC will defer allocating resources to a connection until some payload data has arrived from the client (default false). This may help minimize the impact of certain DoS attacks but adds undesirable latency under normal conditions. Note: 'deferredAccept' is incompatible with server-speaks-first application protocols", + "type": "boolean", + "default": false + }, + "delayedAcks": { + "title": "Delayed ACKs", + "description": "If true (default), the system may coalesce multiple adjacent ACK responses", + "type": "boolean", + "default": true + }, + "delayWindowControl": { + "title": "Delay-window control", + "description": "If true, BIG-IP AS3 uses queueing delay as well as packet loss to estimate congestion (default false)", + "type": "boolean", + "default": false + }, + "dsack": { + "title": "Use D-SACK", + "description": "If true, BIG-IP AS3 uses rfc2883 duplicate selective-acknowledgements extension (default false). Do not enable this option unless you are certain all peers support D-SACK", + "type": "boolean", + "default": false + }, + "earlyRetransmit": { + "title": "Early retransmit", + "description": "If true (default), BIG-IP AS3 uses rfc5827 Early Retransmit recovery", + "type": "boolean", + "default": true + }, + "ecn": { + "title": "Explicit congestion notification", + "description": "If true (default), BIG-IP AS3 may send explicit congestion notification (ECN) flags (CWR, ECE) to peers", + "type": "boolean", + "default": true + }, + "enhancedLossRecovery": { + "title": "Enhanced loss recovery", + "description": "If true (default), BIG-IP AS3 uses Selective ACK data to increase throughput", + "type": "boolean", + "default": true + }, + "fastOpen": { + "title": "Fast-open", + "description": "If true (default), the system can use the TCP Fast Open protocol extension to reduce latency by sending payload data with initial SYN", + "type": "boolean", + "default": true + }, + "fastOpenCookieExpiration": { + "title": "Fast-open cookie expiration", + "description": "Sets maximum lifetime in seconds (default 21600 = six hours) of TCP Fast Open cookies", + "type": "integer", + "minimum": 1, + "maximum": 1000000, + "default": 21600 + }, + "finWaitTimeout": { + "title": "FIN-WAIT timeout", + "description": "Number of seconds (default 5) connection will remain in FIN-WAIT-1 or closing state before exiting. Value -1 means indefinite, limited by maximum retransmission timeout", + "type": "integer", + "minimum": -1, + "maximum": 3600, + "default": 5 + }, + "finWait2Timeout": { + "title": "FIN-WAIT-2 timeout", + "description": "Number of seconds (default 300) connection will remain in LAST-ACK state before closing. Value -1 means indefinite, limited by maximum retransmission timeout", + "type": "integer", + "minimum": -1, + "maximum": 3600, + "default": 300 + }, + "idleTimeout": { + "title": "Idle timeout", + "description": "Number of seconds (default 300; may not be 0) connection may remain idle before it becomes eligible for deletion. Value -1 (not recommended) means infinite", + "type": "integer", + "anyOf": [ + { + "minimum": 1, + "maximum": 86400 + }, + { + "const": -1 + } + ], + "default": 300 + }, + "initCwnd": { + "title": "Initial congestion-window size", + "description": "Sets the initial congestion-window size (default 16) in multiples of MSS (not in octets)", + "type": "integer", + "minimum": 0, + "maximum": 64, + "default": 16 + }, + "initRwnd": { + "title": "Initial receive-window size", + "description": "Sets the initial receive-window size (default 16) in multiples of MSS (not in octets)", + "type": "integer", + "minimum": 0, + "maximum": 64, + "default": 16 + }, + "ipDfMode": { + "title": "IP DF mode", + "description": "Controls DF (Don't Fragment) flag in outgoing packets. Value 'pmtu' (default) sets DF based on IP PMTU value. Value 'preserve' copies DF from received packets. Value 'set' forces DF true in all outgoing packets. Value 'clear' forces DF false in all outgoing packets", + "type": "string", + "enum": [ + "clear", + "pmtu", + "preserve", + "set" + ], + "default": "pmtu" + }, + "ipTosToClient": { + "title": "IP DSCP (TOS) to client", + "description": "Specifies the IP DSCP/TOS value in packets sent to clients (default 0). Numeric values in this property are decimal representations of eight-bit numbers, of which the leftmost six bits are the DSCP per rfc2474 (and the system uses the rightmost two bits for congestion signaling when 'ecn' is true). You may have to calculate the value of this property by multiplying a DSCP code, such as CS5+EF = 46, by four to obtain the proper 'ipTosToClient' value, such as 184. Value 'pass-through' sets DSCP from the initial server-side value. Value 'mimic' copies DSCP from the most-recently received server-side packet (allowing DSCP to vary during the life of a connection)", + "oneOf": [ + { + "type": "integer", + "minimum": 0, + "maximum": 252, + "multipleOf": 4 + }, + { + "type": "string", + "enum": [ + "pass-through", + "mimic" + ] + } + ], + "default": 0 + }, + "keepAliveInterval": { + "title": "Keep-alive interval", + "description": "Number of seconds (default 1800) between keep-alive probes", + "type": "integer", + "minimum": 1, + "maximum": 86400, + "default": 1800 + }, + "limitedTransmit": { + "title": "Limited transmit recovery", + "description": "When true (default), the system can use rfc3042 limited transmit recovery scheme", + "type": "boolean", + "default": true + }, + "linkQosToClient": { + "title": "Link QOS to client", + "description": "Specifies the Layer-2 QOS code in packets sent to clients (default 0). Ethernet-type networks recognize codes from 0 to 7. Value 'pass-through' sets QOS from the initial server-side value", + "oneOf": [ + { + "type": "integer", + "minimum": 0, + "maximum": 7 + }, + { + "type": "string", + "const": "pass-through" + } + ], + "default": 0 + }, + "maxRetrans": { + "title": "Maximum segment retransmissions", + "description": "Sets maximum number of times the system may retransmit a segment (default 8)", + "type": "integer", + "minimum": 0, + "maximum": 12, + "default": 8 + }, + "maxSegmentSize": { + "title": "MSS", + "description": "Sets MSS advertised to peer. Value 0 (default) will set MSS automatically in proportion to interface MTU. Default 0 is usually the best choice", + "type": "integer", + "anyOf": [ + { + "minimum": 28, + "maximum": 8960 + }, + { + "const": 0 + } + ], + "default": 0 + }, + "md5Signature": { + "title": "MD5 signatures", + "description": "If true, the system signs TCP headers using MD5 per rfc2385 (default false)", + "type": "boolean", + "default": false + }, + "md5SignaturePassphrase": { + "title": "MD5 passphrase", + "description": "Passphrase from which the system derives the key for MD5 signatures (MACs) when 'md5signature' is true", + "type": "object", + "properties": { + "allowReuse": { + "description": "If true, other declaration objects may reuse this value", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Secret" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "object" + } + }, + { + "f5PostProcess": { + "tag": "secret" + } + } + ] + }, + "minimumRto": { + "title": "Minimum retransmission timeout", + "description": "Minimum retransmission timeout in milliseconds (default 1000)", + "type": "integer", + "minimum": 1, + "maximum": 5000, + "default": 1000 + }, + "mptcp": { + "title": "Multipath TCP (MPTCP)", + "description": "Value 'disable' (default) excludes use of Multipath TCP (MPTCP) through virtual server. Value 'enable' means virtual server will accept and participate in MPTCP connections. Value 'passthrough' means MPTCP packets may pass through virtual server", + "type": "string", + "enum": [ + "disable", + "enable", + "passthrough" + ], + "default": "disable" + }, + "mptcpCsum": { + "title": "MPTCP checksums", + "description": "If true, the system calculates MPTCP checksums (default false)", + "type": "boolean", + "default": false + }, + "mptcpCsumVerify": { + "title": "MPTCP checksum verify", + "description": "If true, the system verifies MPTCP checksums (default false)", + "type": "boolean", + "default": false + }, + "mptcpFallback": { + "title": "MPTCP fallback action", + "description": "Selects action on fallback from MPTCP to ordinary TCP", + "type": "string", + "enum": [ + "accept", + "active-accept", + "reset", + "retransmit" + ], + "default": "reset" + }, + "mptcpFastJoin": { + "title": "MPTCP fast join", + "description": "If true, the system may send data with MP_JOIN SYN packet, reducing connection latency (default false)", + "type": "boolean", + "default": false + }, + "mptcpIdleTimeout": { + "title": "Idle timeout", + "description": "Number of seconds (default 300) connection may remain idle before it becomes eligible for deletion", + "type": "integer", + "minimum": 1, + "maximum": 86400, + "default": 300 + }, + "mptcpJoinMax": { + "title": "MPTCP join maximum", + "description": "Limit on number of subflows which the system may add to the MPTCP connection (default 5)", + "type": "integer", + "minimum": 1, + "maximum": 20, + "default": 5 + }, + "mptcpMakeAfterBreak": { + "title": "MPTCP make-after-break", + "description": "If true, the system can add additional subflows during the 'mptcpTimeout' period, even if the ADC is not currently handling an active connection (default false)", + "type": "boolean", + "default": false + }, + "mptcpNoJoinDssAck": { + "title": "MPTCP fast join", + "description": "If true, no DSS option will sent with MP_JOIN ACK packet (default false)", + "type": "boolean", + "default": false + }, + "mptcpRtoMax": { + "title": "MPTCP RTO maximum", + "description": "Maximum number of retransmission timeouts which may occur before the system declares a subflow dead", + "type": "integer", + "minimum": 1, + "maximum": 20, + "default": 5 + }, + "mptcpRetransmitMin": { + "title": "MPTCP retransmit timer", + "description": "Minimum value in milliseconds (default 1000) of MPTCP retransmission timer", + "type": "integer", + "minimum": 1, + "maximum": 5000, + "default": 1000 + }, + "mptcpSubflowMax": { + "title": "MPTCP subflow maximum", + "description": "Maximum number of subflows per connection (default 6)", + "type": "integer", + "minimum": 1, + "maximum": 20, + "default": 6 + }, + "mptcpTimeout": { + "title": "MPTCP timeout", + "description": "Number of seconds (default 3600) after which the system may expunge an MPTCP session with no active flow", + "type": "integer", + "minimum": 60, + "maximum": 3600, + "default": 3600 + }, + "nagle": { + "title": "Nagle's algorithm", + "description": "Value 'enable' means to use Nagle's algorithm to minimize the transmission of short TCP segments (note: Nagle's algorithm yields undesirable results with many application protocols). Value 'auto' (default) means the ADC will choose automatically whether to enable Nagle's algorithm. Value 'disable' averts application of Nagle's algorithm", + "type": "string", + "enum": [ + "disable", + "enable", + "auto" + ], + "default": "auto" + }, + "pktLossIgnoreBurst": { + "title": "Packet loss ignore burst", + "description": "Modulates use of congestion control when losing multiple packets. Value 0 (default) means to perform congestion control if any packet loss occurs. Higher values increase tolerance for lost packets before signaling congestion", + "type": "integer", + "minimum": 0, + "maximum": 32, + "default": 0 + }, + "pktLossIgnoreRate": { + "title": "Packet loss ignore rate", + "description": "Sets threshold of packet loss rate (lost-packets/million-packets) above which the system performs congestion control. Value 0 (default) means to perform congestion control if any packet loss occurs. Higher values increase tolerance for lost packets before signaling congestion", + "type": "integer", + "minimum": 0, + "maximum": 1000000, + "default": 0 + }, + "proxyBufferHigh": { + "title": "Proxy-buffer high", + "description": "The system closes the receive window when the number of octets in proxy buffer rises above this value", + "type": "integer", + "minimum": 64, + "maximum": 33554432, + "default": 262144 + }, + "proxyBufferLow": { + "title": "Proxy-buffer low", + "description": "The system opens the receive window when the number of octets in proxy buffer falls below this value", + "type": "integer", + "minimum": 64, + "maximum": 33554432, + "default": 196608 + }, + "proxyMSS": { + "title": "Proxy MSS", + "description": "If true (default), the MSS value advertised on the server side will match that negotiated with the client, if permitted by MTU and other constraints", + "type": "boolean", + "default": true + }, + "proxyOptions": { + "title": "Proxy options", + "description": "If true, TCP options such as timestamp advertised on the server side will match those negotiated with client (default false)", + "type": "boolean", + "default": false + }, + "pushFlag": { + "title": "PuSH flag control", + "description": "Controls when ADC sets PSH flag in outbound TCP segments. Limiting the sending of segments with PSH improves performance. Value 'auto' (recommended) sets PSH according to a system algorithm optimal in most cases. Value 'default' (not recommended) sets the PUSH flag in every segment which happens to empty the send buffer. Value 'none' prevents use of the PSH flag, and 'one' means the system sets PSH only when FIN is, at the end of a connection", + "type": "string", + "enum": [ + "auto", + "default", + "none", + "one" + ], + "default": "auto" + }, + "ratePace": { + "title": "Rate pace", + "description": "If true (default), system will automatically pace rate of data transmission to optimize throughput", + "type": "boolean", + "default": true + }, + "ratePaceMaxRate": { + "title": "Rate pace maximum rate", + "description": "Limit maximum data-transmission rate in octets/second to this value when 'ratePace' is true. Default 0 means choose maximum rate automatically", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "$comment": "maximum in future: 137438953472", + "default": 0 + }, + "receiveWindowSize": { + "title": "Receive-window size", + "description": "Maximum size of receive window (octets, default 131072)", + "type": "integer", + "minimum": 64, + "maximum": 33554432, + "default": 131072 + }, + "resetOnTimeout": { + "title": "Reset on timeout", + "description": "If true (default), connections which time out will be reset (that is, the system will send an RST packet to the peer) before the system expunges them. Value false is not recommended", + "type": "boolean", + "default": true + }, + "retransmitThreshold": { + "title": "Retransmit threshold", + "description": "Specifies the number of duplicate ACKs to start fast recovery", + "type": "integer", + "minimum": 0, + "maximum": 12, + "default": 3 + }, + "selectiveAcks": { + "title": "Selective ACKs", + "description": "If true (default), the system negotiates rfc2018 Selective Acknowledgements with peers", + "type": "boolean", + "default": true + }, + "selectiveNack": { + "title": "Selective NAK", + "description": "If true, the system negotiates Selective Negative Acknowledgements with peers (default false)", + "type": "boolean", + "default": false + }, + "sendBufferSize": { + "title": "Send-buffer size", + "description": "Maximum size of send buffer (octets, default 262144)", + "type": "integer", + "minimum": 64, + "maximum": 33554432, + "default": 262144 + }, + "slowStart": { + "title": "Slow-start", + "description": "If true (default), BIG-IP AS3 adjusts the initial window size per rfc3390. This generally makes connections start more quickly, NOT more slowly", + "type": "boolean", + "default": true + }, + "synCookieEnable": { + "title": "SYN cookie enable", + "description": "If true (default), the system may use SYN cookies to avert connection-table overflow (for example, from DoS attacks)", + "type": "boolean", + "default": true + }, + "synCookieAllowlist": { + "title": "SYN cookie allowlist", + "description": "If true, after a client responds successfully to a SYN cookie challenge, the system accepts additional connection requests from that client without challenge for 30 seconds.", + "type": "boolean" + }, + "synCookieWhitelist": { + "title": "SYN cookie whitelist", + "description": "Deprecated. Replaced with functionally equivalent synCookieAllowlist. If true, after a client responds successfully to a SYN cookie challenge, the system accepts additional connection requests from that client without challenge for 30 seconds.", + "type": "boolean", + "default": false + }, + "synMaxRetrans": { + "title": "Maximum SYN retransmissions", + "description": "Maximum number of times the system retransmits a SYN when it does not receive a SYN+ACK (default 3)", + "type": "integer", + "minimum": 0, + "maximum": 12, + "default": 3 + }, + "synRtoBase": { + "title": "SYN RTO base", + "description": "Number of milliseconds (default 3000) to which the system initially sets the SYN retransmission timer. The system adjusts the timer after each retransmission to implement binary-exponential-backoff", + "type": "integer", + "minimum": 0, + "maximum": 5000, + "default": 3000 + }, + "tailLossProbe": { + "title": "Tail loss probe", + "description": "If true (default), the system uses the Tail Loss Probe scheme to reduce retransmission timeouts", + "type": "boolean", + "default": true + }, + "tcpOptions": { + "title": "TCP options capture for iRules", + "description": "Selects which TCP Option values the system captures for reference by iRules", + "type": "array", + "items": { + "title": "Option", + "type": "object", + "properties": { + "option": { + "title": "Number", + "description": "Specifies the TCP option to capture", + "type": "integer", + "minimum": 0, + "maximum": 255 + }, + "when": { + "title": "When seen", + "description": "Specifies when to capture the TCP option", + "type": "string", + "enum": [ + "first", + "last" + ] + } + }, + "additionalProperties": false + }, + "maxItems": 255, + "$comment": "uniqueItems: true" + }, + "timestamps": { + "title": "Timestamps", + "description": "If true (default and recommended), BIG-IP AS3 enables rfc1323 timestamps", + "type": "boolean", + "default": true + }, + "timeWaitRecycle": { + "title": "TIME-WAIT recycle", + "description": "If true (default), the system reuses connection resources immediately when it receives a SYN during the TIME-WAIT period", + "type": "boolean", + "default": true + }, + "timeWaitTimeout": { + "title": "Time-wait timeout", + "description": "Number of milliseconds (default 2,000) connection will remain in TIME-WAIT state before closing. Value -1 means indefinite", + "type": "integer", + "minimum": -1, + "maximum": 600000, + "default": 2000 + }, + "ttlMode": { + "title": "TTL mode", + "description": "Controls IP TTL in outgoing packets. Value 'set' forces TTL to value of property 'ttlIPv4' or 'ttlIPv6' as appropriate. Value 'proxy' (default) forces TTL to the default value for IPv4 or IPv6 as appropriate. Value 'preserve' copies TTL from received packet. Value 'decrement' sets TTL to one less than received packet's TTL", + "type": "string", + "enum": [ + "decrement", + "preserve", + "proxy", + "set" + ], + "default": "proxy" + }, + "ttlIPv4": { + "title": "TTL for IPv4", + "description": "TTL the system sets in outgoing IPv4 packets", + "type": "integer", + "minimum": 1, + "maximum": 255, + "default": 255 + }, + "ttlIPv6": { + "title": "TTL for IPv6", + "description": "TTL the system sets in outgoing IPv6 packets", + "type": "integer", + "minimum": 1, + "maximum": 255, + "default": 64 + }, + "verifiedAccept": { + "title": "Verified accept", + "description": "If true, the system must establish a server-side connection before a it accepts a corresponding client-side connection (default false). Value 'true' is incompatible with iRules", + "type": "boolean", + "default": false + }, + "zeroWindowTimeout": { + "title": "Zero-window timeout", + "description": "Number of milliseconds (default 20,000) connection will persist with window-size of zero (effective timeout is value rounded up to the nearest multiple of 5000). Value -1 means indefinite", + "type": "integer", + "minimum": -1, + "maximum": 86400000, + "default": 20000 + } + }, + "additionalProperties": false, + "required": [ + "class" + ], + "f5aliases": { + "synCookieAllowlist": "synCookieWhitelist" + } + }, + "Classification_Profile": { + "title": "Classification_Profile", + "description": "Configures a classification profile", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Classification_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "parentProfile": { + "description": "Specifies the name of the object to inherit the settings from", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Classification_Profile" + } + ], + "default": { + "bigip": "/Common/classification" + } + }, + "appDetectionEnabled": { + "description": "Enables/disables Application Detection feature", + "type": "boolean", + "default": true + }, + "urlCategorizationEnabled": { + "description": "Enables/disables URL Categorization feature", + "type": "boolean", + "default": false + }, + "iRuleEventEnabled": { + "description": "Enables/disables CLASSIFICATION_DETECTED iRule event generation", + "type": "boolean", + "default": false + }, + "logPublisher": { + "$ref": "#/definitions/Pointer_Log_Publisher" + }, + "logUnclassifiedDomain": { + "description": "Enables/disables unclassified domain logging", + "type": "boolean", + "default": false + }, + "preset": { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Classification_Preset" + } + ], + "default": { + "bigip": "/Common/ce" + } + }, + "statisticsCollectionEnabled": { + "description": "Enables/disables statistics collection", + "type": "boolean", + "default": false + }, + "statisticsPublisher": { + "$ref": "#/definitions/Pointer_Log_Publisher" + } + }, + "additionalProperties": false, + "required": [ + "class" + ] + }, + "Radius_Profile": { + "title": "Radius_Profile", + "description": "Configures a RADIUS profile for network traffic load balancing", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Radius_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "parentProfile": { + "description": "Specifies the name of the object to inherit the settings from", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Radius_Profile" + } + ], + "default": { + "bigip": "/Common/radiusLB" + } + }, + "persistAttribute": { + "description": "Specifies the name of the RADIUS attribute on which traffic persists. Acceptable values are ASCII strings from section 5 of RFC 2865 or numeric codes (1-255). A value of none indicates that persistence is disabled.", + "oneOf": [ + { + "type": "integer", + "minimum": 1, + "maximum": 255 + }, + { + "type": "string", + "enum": [ + "none", + "User-Name", + "User-Password", + "NAS-IP-Address", + "NAS-Port", + "Service-Type", + "Framed-Protocol", + "Framed-IP-Address", + "Framed-IP-Netmask", + "Framed-Routing", + "Filter-Id", + "Framed-MTU", + "Framed-Compression", + "Login-IP-Host", + "Login-Service", + "Login-TCP-Port", + "Reply-Message", + "Callback-Number", + "Callback-Id", + "Framed-Route", + "Framed-IPX-Network", + "State", + "Class", + "Vendor-Specific", + "Session-Timeout", + "Idle-Timeout", + "Termination-Action", + "Called-Station-Id", + "Calling-Station-Id", + "NAS-Identifier", + "Proxy-State", + "Login-LAT-Service", + "Login-LAT-Node", + "Login-LAT-Group", + "Framed-AppleTalk-Link", + "Framed-AppleTalk-Network", + "Framed-AppleTalk-Zone", + "CHAP-Challenge", + "NAS-Port-Type", + "Port-Limit", + "Login-LAT-Port" + ] + } + ], + "default": "none" + }, + "protocolProfile": { + "description": "Specifies PEM protocol profile that defines mapping of RADIUS AVPs to subscriber ID and other PEM subscriber session attributes", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "pem", + "afm" + ] + } + }, + { + "$ref": "#/definitions/Pointer_Enforcement_Protocol_Profile_Radius" + } + ], + "default": { + "bigip": "/Common/_sys_radius_proto_imsi" + } + }, + "subscriberDiscoveryEnabled": { + "description": "Specifies whether to enable PEM subscriber discovery based on the content of RADIUS packets", + "type": "boolean", + "f5PostProcess": { + "tag": "modules", + "data": [ + "pem", + "afm" + ] + }, + "default": true + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "IP_Other_Profile": { + "title": "IP_Other_Profile", + "description": "Configures a generic IP profile for non-TCP and non-UDP traffic", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "IP_Other_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "parentProfile": { + "description": "Specifies the name of the object to inherit the settings from", + "allOf": [ + { + "$ref": "#/definitions/Pointer_IP_Other_Profile" + } + ], + "default": { + "bigip": "/Common/ipother" + } + }, + "idleTimeout": { + "description": "Specifies the number of seconds a connection can be idle before the connection is eligible for deletion", + "$comment": "It might be possible to specify a value of 0 and remove the immediate option", + "if": { + "type": "integer" + }, + "then": { + "type": "integer", + "minimum": 0, + "maximum": 4294967295 + }, + "else": { + "type": "string", + "enum": [ + "indefinite", + "immediate" + ] + }, + "default": 60 + } + }, + "additionalProperties": false, + "required": [ + "class" + ] + }, + "Label": { + "title": "Label", + "description": "Optional friendly name for this object. Allows 0-64 chars, excluding a few likely to cause trouble with string searching, JS, TCL, or HTML", + "type": "string", + "pattern": "^[^\\x00-\\x1f\\x22#&*<>?\\x5b-\\x5d`\\x7f]*$", + "minLength": 0, + "maxLength": 64 + }, + "Remark": { + "title": "Remark", + "description": "Arbitrary (brief) text pertaining to this object. Allows 0-64 chars, excluding only control characters, double-quote, and backslash. This is permissive enough that you should worry about XSS attacks", + "type": "string", + "pattern": "^[^\\x00-\\x1f\\x22\\x5c\\x7f]*$", + "minLength": 0, + "maxLength": 64 + }, + "F5base64": { + "type": "string", + "description": "Slightly over-matches both base64-orig and base64-url data", + "pattern": "^([0-9A-Za-z/+_-]*|[0-9A-Za-z/+_-]+={1,2})$" + }, + "F5string": { + "title": "String value", + "description": "String value optionally in base64 or from URL or BIG-IP AS3 pointer", + "if": { + "not": { + "type": "object" + } + }, + "then": { + "type": "string" + }, + "else": { + "$comment": "May add 'cryptogram' in future.", + "properties": { + "base64": { + "title": "Base64", + "description": "Base64-encoded value (in JSON string)", + "type": "string", + "allOf": [ + { + "$ref": "#/definitions/F5base64" + } + ] + }, + "text": { + "title": "Text", + "description": "UTF-8 text (in JSON string)", + "type": "string" + }, + "url": { + "$ref": "#/definitions/Resource_URL" + }, + "copyFrom": { + "title": "Copy from", + "description": "BIG-IP AS3 pointer to declaration object/property from which to copy value", + "type": "string", + "format": "f5pointer" + }, + "bigip": { + "title": "BIG-IP component pathname", + "description": "Pathname of existing BIG-IP component", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1 + } + }, + "Metadata": { + "title": "Metadata", + "type": "object", + "description": "Useful datapoints for tracking, tagging, and organizing declarations.", + "$comment": "Properties are arbitrarily set by the user.", + "additionalProperties": { + "type": "object", + "properties": { + "value": { + "type": "string" + }, + "persist": { + "type": "boolean", + "default": true + } + }, + "required": [ + "value" + ], + "additionalProperties": false + } + }, + "Rewrite_Profile": { + "title": "Rewrite_Profile", + "type": "object", + "description": "Configures a rewrite profile", + "properties": { + "class": { + "type": "string", + "const": "Rewrite_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "bypassList": { + "description": "List of URIs that are bypassed in a web page when a rewrite mode of portal is used", + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "clientCachingType": { + "description": "The type of client caching used", + "type": "string", + "enum": [ + "cache-all", + "cache-css-js", + "cache-img-css-js", + "no-cache" + ], + "default": "cache-css-js" + }, + "javaCaFile": { + "description": "The CA Bundle used to verify Java applets signature certificates", + "allOf": [ + { + "$ref": "#/definitions/Pointer_CA_Bundle" + } + ], + "default": { + "bigip": "/Common/ca-bundle.crt" + } + }, + "javaSignKeyPassphrase": { + "description": "Passphrase if any for query authentication", + "type": "object", + "properties": { + "allowReuse": { + "description": "If true, other declaration objects may reuse this value", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Secret" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "object" + } + }, + { + "f5PostProcess": { + "tag": "secret" + } + } + ] + }, + "certificate": { + "description": "BIG-IP AS3 pointer to client Certificate declaration (optional)", + "type": "string", + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Certificate" + } + }, + "required": [ + "class" + ] + } + } + }, + "locationSpecificEnabled": { + "description": "Specifies if this contains an attribute with values specific to the location that the BIG-IP device resides", + "type": "boolean", + "default": false + }, + "requestSettings": { + "description": "The request settings used for uri-translation", + "allOf": [ + { + "$ref": "#/definitions/Rewrite_Profile_Request_Settings" + } + ], + "default": {} + }, + "responseSettings": { + "description": "The response settings used for uri-translation", + "allOf": [ + { + "$ref": "#/definitions/Rewrite_Profile_Response_Settings" + } + ], + "default": {} + }, + "rewriteList": { + "description": "List of URIs that are rewritten inside a web page when a rewrite mode of portal is used", + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "rewriteMode": { + "description": "The mode of rewriting that is used.uri-translation is a rules-based rewrite mode. portal is for use with Portal Access", + "type": "string", + "enum": [ + "portal", + "uri-translation" + ], + "default": "portal" + }, + "setCookieRules": { + "description": "The rules for rewriting HTTP Set-Cookie headers. Used with a rewrite mode of uri-translation", + "type": "array", + "items": { + "$ref": "#/definitions/Rewrite_Profile_Set_Cookie_Rule" + } + }, + "splitTunnelingEnabled": { + "description": "Determines if the profile provides for split tunneling", + "type": "boolean", + "default": false + }, + "uriRules": { + "description": "The rules for rewriting request and response headers and response bodies. Used with a rewrite mode of uri-translation", + "type": "array", + "items": { + "$ref": "#/definitions/Rewrite_Profile_Uri_Rule" + } + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "Rewrite_Profile_Set_Cookie_Rule": { + "description": "A Set-Cookie rule", + "type": "object", + "properties": { + "client": { + "description": "The client domain and path", + "type": "object", + "properties": { + "domain": { + "description": "The domain of the client", + "type": "string", + "minLength": 1 + }, + "path": { + "description": "The path of the client. Must be an absolute directory path", + "type": "string", + "minLength": 1 + } + }, + "required": [ + "domain", + "path" + ], + "additionalProperties": false + }, + "server": { + "description": "The server domain and path", + "type": "object", + "properties": { + "domain": { + "description": "The domain of the server", + "type": "string", + "minLength": 1 + }, + "path": { + "description": "The path of the server. Must be an absolute directory path", + "type": "string", + "minLength": 1 + } + }, + "required": [ + "domain", + "path" + ], + "additionalProperties": false + } + }, + "required": [ + "client", + "server" + ], + "additionalProperties": false + }, + "Rewrite_Profile_Uri_Rule": { + "description": "A URI rule", + "type": "object", + "properties": { + "type": { + "description": "The type of rule. request will affect request headers only, response will affect response headers and bodies, and both will do request and response", + "type": "string", + "enum": [ + "both", + "request", + "response" + ], + "default": "both" + }, + "client": { + "description": "The client URI", + "type": "object", + "properties": { + "scheme": { + "description": "The scheme of the client URI", + "type": "string" + }, + "host": { + "description": "The host of the client URI", + "type": "string", + "minLength": 1 + }, + "port": { + "description": "The port of the client URI", + "type": "string" + }, + "path": { + "description": "The path of the client URI. Must be an absolute directory path", + "type": "string", + "minLength": 1 + } + }, + "required": [ + "path" + ], + "dependencies": { + "host": { + "required": [ + "path", + "scheme" + ] + }, + "scheme": { + "required": [ + "path", + "host" + ] + }, + "port": { + "required": [ + "path", + "host", + "scheme" + ] + } + }, + "additionalProperties": false + }, + "server": { + "description": "The server URI", + "type": "object", + "properties": { + "scheme": { + "description": "The scheme of the server URI", + "type": "string" + }, + "host": { + "description": "The host of the server URI", + "type": "string", + "minLength": 1 + }, + "port": { + "description": "The port of the server URI", + "type": "string" + }, + "path": { + "description": "the path of the server URI. Must be an absolute directory path", + "type": "string", + "minLength": 1 + } + }, + "required": [ + "path" + ], + "dependencies": { + "host": { + "required": [ + "path", + "scheme" + ] + }, + "scheme": { + "required": [ + "path", + "host" + ] + }, + "port": { + "required": [ + "path", + "host", + "scheme" + ] + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "Rewrite_Profile_Request_Settings": { + "description": "Request settings for Rewrite_Profile", + "type": "object", + "properties": { + "insertXforwardedForEnabled": { + "description": "Determines if X-Forwarded-For header", + "type": "boolean", + "default": true + }, + "insertXforwardedHostEnabled": { + "description": "Determines if X-Forwarded-Proto header", + "type": "boolean", + "default": false + }, + "insertXforwardedProtoEnabled": { + "description": "Determines if X-Forwarded-Host header", + "type": "boolean", + "default": false + }, + "rewriteHeadersEnabled": { + "description": "Determines if request headers are rewritten", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false + }, + "Rewrite_Profile_Response_Settings": { + "description": "Response settings for Rewrite_Profile", + "type": "object", + "properties": { + "rewriteContentEnabled": { + "description": "Determines if response content should be rewritten", + "type": "boolean", + "default": true + }, + "rewriteHeadersEnabled": { + "description": "Determines if response headers should be rewritten", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false + }, + "Stream_Profile": { + "title": "Stream_Profile", + "description": "Configures a Stream profile", + "type": "object", + "properties": { + "class": { + "type": "string", + "const": "Stream_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "parentProfile": { + "description": "Specifies the profile that this profile will inherit values from", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Stream_Profile" + } + ], + "default": { + "bigip": "/Common/stream" + } + }, + "chunkingEnabled": { + "description": "Specifies that incoming data should be parsed in chunks", + "type": "boolean", + "default": false + }, + "chunkSize": { + "description": "The maximum size that a parsed chunk can be", + "type": "integer", + "minimum": 1024, + "maximum": 65535, + "default": 4096 + }, + "source": { + "description": "Specifies the string to rewrite", + "type": "string" + }, + "target": { + "description": "Specifies the new string that will replace the source string", + "type": "string" + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "Access_Profile": { + "title": "Access_Profile", + "description": "Configures an Access Profile", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "apm" + ] + }, + "properties": { + "class": { + "type": "string", + "const": "Access_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "url": { + "title": "URL", + "description": "The URL to pull the Access Profile from", + "allOf": [ + { + "$ref": "#/definitions/Resource_URL" + } + ] + }, + "ssloCreated": { + "title": "SSL Orchestrator Created", + "description": "Set to true if the profile was created by SSL Orchestrator. If true the non-configurable Kerberos Request-Based Authentication (/Common/rba) and WebSSO (/Common/websso) profiles will not be attached to Services when this profile is attached", + "type": "boolean", + "default": false + }, + "ignoreChanges": { + "title": "Ignore changes", + "description": "If false (default), the system updates the profile in every BIG-IP AS3 declaration deployment. If true, BIG-IP AS3 creates the profile on first deployment, and leaves it untouched afterwards. However, if enable is set to true, the policy will be applied even if ignoreChanges is true", + "type": "boolean", + "default": false + }, + "enable": { + "title": "Enable", + "description": "Apply the profile after updating it. If false (default), the system only updates the profile. Also note 'ignoreChanges'.", + "type": "boolean", + "default": false + } + }, + "required": [ + "class", + "url" + ], + "additionalProperties": false + }, + "Per_Request_Access_Policy": { + "title": "Per_Request_Access_Policy", + "description": "Configures a Per Flow Request Access Policy", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "apm" + ] + }, + "properties": { + "class": { + "type": "string", + "const": "Per_Request_Access_Policy" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "url": { + "title": "URL", + "description": "The URL to pull the policy from", + "allOf": [ + { + "$ref": "#/definitions/Resource_URL" + } + ] + }, + "ignoreChanges": { + "title": "Ignore changes", + "description": "If false (default), the system updates the profile in every BIG-IP AS3 declaration deployment. If true, BIG-IP AS3 creates the profile on first deployment, and leaves it untouched afterwards", + "type": "boolean", + "default": false + } + }, + "required": [ + "class", + "url" + ], + "additionalProperties": false + }, + "ICAP_Profile": { + "title": "ICAP_Profile", + "description": "Configures an ICAP profile", + "type": "object", + "properties": { + "class": { + "type": "string", + "const": "ICAP_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "uri": { + "description": "Specifies the absolute URI that contains both the complete hostname and the path of the resource to use in the ICAP header. Macro expansion is supported for all attribute values in the ICAP header (e.g. icap://${SERVER_IP}:${SERVER_PORT}/videoOptimization)", + "type": "string" + }, + "fromHeader": { + "description": "Specifies the 'From' attribute to use in the ICAP header", + "type": "string" + }, + "hostHeader": { + "description": "Specifies the 'Host' attribute to use in the ICAP header", + "type": "string" + }, + "refererHeader": { + "description": "Specifies the 'Referer' attribute to use in the ICAP header", + "type": "string" + }, + "userAgentHeader": { + "description": "Specifies the 'User-Agent' attribute to use in the ICAP header", + "type": "string" + }, + "previewLength": { + "description": "Specifies the length of the preview in the transaction", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 0 + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "Adapt_Profile": { + "title": "Adapt_Profile", + "description": "Configures a request or response Adapt profile or both", + "type": "object", + "properties": { + "class": { + "type": "string", + "const": "Adapt_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "messageType": { + "description": "The type of Adapt profile. Use both to create a request and response profile with the same property values", + "type": "string", + "enum": [ + "response", + "request", + "request-and-response" + ] + }, + "enableHttpAdaptation": { + "description": "Enable or disable the adaptation of HTTP requests/responses. They will be forwarded to the internal service", + "type": "boolean", + "default": true + }, + "internalService": { + "description": "Specifies the name of the internal service to use for adapting the request/response", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Service" + } + ] + }, + "previewSize": { + "description": "Specifies the maximum size of the preview buffer", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 1024 + }, + "serviceDownAction": { + "description": "Specifies the action to take if the internal service doesn't exist or is down", + "type": "string", + "enum": [ + "ignore", + "reset", + "drop" + ], + "default": "ignore" + }, + "timeout": { + "description": "Specifies how long in miliseconds to wait for the internal service before a timeout error will occur", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 0 + }, + "allowHTTP10": { + "description": "Specifies whether to forward HTTP 1.0 requests/responses", + "type": "boolean", + "default": false + } + }, + "required": [ + "class", + "messageType" + ] + }, + "Cipher_Rule": { + "title": "Cipher_Rule", + "description": "Configures a cipher rule", + "type": "object", + "properties": { + "class": { + "type": "string", + "const": "Cipher_Rule" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "cipherSuites": { + "description": "Specifies the cipher suites", + "type": "array", + "items": { + "type": "string" + } + }, + "namedGroups": { + "description": "Specifies the Elliptic Curve Diffie Hellman key agreement algorithms used to negotiate SSL/TLS connections. namedGroups are only supported on BIG-IP 14.0 and later.", + "type": "array", + "items": { + "type": "string", + "enum": [ + "DEFAULT", + "P256", + "P384", + "X25519" + ] + } + }, + "signatureAlgorithms": { + "description": "Specifies the digital signature algorithms used for authentication. signatureAlgorithms are only supported on BIG-IP 14.0 and later.", + "type": "array", + "items": { + "type": "string", + "enum": [ + "DEFAULT", + "DSA-SHA1", + "DSA-SHA256", + "DSA-SHA384", + "DSA-SHA512", + "ECDSA-SHA1", + "ECDSA-SHA256", + "ECDSA-SHA384", + "ECDSA-SHA512", + "RSA-PKCS1-SHA1", + "RSA-PKCS1-SHA256", + "RSA-PKCS1-SHA384", + "RSA-PKCS1-SHA512", + "RSA-PSS-SHA256", + "RSA-PSS-SHA384", + "RSA-PSS-SHA512" + ] + } + } + }, + "required": [ + "class" + ], + "anyOf": [ + { + "required": [ + "cipherSuites" + ] + }, + { + "required": [ + "namedGroups" + ] + }, + { + "required": [ + "signatureAlgorithms" + ] + } + ], + "additionalProperties": false + }, + "Cipher_Group": { + "title": "Cipher_Group", + "description": "Configures a Cipher Group", + "type": "object", + "properties": { + "class": { + "type": "string", + "const": "Cipher_Group" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "order": { + "description": "Configure the order of the specified Cipher Rules.", + "type": "string", + "enum": [ + "default", + "speed", + "strength", + "fips", + "hardware" + ], + "default": "default" + }, + "allowCipherRules": { + "description": "Allow the following Cipher Rules.", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Cipher_Rule" + }, + "default": [ + { + "bigip": "/Common/f5-default" + } + ] + }, + "excludeCipherRules": { + "description": "Exclude the following Cipher_Rules from the Allowed list.", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Cipher_Rule" + } + }, + "requireCipherRules": { + "description": "Restrict the Allowed list to the following Cipher_Rules.", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Cipher_Rule" + } + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "iFile": { + "title": "iFile", + "description": "An iFile", + "type": "object", + "properties": { + "class": { + "type": "string", + "const": "iFile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "iFile": { + "description": "Reference to an iFile", + "allOf": [ + { + "$ref": "#/definitions/F5string" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "string" + } + } + ] + } + }, + "additionalProperties": false, + "required": [ + "class", + "iFile" + ] + }, + "Firewall_Address_List": { + "title": "Firewall_Address_List", + "description": "Declares an address-list for use by firewall rules. An address list is a list of IP-address prefixes to compare against the source-IP address and/or destination-IP address in an IP packet", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm", + "asm" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Firewall_Address_List" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "addresses": { + "type": "array", + "description": "A list of IPv4 and IPv6 addresses and address ranges. You can specify a network with CIDR slash notation.", + "items": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "object", + "properties": { + "addressDiscovery": { + "title": "Address discovery", + "description": "Selects how server (node) addresses are discovered", + "type": "string", + "enum": [ + "event", + "aws", + "gce", + "azure", + "consul" + ], + "f5serviceDiscovery": true + }, + "updateInterval": { + "title": "Update interval", + "description": "Server-discovery update interval (seconds)", + "type": "integer", + "minimum": 1, + "maximum": 3600, + "default": 60 + } + }, + "required": [ + "addressDiscovery" + ], + "allOf": [ + { + "if": { + "properties": { + "addressDiscovery": { + "const": "aws" + } + } + }, + "then": { + "$ref": "#/definitions/Service_Discovery_AWS" + } + }, + { + "if": { + "properties": { + "addressDiscovery": { + "const": "azure" + } + } + }, + "then": { + "$ref": "#/definitions/Service_Discovery_Azure" + } + }, + { + "if": { + "properties": { + "addressDiscovery": { + "const": "gce" + } + } + }, + "then": { + "$ref": "#/definitions/Service_Discovery_GCE" + } + }, + { + "if": { + "properties": { + "addressDiscovery": { + "const": "consul" + } + } + }, + "then": { + "$ref": "#/definitions/Service_Discovery_Consul" + } + } + ] + } + ] + }, + "minItems": 1 + }, + "fqdns": { + "type": "array", + "description": "A list of fully qualified domain names.", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "geo": { + "type": "array", + "description": "A list of geographic locations (for example, US:Washington).", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "addressLists": { + "type": "array", + "description": "A list of other address lists (each by BIG-IP AS3 pointer or BIG-IP pathname).", + "items": { + "$ref": "#/definitions/Pointer_Firewall_Address_List" + }, + "minItems": 1 + } + }, + "additionalProperties": false, + "required": [ + "class" + ], + "anyOf": [ + { + "required": [ + "addresses" + ] + }, + { + "required": [ + "fqdns" + ] + }, + { + "required": [ + "geo" + ] + }, + { + "required": [ + "addressLists" + ] + } + ] + }, + "Firewall_Port_List": { + "title": "Firewall_Port_List", + "description": "Declares a port-list for use by firewall rules. A firewall rule can match a packet's source port or destination port against one of the ports in a port list, and can take some action (such as ACCEPT or DROP) for a matching packet.", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Firewall_Port_List" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "ports": { + "type": "array", + "description": "A list of ports and port ranges (for example, 80, \"8080-8090\").", + "items": { + "type": [ + "integer", + "string" + ] + }, + "minItems": 1 + }, + "portLists": { + "type": "array", + "description": "A list of other port lists (each by BIG-IP AS3 pointer or BIG-IP pathname).", + "items": { + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to firewall port list declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Firewall_Port_List" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP Firewall Port List", + "description": "Pathname of existing BIG-IP firewall port list", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security firewall port-list" + ] + } + }, + "minItems": 1 + } + }, + "additionalProperties": false, + "required": [ + "class" + ], + "anyOf": [ + { + "required": [ + "ports" + ] + }, + { + "required": [ + "portLists" + ] + } + ] + }, + "Firewall_Rule_List": { + "title": "Firewall_Rule_List", + "description": "Declares a list of network firewall rules. You can reuse a rule list in multiple firewalls, such as the firewalls for self IPs, routing domains, and the global firewall.", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Firewall_Rule_List" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "rules": { + "type": "array", + "description": "A list of network firewall rules.", + "items": { + "$ref": "#/definitions/Firewall_Rule" + } + } + }, + "additionalProperties": false, + "required": [ + "class" + ] + }, + "Firewall_Rule": { + "title": "Firewall Rule", + "description": "Declares a network firewall rule.", + "type": "object", + "properties": { + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "name": { + "type": "string", + "description": "The name of the firewall rule." + }, + "action": { + "type": "string", + "description": "Specifies the action that the firewall rule will take on matching packets.", + "enum": [ + "accept", + "drop", + "accept-decisively", + "reject" + ] + }, + "protocol": { + "type": "string", + "description": "Specifies the protocol to which the firewall rule applies", + "enum": [ + "3pc", + "a/n", + "ah", + "any", + "argus", + "aris", + "ax.25", + "bbn-rcc", + "bna", + "br-sat-mon", + "cbt", + "cftp", + "chaos", + "compaq-peer", + "cphb", + "cpnx", + "crdup", + "crtp", + "dccp", + "dcn", + "ddp", + "ddx", + "dgp", + "dsr", + "egp", + "eigrp", + "emcon", + "encap", + "esp", + "etherip", + "fc", + "fire", + "ggp", + "gmtp", + "gre", + "hip", + "hmp", + "hopopt", + "i-nlsp", + "iatp", + "icmp", + "idpr", + "idpr-cmtp", + "idrp", + "ifmp", + "igmp", + "igp", + "il", + "ip", + "ipcomp", + "ipcv", + "ipip", + "iplt", + "ippc", + "ipv4", + "ipv6", + "ipv6-auth", + "ipv6-crypt", + "ipv6-frag", + "ipv6-icmp", + "ipv6-nonxt", + "ipv6-opts", + "ipv6-route", + "ipx-in-ip", + "irtp", + "isis", + "iso-ip", + "iso-tp4", + "kryptolan", + "l2tp", + "larp", + "leaf-1", + "leaf-2", + "manet", + "merit-inp", + "mfe-nsp", + "micp", + "mobile", + "mobility-header", + "mpls-in-ip", + "mtp", + "mux", + "narp", + "netblt", + "nsfnet-igp", + "nvp", + "ospf", + "pgm", + "pim", + "pipe", + "pnni", + "prm", + "ptp", + "pup", + "pvp", + "qnx", + "rdp", + "rohc", + "rsvp", + "rsvp-e2e-ignore", + "rvd", + "sat-expak", + "sat-mon", + "scc-sp", + "scps", + "sctp", + "sdrp", + "secure-vmtp", + "shim6", + "skip", + "sm", + "smp", + "snp", + "sprite-rpc", + "sps", + "srp", + "sscopmce", + "st", + "stp", + "sun-nd", + "swipe", + "tcf", + "tcp", + "tlsp", + "tp++", + "trunk-1", + "trunk-2", + "ttp", + "udp", + "udplite", + "uti", + "vines", + "visa", + "vmtp", + "vrrp", + "wb-expak", + "wb-mon", + "wesp", + "wsn", + "xnet", + "xns-idp", + "xtp" + ], + "default": "any" + }, + "source": { + "$ref": "#/definitions/Firewall_Rule_Source" + }, + "destination": { + "$ref": "#/definitions/Firewall_Rule_Destination" + }, + "loggingEnabled": { + "type": "boolean", + "description": "Specifies whether the system enables or disables logging for the firewall rule.", + "default": false + }, + "iRule": { + "type": "object", + "description": "Specifies the name of the iRule (by BIG-IP AS3 pointer or BIG-IP pathname) that the system will trigger when a packet matches the firewall rule.", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to iRule declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "iRule" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP iRule", + "description": "Pathname of existing BIG-IP iRule", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm rule" + ] + } + }, + "iRuleSampleRate": { + "type": "integer", + "description": "Specifies the rate at which the system will trigger the specified iRule when a packet matches this firewall rule. The default value is 1 and causes the system to trigger the iRule for every packet that matches. A value of 0 disables iRule triggering." + } + }, + "additionalProperties": false, + "dependencies": { + "iRuleSampleRate": [ + "iRule" + ] + }, + "required": [ + "name", + "action" + ] + }, + "Firewall_Rule_Source": { + "title": "Firewall Rule Source", + "description": "Declares the packet sources to which the network firewall rule applies.", + "type": "object", + "properties": { + "addressLists": { + "type": "array", + "description": "A list of address lists (each by BIG-IP AS3 pointer or BIG-IP pathname).", + "items": { + "$ref": "#/definitions/Pointer_Firewall_Address_List" + } + }, + "portLists": { + "type": "array", + "description": "A list of port lists (each by BIG-IP AS3 pointer or BIG-IP pathname).", + "items": { + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to firewall port list declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Firewall_Port_List" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP Firewall Port List", + "description": "Pathname of existing BIG-IP firewall port list", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security firewall port-list" + ] + } + } + }, + "vlans": { + "type": "array", + "description": "A list of VLANs by BIG-IP pathname", + "items": { + "bigip": { + "title": "BIG-IP VLAN", + "description": "Pathname of existing BIG-IP VLAN", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query net vlan" + ] + } + } + }, + "additionalProperties": false + }, + "Firewall_Rule_Destination": { + "title": "Firewall Rule Destination", + "description": "Declares the packet destinations to which the network firewall rule applies.", + "type": "object", + "properties": { + "addressLists": { + "type": "array", + "description": "A list of address lists (each by BIG-IP AS3 pointer or BIG-IP pathname).", + "items": { + "$ref": "#/definitions/Pointer_Firewall_Address_List" + } + }, + "portLists": { + "type": "array", + "description": "A list of port lists (each by BIG-IP AS3 pointer or BIG-IP pathname).", + "items": { + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to firewall port list declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Firewall_Port_List" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP Firewall Port List", + "description": "Pathname of existing BIG-IP firewall port list", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security firewall port-list" + ] + } + } + } + }, + "additionalProperties": false + }, + "Firewall_Policy": { + "title": "Firewall_Policy", + "description": "Configures firewall policy", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Firewall_Policy" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "rules": { + "description": "A list of firewall policy rules", + "type": "array", + "items": { + "if": { + "oneOf": [ + { + "required": [ + "use" + ] + }, + { + "required": [ + "bigip" + ] + } + ] + }, + "then": { + "$ref": "#/definitions/Pointer_Firewall_Rule_List" + }, + "else": { + "$ref": "#/definitions/Firewall_Rule" + } + } + } + }, + "additionalProperties": false, + "required": [ + "class", + "rules" + ] + }, + "NAT_Policy": { + "title": "NAT_Policy", + "description": "Configures network address translation policy", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "NAT_Policy" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "rules": { + "description": "A list of NAT rules", + "type": "array", + "items": { + "$ref": "#/definitions/NAT_Rule" + } + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "NAT_Rule": { + "description": "Network address translation rule", + "type": "object", + "properties": { + "name": { + "description": "NAT rule name", + "type": "string" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "source": { + "$ref": "#/definitions/NAT_Rule_Source" + }, + "destination": { + "$ref": "#/definitions/NAT_Rule_Destination" + }, + "protocol": { + "description": "Specifies the IP protocol against which the packet will be compared", + "type": "string", + "enum": [ + "any", + "tcp", + "udp" + ], + "default": "any" + }, + "sourceTranslation": { + "allOf": [ + { + "$ref": "#/definitions/Pointer_NAT_Source_Translation" + } + ] + }, + "securityLogProfile": { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Security_Log_Profile" + } + ] + } + }, + "required": [ + "name" + ], + "additionalProperties": false + }, + "NAT_Rule_Destination": { + "description": "Network address translation destination configuration", + "type": "object", + "properties": { + "addressLists": { + "description": "A list of address lists (each by BIG-IP AS3 pointer or BIG-IP pathname)", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Firewall_Address_List" + } + }, + "portLists": { + "description": "A list of port lists (each by BIG-IP AS3 pointer or BIG-IP pathname)", + "type": "array", + "items": { + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to firewall port list declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Firewall_Port_List" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP Firewall Port List", + "description": "Pathname of existing BIG-IP firewall port list", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security firewall port-list" + ] + } + } + } + }, + "required": [], + "additionalProperties": false + }, + "NAT_Rule_Source": { + "description": "Network address translation source configuration", + "type": "object", + "properties": { + "addressLists": { + "description": "A list of address lists (each by BIG-IP AS3 pointer or BIG-IP pathname)", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Firewall_Address_List" + } + }, + "portLists": { + "description": "A list of port lists (each by BIG-IP AS3 pointer or BIG-IP pathname)", + "type": "array", + "items": { + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to firewall port list declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Firewall_Port_List" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP Firewall Port List", + "description": "Pathname of existing BIG-IP firewall port list", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security firewall port-list" + ] + } + } + } + }, + "required": [], + "additionalProperties": false + }, + "NAT_Source_Translation": { + "title": "NAT_Source_Translation", + "description": "Configures a Security network address translation source translation object", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "NAT_Source_Translation" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "addresses": { + "description": "Specifies addresses on which source translation is performed", + "type": "array", + "items": { + "type": "string" + } + }, + "allowEgressInterfaces": { + "description": "Specifies the egress interfaces (tunnels and VLANs) on which source translation is allowed", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Tunnel" + } + }, + "clientConnectionLimit": { + "description": "Maximum number of simultaneous translated connections a client or subscriber is allowed to have", + "type": "integer", + "minimum": 0, + "maximum": 2147483647 + }, + "disallowEgressInterfaces": { + "description": "Specifies the egress interfaces (tunnels and VLANs) on which source translation is not allowed", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Tunnel" + } + }, + "hairpinModeEnabled": { + "type": "boolean", + "description": "Enables or disables hairpinning for incoming connections to active translation end-points" + }, + "inboundMode": { + "description": "Specifies the persistence settings for NAT translation entries", + "type": "string", + "enum": [ + "endpoint-independent-filtering", + "explicit", + "none" + ] + }, + "mapping": { + "$ref": "#/definitions/NAT_Source_Translation_Mapping" + }, + "patMode": { + "description": "Specifies whether the translation address mapping is performed in Network Address Port Translation mode, Deterministic mode, or in Port Block Allocation mode", + "type": "string", + "enum": [ + "napt", + "deterministic", + "pba" + ] + }, + "portBlockAllocation": { + "$ref": "#/definitions/NAT_Source_Translation_PortBlockAllocation" + }, + "ports": { + "description": "Specifies source ports and port ranges on which source translation is performed", + "type": "array", + "items": { + "type": [ + "integer", + "string" + ], + "minimum": 0, + "maximum": 65535 + } + }, + "routeAdvertisement": { + "type": "boolean", + "description": "Specifies that the traffic is advertised to dynamic routing protocols configured in the route domain", + "default": false + }, + "type": { + "description": "Specifies the type of source translation item", + "type": "string", + "enum": [ + "dynamic-pat", + "static-nat", + "static-pat" + ] + }, + "excludeAddresses": { + "description": "Specifies the set of addresses excluded from translation IP addresses available in the pool. This property is available on BIGIP 14.1 and above.", + "type": "array", + "items": { + "oneOf": [ + { + "type": "string" + }, + { + "$ref": "#/definitions/Pointer_Firewall_Address_List" + } + ] + } + } + }, + "dependencies": { + "clientConnectionLimit": { + "properties": { + "type": { + "const": "dynamic-pat" + } + } + }, + "hairpinModeEnabled": { + "properties": { + "type": { + "const": "dynamic-pat" + } + } + }, + "inboundMode": { + "properties": { + "type": { + "const": "dynamic-pat" + } + } + }, + "mapping": { + "properties": { + "type": { + "const": "dynamic-pat" + } + } + }, + "patMode": { + "properties": { + "type": { + "const": "dynamic-pat" + } + } + }, + "portBlockAllocation": { + "properties": { + "type": { + "const": "dynamic-pat" + }, + "patMode": { + "const": "pba" + } + } + }, + "ports": { + "properties": { + "type": { + "enum": [ + "static-pat", + "dynamic-pat" + ] + } + } + } + }, + "if": { + "properties": { + "allowEgressInterfaces": {} + }, + "required": [ + "allowEgressInterfaces" + ] + }, + "then": { + "not": { + "properties": { + "disallowEgressInterfaces": {} + }, + "required": [ + "disallowEgressInterfaces" + ] + } + }, + "required": [ + "type" + ], + "additionalProperties": false + }, + "NAT_Source_Translation_Mapping": { + "description": "Configure the mapping settings for translation entries. It is the preservation of a public-side IP address for a client from session to session. Only available if type is dynamic-pat.", + "type": "object", + "properties": { + "mode": { + "description": "Specifies the mapping mode for translation entries", + "type": "string", + "enum": [ + "address-pooling-paired", + "endpoint-independent-mapping", + "none" + ], + "default": "address-pooling-paired" + }, + "timeout": { + "description": "Specifies the timeout (in seconds) for address and port mapping", + "type": "integer", + "minimum": 0, + "maximum": 2147483647, + "default": 300 + } + }, + "required": [], + "additionalProperties": false + }, + "NAT_Source_Translation_PortBlockAllocation": { + "description": "Configure the port block allocation", + "type": "object", + "properties": { + "blockIdleTimeout": { + "description": "Specifies the amount of time in seconds that an assigned block of ports remains available when idle before it times out", + "type": "integer", + "minimum": 0, + "maximum": 2147483647, + "default": 3600 + }, + "blockLifetime": { + "description": "Specifies the lifetime in seconds of a block of ports", + "type": "integer", + "minimum": 0, + "maximum": 2147483647, + "default": 0 + }, + "blockSize": { + "description": "Specifies the number of ports per block. Each block is assigned to one client. A client can use all ports in a block multiplied by the number of blocks, up to the connection limit, if one is set", + "type": "integer", + "minimum": 0, + "maximum": 2147483647, + "default": 64 + }, + "clientBlockLimit": { + "description": "Specifies the number of blocks that can be assigned to a client", + "type": "integer", + "minimum": 0, + "maximum": 2147483647, + "default": 1 + }, + "zombieTimeout": { + "description": "Specifies the timeout duration for a zombie port block, which is a timed out port block with one or more active connections", + "type": "integer", + "minimum": 0, + "maximum": 2147483647, + "default": 0 + } + }, + "required": [], + "additionalProperties": false + }, + "Protocol_Inspection_Profile": { + "title": "Protocol_Inspection_Profile", + "description": "Protocol Inspection Profile used for configurable BIG-IP AFM intrusion prevention", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Protocol_Inspection_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "collectAVRStats": { + "description": "If true, AVR will collect data from the intrusion prevention profile", + "type": "boolean", + "default": true + }, + "enableComplianceChecks": { + "description": "Specifies whether the compliance checks will be enabled for this profile", + "type": "boolean", + "default": true + }, + "enableSignatureChecks": { + "description": "Specifies whether the signature checks will be enabled for this profile", + "type": "boolean", + "default": true + }, + "autoAddNewInspections": { + "description": "Specifies whether new inspections delivered via IPS IM package will be automatically added to this profile", + "type": "boolean", + "default": false + }, + "autoPublish": { + "description": "Specifies whether the inspections will be automatically updated to the suggested action after the staging period", + "type": "boolean", + "default": false + }, + "defaultFromProfile": { + "description": "Specifies the parent profile. If specified, the new profile will be cloned from the parent", + "type": "string" + }, + "services": { + "description": "Specifies the services and service checks for this profile", + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "description": "The name of the service type", + "type": "string", + "enum": [ + "boxp", + "coap", + "dhcp", + "diameter", + "dns", + "ftp", + "gtp", + "http", + "imap", + "ipsec", + "irc", + "mqtt", + "mysql", + "netbios_ns", + "netbios_ssn", + "nntp", + "oracle", + "other", + "pfcp", + "pop3", + "radius", + "rdp", + "rmi", + "rsh", + "sip", + "smtp", + "snmp", + "ssh", + "ssl", + "sunrpc", + "telnet", + "tftp", + "thrift", + "wins" + ] + }, + "compliance": { + "description": "A list of compliance checks to attach to the Protocol Inspection Profile", + "type": "array", + "items": { + "$ref": "#/definitions/Protocol_Inspection_Profile_Service_Compliance_Check" + } + }, + "signature": { + "description": "A list of signature checks to attach to the Protocol Inspection Profile", + "type": "array", + "items": { + "$ref": "#/definitions/Protocol_Inspection_Profile_Service_Signature_Check" + } + }, + "ports": { + "description": "List of ports to attach to the service.", + "type": "array", + "items": { + "type": "integer", + "minimum": 0, + "maximum": 65535 + } + } + }, + "allOf": [ + { + "if": { + "properties": { + "type": { + "const": "dhcp" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 67, + 68 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "dns" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 53 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "gtp" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 2123, + 2152, + 3386 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "imap" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 143, + 993 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "mqtt" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 1883 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "netbios_ns" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 137 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "nntp" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 119 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "pop3" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 110 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "sip" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 5060, + 5061 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "snmp" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 161, + 162 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "ssl" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 443 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "telnet" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 23 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "wins" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 42 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "diameter" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 3868 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "ftp" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 20, + 21 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "http" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 80, + 8080 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "irc" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 6663, + 6667, + 6668, + 7000 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "mysql" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 3306 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "netbios_ssn" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 139, + 445 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "radius" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 1645, + 1646, + 1812, + 1813 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "smtp" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 25 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "ssh" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 22 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "sunrpc" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 111 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "tftp" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 69 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "coap" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 5683 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "oracle" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 1521 + ] + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "pfcp" + } + } + }, + "then": { + "properties": { + "ports": { + "default": [ + 8805 + ] + } + } + } + } + ], + "required": [ + "type" + ], + "additionalProperties": false + } + } + }, + "additionalProperties": false + }, + "Protocol_Inspection_Profile_Service_Compliance_Check": { + "title": "Protocol Inspection Profile Service Compliance Check", + "description": "Defines a compliance check to attach to the Protocol Inspection Profile", + "type": "object", + "properties": { + "check": { + "type": "string", + "description": "The name of the check" + }, + "action": { + "type": "string", + "enum": [ + "accept", + "drop", + "reject" + ], + "description": "Which action to perform on traffic matching the check", + "default": "accept" + }, + "log": { + "type": "boolean", + "description": "Specifies whether to log the check", + "default": true + }, + "value": { + "type": "string", + "description": "Value to use for the check. If a check accepts enumerable values, these should be delimited by spaces." + } + }, + "required": [ + "check" + ], + "additionalProperties": false + }, + "Protocol_Inspection_Profile_Service_Signature_Check": { + "type": "object", + "title": "Protocol Inspection Profile Service Signature Check", + "description": "Defines a signature check to attach to the Protocol Inspection Profile", + "properties": { + "check": { + "type": "string", + "description": "The name of the check" + }, + "action": { + "type": "string", + "enum": [ + "accept", + "drop", + "reject" + ], + "description": "Which action to perform on traffic matching the check", + "default": "accept" + }, + "log": { + "type": "boolean", + "description": "Specifies whether to log the check", + "default": true + } + }, + "required": [ + "check" + ], + "additionalProperties": false + }, + "SSH_Proxy_Profile": { + "title": "SSH_Proxy_Profile", + "description": "SSH Profile used for SSH security", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "SSH_Proxy_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "sshProfileAuthInfo": { + "description": "Specifies the authentication info of public and private keys for this profile", + "type": "array", + "items": { + "$ref": "#/definitions/SSH_Proxy_Profile_Auth_Info_Collection" + } + }, + "sshProfileDefaultActions": { + "description": "Specifies the default action values", + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Default_Action_Collection" + } + ], + "default": {} + }, + "sshProfileRuleSet": { + "description": "The profile's collection of rules, each rule holds a set of actions", + "type": "array", + "items": { + "$ref": "#/definitions/SSH_Proxy_Profile_Rule_Collection" + } + }, + "timeout": { + "description": "User defined timeout value", + "type": "integer", + "default": 0 + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "SSH_Proxy_Profile_Auth_Info_Collection": { + "description": "A collection of authentication info of public and private keys", + "type": "object", + "properties": { + "name": { + "description": "The name of this set of Authorized Info", + "type": "string" + }, + "proxyServerAuth": { + "$ref": "#/definitions/SSH_Proxy_Profile_Proxy_Auth_Info" + }, + "proxyClientAuth": { + "$ref": "#/definitions/SSH_Proxy_Profile_Proxy_Auth_Info" + }, + "realServerAuth": { + "$ref": "#/definitions/SSH_Proxy_Profile_Real_Server_Auth_Info" + } + }, + "additionalProperties": false + }, + "SSH_Proxy_Profile_Proxy_Auth_Info": { + "description": "The keys used to authenticate ssh connections between the big-ip and external sources", + "type": "object", + "properties": { + "privateKey": { + "description": "The private key of the authentication algorithm (rsa, dss, etc...)", + "type": "object", + "properties": { + "allowReuse": { + "description": "If true, other declaration objects may reuse this value", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Secret" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "object" + } + }, + { + "f5PostProcess": { + "tag": "secret" + } + } + ] + }, + "publicKey": { + "description": "The public key of the authentication algorithm (rsa, dss, etc...)", + "type": "string" + } + }, + "additionalProperties": false + }, + "SSH_Proxy_Profile_Real_Server_Auth_Info": { + "description": "Public key that can be used to authenticate real host server to the proxy", + "type": "object", + "properties": { + "publicKey": { + "description": "The public key of the authentication algorithm (rsa, dss, etc...)", + "type": "string" + } + }, + "additionalProperties": false + }, + "SSH_Proxy_Profile_Default_Action_Collection": { + "description": "A collection of actions for the SSH Profile", + "type": "object", + "properties": { + "name": { + "description": "The name of this set of actions", + "type": "string" + }, + "agentAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Default_Action" + } + ], + "default": {} + }, + "localForwardAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Default_Action" + } + ], + "default": {} + }, + "otherAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Default_Action" + } + ], + "default": {} + }, + "remoteForwardAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Default_Action" + } + ], + "default": {} + }, + "rexecAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Default_Action" + } + ], + "default": {} + }, + "scpUpAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Default_Action" + } + ], + "default": {} + }, + "scpDownAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Default_Action" + } + ], + "default": {} + }, + "sftpUpAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Default_Action" + } + ], + "default": {} + }, + "sftpDownAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Default_Action" + } + ], + "default": {} + }, + "shellAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Default_Action" + } + ], + "default": {} + }, + "subSystemAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Default_Action" + } + ], + "default": {} + }, + "x11ForwardAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Default_Action" + } + ], + "default": {} + } + }, + "additionalProperties": false + }, + "SSH_Proxy_Profile_Default_Action": { + "description": "The action an SSH Profile will take. The default value is 'allow'.", + "type": "object", + "properties": { + "control": { + "description": "Indicates the specific action to take", + "type": "string", + "enum": [ + "allow", + "disallow", + "terminate", + "unspecified" + ], + "default": "allow" + }, + "log": { + "description": "Indicates if a log will be created when the action is taken. The default value is false.", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + }, + "SSH_Proxy_Profile_Rule_Collection": { + "description": "User defined rule", + "type": "object", + "properties": { + "name": { + "description": "The name of this set of rules", + "type": "string" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "sshProfileIdUsers": { + "description": "Specifies the rule users identity", + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "sshProfileIdGroups": { + "description": "Specifies the rule groups identity", + "type": "array", + "items": { + "type": "string" + } + }, + "sshProfileRuleActions": { + "description": "The sets of actions in the rule", + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Rule_Action_Collection" + } + ], + "default": {} + } + }, + "anyOf": [ + { + "required": [ + "sshProfileIdUsers" + ] + }, + { + "required": [ + "sshProfileIdGroups" + ] + } + ], + "required": [ + "name" + ], + "additionalProperties": false + }, + "SSH_Proxy_Profile_Rule_Action_Collection": { + "description": "A collection of actions for the SSH Profile", + "type": "object", + "properties": { + "name": { + "description": "The name of this set of actions", + "type": "string" + }, + "agentAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Rule_Action" + } + ], + "default": {} + }, + "localForwardAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Rule_Action" + } + ], + "default": {} + }, + "otherAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Rule_Action" + } + ], + "default": {} + }, + "remoteForwardAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Rule_Action" + } + ], + "default": {} + }, + "rexecAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Rule_Action" + } + ], + "default": {} + }, + "scpUpAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Rule_Action" + } + ], + "default": {} + }, + "scpDownAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Rule_Action" + } + ], + "default": {} + }, + "sftpUpAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Rule_Action" + } + ], + "default": {} + }, + "sftpDownAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Rule_Action" + } + ], + "default": {} + }, + "shellAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Rule_Action" + } + ], + "default": {} + }, + "subSystemAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Rule_Action" + } + ], + "default": {} + }, + "x11ForwardAction": { + "allOf": [ + { + "$ref": "#/definitions/SSH_Proxy_Profile_Rule_Action" + } + ], + "default": {} + } + }, + "additionalProperties": false + }, + "SSH_Proxy_Profile_Rule_Action": { + "description": "The action an SSH Profile Rule will take. The default value is 'unspecified'.", + "type": "object", + "properties": { + "control": { + "description": "Indicates the specific action to take", + "type": "string", + "enum": [ + "allow", + "disallow", + "terminate", + "unspecified" + ], + "default": "unspecified" + }, + "log": { + "description": "Indicates if a log will be created when the action is taken. The default value is false.", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + }, + "Data_Group": { + "title": "Data_Group", + "description": "Configures a data group object which contains list of data", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Data_Group" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "storageType": { + "title": "Storage Type", + "description": "Toggles whether the data group is internal or external", + "type": "string", + "enum": [ + "internal", + "external" + ], + "default": "internal" + }, + "keyDataType": { + "title": "Data Type", + "description": "Specifies the type of record keys the data group contains. If string, the value will be escaped by default", + "type": "string", + "enum": [ + "integer", + "ip", + "string" + ] + } + }, + "if": { + "properties": { + "storageType": { + "const": "internal" + } + } + }, + "then": { + "allOf": [ + { + "if": { + "properties": { + "keyDataType": { + "const": "string" + } + } + }, + "then": { + "$ref": "#/definitions/Data_Group_Records_String" + } + }, + { + "if": { + "properties": { + "keyDataType": { + "const": "integer" + } + } + }, + "then": { + "$ref": "#/definitions/Data_Group_Records_Integer" + } + }, + { + "if": { + "properties": { + "keyDataType": { + "const": "ip" + } + } + }, + "then": { + "$ref": "#/definitions/Data_Group_Records_IP" + } + } + ], + "required": [ + "class", + "keyDataType", + "records" + ] + }, + "else": { + "properties": { + "externalFilePath": { + "title": "External File Path", + "description": "Specifies the location (URI) from where the records will be copied", + "allOf": [ + { + "$ref": "#/definitions/Resource_URL" + }, + { + "f5PostProcess": { + "tag": "checkResource" + } + } + ] + }, + "separator": { + "title": "Record Key Value Separator", + "description": "Specifies the character(s) that separate the record key and value", + "type": "string", + "default": ":=" + }, + "ignoreChanges": { + "title": "Ignore changes", + "description": "If false (default), the system updates data group in every BIG-IP AS3 declaration deployment. If true, BIG-IP AS3 creates the data group on first deployment, and leaves it untouched afterwards", + "type": "boolean", + "default": false + }, + "dataGroupFile": { + "$ref": "#/definitions/Pointer_Data_Group_File" + } + }, + "oneOf": [ + { + "required": [ + "class", + "keyDataType", + "externalFilePath" + ] + }, + { + "required": [ + "class", + "keyDataType", + "dataGroupFile" + ] + } + ], + "not": { + "required": [ + "externalFilePath", + "dataGroupFile" + ] + } + } + }, + "Data_Group_Records_Base": { + "title": "Data Group - Records", + "description": "Configures data group records to store", + "type": "object", + "properties": { + "records": { + "title": "Records", + "description": "List of records", + "type": "array", + "items": { + "type": "object", + "description": "A record object to store", + "properties": { + "value": { + "title": "Record value", + "description": "Value to store", + "type": "string" + } + } + } + } + } + }, + "Data_Group_Records_String": { + "description": "A specialization of Data_Group_Records_Base where all items in the records property must be strings.", + "allOf": [ + { + "$ref": "#/definitions/Data_Group_Records_Base" + }, + { + "properties": { + "records": { + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "title": "Record Key", + "description": "Record Identifier", + "type": "string" + } + }, + "required": [ + "key" + ] + } + } + } + } + ] + }, + "Data_Group_Records_Integer": { + "description": "A specialization of Data_Group_Records_Base where all items in the records property must be integers.", + "allOf": [ + { + "$ref": "#/definitions/Data_Group_Records_Base" + }, + { + "properties": { + "records": { + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "title": "Record Key", + "description": "Record Identifier", + "type": "integer" + } + }, + "required": [ + "key" + ] + } + } + } + } + ] + }, + "Data_Group_Records_IP": { + "description": "A specialization of Data_Group_Records_Base where all items in the records property must be IP addresses.", + "allOf": [ + { + "$ref": "#/definitions/Data_Group_Records_Base" + }, + { + "properties": { + "records": { + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "title": "Record Key", + "description": "Record Identifier - string can be ip address or ip address with netmask (if not provided, default is /32)", + "type": "string", + "format": "f5ip" + } + }, + "required": [ + "key" + ] + } + } + } + } + ] + }, + "DNS_Cache": { + "title": "DNS_Cache", + "description": "Configures a DNS cache", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "DNS_Cache" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "type": { + "description": "Type of DNS cache", + "type": "string", + "enum": [ + "transparent", + "resolver", + "validating-resolver" + ] + } + }, + "allOf": [ + { + "if": { + "properties": { + "type": { + "const": "transparent" + } + } + }, + "then": { + "$ref": "#/definitions/DNS_Cache_Transparent" + } + }, + { + "if": { + "properties": { + "type": { + "const": "resolver" + } + } + }, + "then": { + "$ref": "#/definitions/DNS_Cache_Resolver" + } + }, + { + "if": { + "properties": { + "type": { + "const": "validating-resolver" + } + } + }, + "then": { + "$ref": "#/definitions/DNS_Cache_Validating_Resolver" + } + } + ], + "required": [ + "class", + "type" + ] + }, + "DNS_Cache_Transparent": { + "description": "Properties for a DNS transparent cache", + "type": "object", + "properties": { + "answerDefaultZones": { + "description": "Specifies whether the system answers DNS queries for the default zones localhost, reverse 127.0.0.1 and ::1, and AS112", + "type": "boolean", + "default": false + }, + "localZones": { + "description": "Configures resource records that a DNS cache uses to resolve matching DNS queries with authoritative DNS responses", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/DNS_Zone_Local" + } + }, + "messageCacheSize": { + "description": "Specifies the maximum size of the message cache in bytes", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 1048576 + }, + "recordCacheSize": { + "description": "Specifies the maximum size of the resource record (RR) cache in bytes", + "type": "integer", + "minimum": 1, + "maximum": 4294967295, + "default": 10485760 + }, + "recordRotationMethod": { + "description": "Specifies the resource record rotation method used within cached responses", + "type": "string", + "enum": [ + "none", + "query-id" + ], + "default": "none" + } + } + }, + "DNS_Profile": { + "title": "DNS_Profile", + "description": "Configures a Domain Name System (DNS) profile", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "DNS_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "parentProfile": { + "description": "Specifies the name of the object to inherit the settings from", + "allOf": [ + { + "$ref": "#/definitions/Pointer_DNS_Profile" + } + ], + "default": { + "bigip": "/Common/dns" + } + }, + "rapidResponseEnabled": { + "description": "When enabled, if the query name matches a GTM wide IP name and GTM is enabled on this profile, the DNS query will bypass Rapid Response. Note: This setting is supported only on physical BIG-IP hardware because it needs a High-Speed Bridge (HSB) to work. When using BIG-IP Virtual Edition, however, the system does not prevent you from selecting an action, even though the setting is ignored.", + "type": "boolean", + "default": false + }, + "rapidResponseLastAction": { + "description": "Specifies what action the system takes when Rapid Response Mode is enabled and the incoming DNS query does not match a DNS Express Zone", + "type": "string", + "enum": [ + "allow", + "drop", + "noerror", + "nxdomain", + "refuse", + "truncate" + ], + "default": "drop" + }, + "hardwareQueryValidationEnabled": { + "description": "On supported platforms, indicates whether the hardware will accelerate query validation", + "type": "boolean", + "default": false + }, + "hardwareResponseCacheEnabled": { + "description": "On supported platforms, indicates whether the hardware will cache responses", + "type": "boolean", + "default": false + }, + "dnssecEnabled": { + "description": "Specifies whether the system signs responses with DNSSEC keys and replies to DNSSEC specific queries (e.g., DNSKEY query type)", + "type": "boolean", + "default": true + }, + "globalServerLoadBalancingEnabled": { + "description": "Specifies whether the system uses Global Traffic Manager to manage the response", + "type": "boolean", + "default": true + }, + "dnsExpressEnabled": { + "description": "Specifies whether the DNS Express engine is enabled. The DNS Express engine receives zone transfers from the authoritative DNS server for the zone. If the Zone Transfer setting is also enabled on this profile, the DNS Express engine also responds to zone transfer requests made by the nameservers configured as zone transfer clients for the DNS Express zone. ", + "type": "boolean", + "default": true + }, + "cacheEnabled": { + "description": "Specifies whether the system caches DNS responses", + "type": "boolean", + "default": false + }, + "cache": { + "$ref": "#/definitions/Pointer_DNS_Cache" + }, + "dns64Mode": { + "description": "Specifies handling of AAAA and A DNS queries and responses", + "type": "string", + "enum": [ + "disabled", + "secondary", + "immediate", + "v4-only" + ], + "default": "disabled" + }, + "dns64Prefix": { + "description": "Specifies the prefix to use for the IPv6-formatted IP addresses that the system converts to IPv4-formatted IP addresses", + "type": "string", + "default": "0:0:0:0:0:0:0:0" + }, + "dns64AdditionalSectionRewrite": { + "description": "Select an option to allow improved network efficiency for both Unicast and Multicast DNS-SD responses", + "type": "string", + "enum": [ + "disabled", + "v6-only", + "v4-only", + "any" + ], + "default": "disabled" + }, + "unhandledQueryAction": { + "description": "Specifies whether the system uses the local BIND server on the BIG-IP system", + "type": "string", + "enum": [ + "allow", + "drop", + "hint", + "noerror", + "reject" + ], + "default": "allow" + }, + "localBindServerEnabled": { + "description": "Specifies whether the system forwards non-wide IP queries to the local BIND server on the BIG-IP system. For best performance, disable this setting when using a DNS cache.", + "type": "boolean", + "default": true + }, + "zoneTransferEnabled": { + "description": "Specifies whether the system answers zone transfer requests for a DNS zone created on the system. The DNS Express and Zone Transfer settings on a DNS profile affect how the system responds to zone transfer requests. ", + "type": "boolean", + "default": false + }, + "recursionDesiredEnabled": { + "description": "Specifies whether to process client-side DNS packets with Recursion Desired set in the header. If set to Disabled, processing of the packet is subject to the unhandled-query-action option.", + "type": "boolean", + "default": true + }, + "securityEnabled": { + "description": "Specifies whether DNS firewall capability is enabled.", + "type": "boolean", + "default": true + }, + "securityProfile": { + "$ref": "#/definitions/Pointer_DNS_Security_Profile" + }, + "loggingEnabled": { + "description": "Specifies whether to process client-side DNS packets with Recursion Desired set in the header. If set to Disabled, processing of the packet is subject to the unhandled-query-action option.", + "type": "boolean", + "default": true + }, + "loggingProfile": { + "$ref": "#/definitions/Pointer_DNS_Logging_Profile" + }, + "statisticsSampleRate": { + "description": "Sets AVR DNS statistics sampling rate. A value of 0 (zero) means that no query will be sent to the analytics database. A value of 1 means that every query will be sent. A value of n means that every nth query will be sent, and that the analytics database will count that query n times. When sampling rate is greater than one, the statistics will be inaccurate if the traffic volume is low. However, when the traffic volume is high, the system performance will benefit from sampling and the inaccuracy will be negligible. DNS statistics contain query name, query type, virtual server IP and client IP. ", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 0 + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "DNS_TSIG_Key": { + "title": "DNS_TSIG_Key", + "description": "Configures a TSIG key", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "DNS_TSIG_Key" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "algorithm": { + "description": "Specifies the algorithm the system uses to authenticate AXFR zone transfer requests as coming from an approved DNS nameserver, or to authenticate AXFR zone transfers as coming from an approved back-end DNS authoritative server. The algorithm involves a cryptographic hash function in combination with a secret, which is specified in the Secret field. The default is HMAC MD5 (the Hash-based Message Authentication Code MD5).", + "type": "string", + "enum": [ + "hmacmd5", + "hmacsha1", + "hmacsha256" + ], + "default": "hmacmd5" + }, + "secret": { + "description": "Specifies the secret used with the algorithm in the verification process. The secret must be generated by a third-party tool such as BIND's keygen utility; the BIG-IP system does not generate the TSIG key secret.", + "type": "object", + "properties": { + "allowReuse": { + "description": "If true, other declaration objects may reuse this value", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Secret" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "object" + } + }, + { + "f5PostProcess": { + "tag": "secret" + } + } + ] + } + }, + "required": [ + "class", + "secret" + ], + "additionalProperties": false + }, + "DNS_Zone": { + "title": "DNS_Zone", + "description": "Configures a DNS zone", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "DNS_Zone" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "dnsExpress": { + "$ref": "#/definitions/DNS_Zone_DNS_Express" + }, + "responsePolicyEnabled": { + "description": "Specifies if this is a response policy zone. If this is set to yes, this zone may be assigned as an RPZ to a DNS Cache", + "type": "boolean", + "default": false + }, + "serverTsigKey": { + "$ref": "#/definitions/Pointer_DNS_TSIG_Key" + }, + "transferClients": { + "description": "Specifies the DNS nameservers to which the system sends NOTIFY messages. The system allows only the DNS nameservers in the Active column to initiate AXFR zone transfers for this DNS zone.", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_DNS_Nameserver" + } + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "DNS_Zone_DNS_Express": { + "description": "Configure zone DNS Express settings", + "type": "object", + "properties": { + "enabled": { + "description": "Specifies whether DNS Express is enabled to process queries for this zone", + "type": "boolean", + "default": true + }, + "nameserver": { + "description": "Specifies the back-end authoritative DNS server from which the BIG-IP system receives AXFR zone transfers for the DNS Express zone. The options are None and user-defined nameservers.", + "allOf": [ + { + "$ref": "#/definitions/Pointer_DNS_Nameserver" + } + ] + }, + "notifyAction": { + "description": "Specifies the action the system takes when a NOTIFY message is received for this DNS Express zone. NOTIFY responses are assumed to be sent by the authoritative nameserver for the zone, except when the action is Consume, and then DNS Express generates the response. Note: If a TSIG key is configured for the zone, the signature is only validated for Consume and Repeat actions.", + "type": "string", + "enum": [ + "consume", + "bypass", + "repeat" + ], + "default": "consume" + }, + "allowNotifyFrom": { + "description": "Specifies the IP addresses from which the system accepts NOTIFY messages for this DNS Express zone", + "type": "array", + "items": { + "type": "string", + "format": "f5ip" + } + }, + "verifyNotifyTsig": { + "description": "Specifies whether the system verifies the identity of the authoritative nameserver that sends updated information for this DNS Express zone", + "type": "boolean", + "default": true + } + }, + "required": [ + "nameserver" + ], + "additionalProperties": false + }, + "DNS_Zone_Local": { + "description": "Configures resource records that a DNS cache uses to resolve matching DNS queries with authoritative DNS responses", + "type": "object", + "properties": { + "type": { + "description": "Describes how the cache handles a non-matching query for the local zone", + "type": "string", + "enum": [ + "deny", + "redirect", + "refuse", + "static", + "transparent", + "type-transparent" + ], + "default": "transparent" + }, + "records": { + "description": "A or AAAA record entry", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "DNS_Zone_Forward": { + "description": "Manage the set of Forward Zones used by DNS Cache", + "type": "object", + "properties": { + "nameservers": { + "description": "An array of nameservers and ports", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "DNS_Nameserver": { + "title": "DNS_Nameserver", + "description": "Configures a DNS nameserver", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "DNS_Nameserver" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "address": { + "description": "Specifies the IP address on which the DNS nameserver (client) or back-end DNS authoritative server (DNS Express server) listens for DNS messages", + "type": "string", + "default": "127.0.0.1", + "format": "f5ip" + }, + "port": { + "description": "Specifies the service port on which the DNS nameserver (client) or back-end DNS authoritative server (DNS Express server) listens for DNS messages", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 53 + }, + "routeDomain": { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Route_Domain" + } + ], + "default": { + "bigip": "/Common/0" + } + }, + "tsigKey": { + "$ref": "#/definitions/Pointer_DNS_TSIG_Key" + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "DNS_Cache_Resolver": { + "description": "DNS Cache with recursive resolver", + "type": "object", + "properties": { + "allowedQueryTime": { + "description": "The time allowed for a query to stay in the queue before replaced by a new query when the number of concurrent distinct queries exceeds the limit. The default value is 200 milliseconds.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 200 + }, + "answerDefaultZones": { + "description": "Specifies whether the system answers DNS queries for the default zones localhost, reverse 127.0.0.1 and ::1, and AS112", + "type": "boolean", + "default": false + }, + "localZones": { + "description": "Configures resource records that a DNS cache uses to resolve matching DNS queries with authoritative DNS responses", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/DNS_Zone_Local" + } + }, + "maxConcurrentQueries": { + "description": "Maximum number of concurrent queries used by the resolver. The default value is 1024", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 1024 + }, + "maxConcurrentTcp": { + "description": "Maximum number of concurrent TCP flows used by the resolver. The default value is 20", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 20 + }, + "maxConcurrentUdp": { + "description": "Maximum number of concurrent UDP flows used by the resolver. The default value is 8192", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 8192 + }, + "msgCacheSize": { + "description": "Number of bytes allocated for the message cache. The default value is 1m", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 1048576 + }, + "nameserverCacheCount": { + "description": "Number of DNS nameservers to cache. The default value is 16k", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 16536 + }, + "randomizeQueryNameCase": { + "description": "Enables resolver to randomize the case of query names. The default value is yes", + "type": "boolean", + "default": true + }, + "forwardZones": { + "description": "Manage the set of Forward Zones used by this DNS Cache", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/DNS_Zone_Forward" + } + }, + "rootHints": { + "description": "List of IP addresses to use for root name servers. Defaults are known Internet root servers.", + "type": "array", + "items": { + "type": "string" + } + }, + "routeDomain": { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Route_Domain" + } + ], + "default": { + "bigip": "/Common/0" + } + }, + "recordCacheSize": { + "description": "Number of bytes allocated for the resource record set cache. The default value is 10m", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 10485760 + }, + "recordRotationMethod": { + "description": "Select which resource record set rotation method should be used on cache responses", + "type": "string", + "enum": [ + "none", + "query-id" + ], + "default": "none" + }, + "unwantedQueryReplyThreshold": { + "description": "The threshold count of unsolicited query replies which triggers an alert (potential DOS attack underway). The default value is 0 (or off)", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 0 + }, + "useIpv4": { + "description": "Enables resolver to issue IPv4 queries. The default value is yes", + "type": "boolean", + "default": true + }, + "useIpv6": { + "description": "Enables resolver to issue IPv6 queries. The default value is yes", + "type": "boolean", + "default": true + }, + "useTcp": { + "description": "Enables resolver to issue tcp queries. The default value is yes", + "type": "boolean", + "default": true + }, + "useUdp": { + "description": "Enables resolver to issue udp queries. The default value is yes", + "type": "boolean", + "default": true + } + } + }, + "DNS_Cache_Validating_Resolver": { + "description": "DNS Cache with recursive resolver and DNSSEC validation", + "type": "object", + "properties": { + "allowedQueryTime": { + "description": "The time allowed for a query to stay in the queue before replaced by a new query when the number of concurrent distinct queries exceeds the limit. The default value is 200 milliseconds.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 200 + }, + "answerDefaultZones": { + "description": "Specifies whether the system answers DNS queries for the default zones localhost, reverse 127.0.0.1 and ::1, and AS112", + "type": "boolean", + "default": false + }, + "ignoreCd": { + "description": "Ignore client queries setting of checking-disabled. Perform validation anyway and only return secure answers. The default value is no", + "type": "boolean", + "default": false + }, + "keyCacheSize": { + "description": "Number of bytes allocated for the DNSKEY cache. The default value is 1m", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 1048576 + }, + "localZones": { + "description": "Configures resource records that a DNS cache uses to resolve matching DNS queries with authoritative DNS responses", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/DNS_Zone_Local" + } + }, + "maxConcurrentQueries": { + "description": "Maximum number of concurrent queries used by the resolver. The default value is 1024", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 1024 + }, + "maxConcurrentTcp": { + "description": "Maximum number of concurrent TCP flows used by the resolver. The default value is 20", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 20 + }, + "maxConcurrentUdp": { + "description": "Maximum number of concurrent UDP flows used by the resolver. The default value is 8192", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 8192 + }, + "msgCacheSize": { + "description": "Number of bytes allocated for the message cache. The default value is 1m", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 1048576 + }, + "nameserverCacheCount": { + "description": "Number of DNS nameservers to cache. The default value is 16k", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 16536 + }, + "prefetchKey": { + "description": "Fetch DNSKEY early in validation process. The default value is yes", + "type": "boolean", + "default": true + }, + "randomizeQueryNameCase": { + "description": "Enables resolver to randomize the case of query names. The default value is yes", + "type": "boolean", + "default": true + }, + "forwardZones": { + "description": "Manage the set of Forward Zones used by this DNS Cache", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/DNS_Zone_Forward" + } + }, + "rootHints": { + "description": "List of IP addresses to use for root name servers. Defaults are known Internet root servers.", + "type": "array", + "items": { + "type": "string" + } + }, + "routeDomain": { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Route_Domain" + } + ], + "default": { + "bigip": "/Common/0" + } + }, + "recordCacheSize": { + "description": "Number of bytes allocated for the resource record set cache. The default value is 10m", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 10485760 + }, + "recordRotationMethod": { + "description": "Select which resource record set rotation method should be used on cache responses", + "type": "string", + "enum": [ + "none", + "query-id" + ], + "default": "none" + }, + "trustAnchors": { + "description": "List of DNSKEY or DS resource records used to establish DNSSEC validator trust. Specified in string form (e.g. dig or drill format). The default is none", + "type": "array", + "items": { + "type": "string" + } + }, + "unwantedQueryReplyThreshold": { + "description": "The threshold count of unsolicited query replies which triggers an alert (potential DOS attack underway). The default value is 0 (or off)", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 0 + }, + "useIpv4": { + "description": "Enables resolver to issue IPv4 queries. The default value is yes", + "type": "boolean", + "default": true + }, + "useIpv6": { + "description": "Enables resolver to issue IPv6 queries. The default value is yes", + "type": "boolean", + "default": true + }, + "useTcp": { + "description": "Enables resolver to issue tcp queries. The default value is yes", + "type": "boolean", + "default": true + }, + "useUdp": { + "description": "Enables resolver to issue udp queries. The default value is yes", + "type": "boolean", + "default": true + } + } + }, + "DOS_Profile": { + "title": "DOS_Profile", + "description": "Configures a Denial of Service (DOS) profile", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm", + "asm" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "DOS_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "application": { + "description": "Application security sub-profile", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "asm" + ] + } + }, + { + "$ref": "#/definitions/DOS_Profile_Application" + } + ] + }, + "network": { + "description": "Network security sub-profile", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + } + }, + { + "$ref": "#/definitions/DOS_Profile_Network" + } + ] + }, + "protocolDNS": { + "description": "DNS protocol security sub-profile", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + } + }, + { + "$ref": "#/definitions/DOS_Profile_Protocol_DNS" + } + ] + }, + "protocolSIP": { + "description": "SIP protocol security sub-profile", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + } + }, + { + "$ref": "#/definitions/DOS_Profile_Protocol_SIP" + } + ] + }, + "allowlist": { + "description": "Specifies the default allowlist address list for the system to use to determine which IP addresses are legitimate. The system does not examine traffic from the IP addresses in the list when performing DoS prevention. This property is available on BIGIP 14.1 and above.", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Address_List" + } + ] + }, + "whitelist": { + "description": "Deprecated. Replaced with functionally equivalent allowlist. Specifies the default allowlist address list for the system to use to determine which IP addresses are legitimate. The system does not examine traffic from the IP addresses in the list when performing DoS prevention. This property is available on BIGIP 14.1 and above.", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Address_List" + } + ] + }, + "applicationAllowlist": { + "description": "Specifies the IP addresses and subnets allowlist configuration for Application Security (Overrides the global allowlist)", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "asm" + ] + } + }, + { + "$ref": "#/definitions/Pointer_Address_List" + } + ] + }, + "applicationWhitelist": { + "description": "Deprecated. Replaced with functionally equivalent applicationAllowlist. Specifies the IP addresses and subnets allowlist configuration for Application Security (Overrides the global allowlist)", + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "asm" + ] + } + }, + { + "$ref": "#/definitions/Pointer_Address_List" + } + ] + } + }, + "additionalProperties": false, + "f5aliases": { + "allowlist": "whitelist", + "applicationAllowlist": "applicationWhitelist" + } + }, + "DOS_Auto_Denylist_Settings": { + "description": "Adds the source IP address to the denylist category assigned to the Denial-of-Service (DoS) vector", + "type": "object", + "properties": { + "enabled": { + "description": "Specifies if automatic denylist management should be used", + "type": "boolean", + "default": false + }, + "category": { + "description": "Specifies the denylist category assigned to the DoS vector. The settings for this category determine IP Intelligence actions, logging settings, and denylist publisher settings.", + "default": { + "bigip": "/Common/denial_of_service" + }, + "allOf": [ + { + "$ref": "#/definitions/Pointer_Denylist_Category" + } + ] + }, + "attackDetectionTime": { + "description": "Specifies the time in seconds before a vector is denylisted", + "type": "integer", + "minimum": 1, + "maximum": 4294967295, + "default": 60 + }, + "categoryDuration": { + "description": "Specifies the time in seconds before the denylist entry is removed", + "type": "integer", + "minimum": 60, + "maximum": 4294967295, + "default": 14400 + }, + "externalAdvertisementEnabled": { + "description": "Specifies that addresses that are identified for denylisting are advertised to BGP routers, as configured per denylist category in Blacklist Publisher", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + }, + "DOS_Bad_Actor_Detection_Settings": { + "description": "Bad actor detection allows automatic detection, logging, and rate limiting of specific IP addresses that appear to be the source of an attack, based on criteria you configure.", + "type": "object", + "properties": { + "enabled": { + "description": "Specifies that Bad Actor detection is enabled", + "type": "boolean", + "default": false + }, + "sourceDetectionThreshold": { + "description": "Specifies the number of packets per second to identify an IP address as a bad actor", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 4294967295 + }, + "sourceMitigationThreshold": { + "description": "Specifies the rate limit applied to a source IP that is identified as a bad actor", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 4294967295 + } + }, + "additionalProperties": false + }, + "DOS_Profile_Application_Heavy_URL": { + "description": "Heavy URLs are a small number of site URLs that might consume considerable server resources per request. Heavy URLs respond with low latency most of the time, but may easily reach high latency under specific conditions. Heavy URLs are not necessarily heavy all the time, but are potentially heavy, especially during DoS attacks. It only takes a low rate of requests to heavy URLs in order to cause DoS attacks. When an attack is suspected, the system protects the heavy URLs using the by URL methods that you enabled in TPS-based Detection and Behavioral & Stress-based Detection. If no URL-based methods are enabled there, the system only reports attacks.", + "type": "object", + "properties": { + "automaticDetectionEnabled": { + "description": "Mark a URL as heavy if its portion of transactions with latency above the specified threshold is higher than usual for this site", + "type": "boolean", + "default": true + }, + "detectionThreshold": { + "description": "Specifies the latency threshold for automatic heavy URL detection (in milliseconds)", + "type": "integer", + "minimum": 16, + "maximum": 4294967295, + "default": 1000 + }, + "excludeList": { + "description": "URLs the system should not consider heavy even if the system automatically detects them as being heavy. This list may contain prefix wildcards.", + "type": "array", + "items": { + "type": "string" + } + }, + "protectList": { + "description": "URLs you expect to be heavy even if the system does not automatically detect them as being heavy", + "type": "array", + "items": { + "type": "object", + "properties": { + "url": { + "description": "URL to protect", + "type": "string" + }, + "threshold": { + "description": "Threshold for detection in requests per second", + "type": "integer", + "minimum": 0, + "maximum": 4294967295 + } + }, + "additionalProperties": false, + "required": [ + "url", + "threshold" + ] + } + } + }, + "additionalProperties": false + }, + "DOS_Profile_Application_Captcha": { + "description": "Specifies the text the system sends, during a suspected DoS event, to users after it challenges users with the first CAPTCHA response, and the text the system sends to users after they fail a CAPTCHA response.", + "type": "object", + "properties": { + "first": { + "description": "Specifies the content that the system displays to a user the first time the user is asked to respond to a CAPTCHA", + "type": "string", + "maxLength": 65520 + }, + "failure": { + "description": "Specifies the content the system displays to a user after the user fails to correctly answer a CAPTCHA", + "type": "string", + "maxLength": 65520 + } + }, + "additionalProperties": false + }, + "DOS_Profile_Application_Bot_Defense": { + "description": "BIG-IP AS3 provides defense against bot attacks by detecting and stopping them before the attacks start to grow, by performing the following:\n\n* The system sends a client-side JavaScript challenge to the browser.\n* If the challenge is met, the system adds a cookie to the second request. This cookie is active until the session ends, and the system does not add any more cookies to further requests during that session.\n* The system drops requests sent by browsers that do not answer the system’s initial JavaScript challenge, assuming they are bots that do not support JavaScript.\n\nNote: This feature requires browsers to allow JavaScript.\n\nImportant: The proactive bot defense feature works also in Transparent mode. This means that the system will replace responses with client side JavaScript also in Transparent mode, and if the client cannot run JavaScript, it will not be able to receive the server responses.\n\nImportant: If you enable Proactive Bot Defense and your web site uses CORS (Cross-Origin Resource Sharing), we recommend that you add the CORS URLs to the proactive bot URL allowlist.\n\nThis method is intended to complement, not replace, the other mitigation methods.", + "type": "object", + "properties": { + "mode": { + "description": "Specifies the conditions under which bots are detected and blocked", + "type": "string", + "enum": [ + "off", + "during-attacks", + "always" + ], + "default": "off" + }, + "blockSuspiscousBrowsers": { + "$comment": "maps to application.bot-defense.browser-legit-enabled", + "description": "Detect and block requests from highly suspicious browsers", + "type": "boolean", + "default": true + }, + "issueCaptchaChallenge": { + "$comment": "maps to application.bot-defense.browser-legit-captcha", + "description": "Issue CAPTCHA challenges to moderately suspicious browsers", + "type": "boolean", + "default": true + }, + "gracePeriod": { + "description": "The length of time (in seconds) before the system blocks suspected bots. The grace period allows web application pages with both HTML and non-HTML (like images, JS, and CSS) to load completely without being blocked. The grace period starts after client validation, a configuration change, or when proactive bot defense is activated as a result of a detected attack or high latency. This property is available on BIGIP 14.1 and above.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 300 + }, + "crossDomainRequests": { + "description": "Specifies how the system responds when receiving a request for non-HTML resources (images, CSS, XML, JavaScript, and Flash) without a valid cookie, and has a Referer header with a different domain than the host domain. This property is available on BIGIP 14.1 and above.", + "type": "string", + "enum": [ + "allow-all", + "validate-bulk", + "validate-upon-request" + ], + "default": "allow-all" + }, + "siteDomains": { + "description": "Specifies how the system responds when receiving a request for non-HTML resources (images, CSS, XML, JavaScript, and Flash) without a valid cookie, and has a Referer header with a different domain than the host domain. This property is available on BIGIP 14.1 and above.", + "type": "array", + "items": { + "type": "string" + } + }, + "externalDomains": { + "description": "Specifies the external referring domains (that are not part of your website) that are allowed to link to resources in your website. These domains are not protected with proactive bot defense, but the system allows them if they pass the system's redirect-cookie challenge. This property is available on BIGIP 14.1 and above.", + "type": "array", + "items": { + "type": "string" + } + }, + "urlAllowlist": { + "description": "Specifies excluded URLs. Requests to these URLs will not be blocked by Proactive Bot Defense, although they may still be blocked by the TPS-based / Stress-based attack mitigation", + "type": "array", + "items": { + "type": "string" + } + }, + "urlWhitelist": { + "description": "Deprecated. Replaced with functionally equivalent urlAllowlist. Specifies excluded URLs. Requests to these URLs will not be blocked by Proactive Bot Defense, although they may still be blocked by the TPS-based / Stress-based attack mitigation", + "type": "array", + "items": { + "type": "string" + } + } + }, + "f5aliases": { + "urlAllowlist": "urlWhitelist" + }, + "dependencies": { + "issueCaptchaChallenge": { + "if": { + "properties": { + "issueCaptchaChallenge": { + "const": true + } + } + }, + "then": { + "properties": { + "blockSuspiscousBrowsers": { + "const": true + } + } + } + }, + "siteDomains": { + "properties": { + "crossDomainRequests": { + "enum": [ + "validate-bulk", + "validate-upon-request" + ] + } + } + }, + "externalDomains": { + "properties": { + "crossDomainRequests": { + "enum": [ + "validate-bulk", + "validate-upon-request" + ] + } + } + } + }, + "additionalProperties": false + }, + "DOS_Profile_Application_Bot_Signatures": { + "description": "This feature automatically detects well known bots according to their HTTP characteristics. Malicious bots can be configured to be blocked, while benign bots can be configured to pass through the anti-bot defense mechanisms.", + "type": "object", + "properties": { + "checkingEnabled": { + "description": "Specifies the system uses signatures to check whether a bot is benign or malicious", + "type": "boolean", + "default": false + }, + "blockedCategories": { + "description": "The system blocks and reports requests that match signatures in this list of categories", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Bot_Signature_Category" + } + }, + "reportedCategories": { + "description": "The system logs requests that match signatures in this list of categories and counts them in the DoS reports", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Bot_Signature_Category" + } + }, + "disabledSignatures": { + "description": "A list of signatures the system ignores when it matches requests with configured bot signatures", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Bot_Signature" + } + } + }, + "additionalProperties": false + }, + "DOS_Profile_Application_Mobile_Defense": { + "description": "When enabled, requests from mobile applications built with the Anti-Bot Mobile SDK will be detected and handled according to the setting configured here. When disabled, these requests will be handled like any other request, meaning that they may let attacks in or cause false positives. Mobile application traffic will be treated differently than other clients, e.g. browsers, in security policies. For this reason, even when DoS protection is not required in a security policy, you still must set a DoS profile with mobile application protection enabled.", + "type": "object", + "properties": { + "enabled": { + "description": "When enabled, requests from mobile applications built with Anti-Bot Mobile SDK will be detected and handled according to the settings below. When disabled, these requests will be handled like any other request which may let attacks in, or cause false positives.", + "type": "boolean", + "default": false + }, + "allowAndroidPublishers": { + "description": "Publisher certificates to allow. All others are blocked. An empty list allows all publishers.", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_SSL_Certificate" + } + }, + "allowAndroidRootedDevice": { + "description": "Select to allow traffic from rooted Android devices", + "type": "boolean", + "default": false + }, + "allowIosPackageNames": { + "description": "Package names to allow. All others are blocked. An empty list allows all package names.", + "type": "array", + "items": { + "type": "string" + } + }, + "allowJailbrokenDevices": { + "description": "Select to allow traffic from jailbroken iOS devices", + "type": "boolean", + "default": false + }, + "allowEmulators": { + "description": "Select to allow traffic from applications run on emulators", + "type": "boolean", + "default": false + }, + "clientSideChallengeMode": { + "description": "Specifies the action to take when a CAPTCHA or Client Side Integrity challenge needs to be presented", + "type": "string", + "enum": [ + "pass", + "challenge" + ], + "default": "pass" + } + }, + "additionalProperties": false + }, + "DOS_Profile_Application_Detection_IP": { + "description": "Specifies the criteria that determines when the system treats a source IP address as an attacker", + "type": "object", + "properties": { + "minimumTps": { + "description": "The minimum number of transactions per second before a source can be considered an attacking entity. This condition and the increase rate condition must be met for a source to be considered an attacking entity.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 40 + }, + "tpsIncreaseRate": { + "description": "The transactions per second increase (as a percentage) that must occur before a source can be considered an attacking entity. This condition and the minimum TPS condition must be met for a source to be considered an attacking entity.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 500 + }, + "maximumTps": { + "description": "The maximum number of transactions per second before a source is always considered an attacking entity", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 200 + }, + "minimumAutoTps": { + "description": "Minimum number of transactions per second of an auto-calculated threshold before a source is considered an attacking entity", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 5 + }, + "maximumAutoTps": { + "description": "Maximum number of transactions per second of an auto-calculated threshold before a source is considered an attacking entity", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 5000 + }, + "clientSideDefenseEnabled": { + "description": "Specifies, when enabled, that if traffic meets the detection conditions, the system issues a client-side integrity challenge that will consume computation resources from the client and slow its attack rate. The system issues a client-side integrity challenge to determine whether the client is a legal browser or an illegal script by sending a JavaScript challenge and waiting for a response. (Legal browsers are able to respond, while illegal scripts cannot.)", + "type": "boolean", + "default": false + }, + "captchaChallengeEnabled": { + "description": "Specifies, when enabled, that if traffic meets the detection conditions, the system issues a CAPTCHA challenge to determine whether the client is a legal browser with a human user behind it, or an illegal script. (Legal browsers with human users behind them are able to respond, while illegal scripts cannot.)", + "type": "boolean", + "default": false + }, + "rateLimitingEnabled": { + "description": "Specifies, when enabled, that if traffic meets the detection conditions, the system applies rate limiting to the traffic", + "type": "boolean", + "default": true + }, + "rateLimitingMode": { + "description": "Specifies if rate limiting should block all traffic ('block-all') or apply normal rate limiting ('rate-limit').", + "type": "string", + "enum": [ + "rate-limit", + "block-all" + ], + "default": "rate-limit" + } + }, + "additionalProperties": false + }, + "DOS_Profile_Application_Detection_Device": { + "description": "Specifies the criteria that determines when the system treats a device as an attacker", + "type": "object", + "properties": { + "minimumTps": { + "description": "The minimum number of transactions per second before a source can be considered an attacking entity. This condition and the increase rate condition must be met for a source to be considered an attacking entity.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 40 + }, + "tpsIncreaseRate": { + "description": "The transactions per second increase (as a percentage) that must occur before a source can be considered an attacking entity. This condition and the minimum TPS condition must be met for a source to be considered an attacking entity.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 500 + }, + "maximumTps": { + "description": "The maximum number of transactions per second before a source is always considered an attacking entity", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 200 + }, + "minimumAutoTps": { + "description": "Minimum number of transactions per second of an auto-calculated threshold before a source is considered an attacking entity", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 5 + }, + "maximumAutoTps": { + "description": "Maximum number of transactions per second of an auto-calculated threshold before a source is considered an attacking entity", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 5000 + }, + "clientSideDefenseEnabled": { + "description": "Specifies, when enabled, that if traffic meets the detection conditions, the system issues a client-side integrity challenge that will consume computation resources from the client and slow its attack rate. The system issues a client-side integrity challenge to determine whether the client is a legal browser or an illegal script by sending a JavaScript challenge and waiting for a response. (Legal browsers are able to respond, while illegal scripts cannot.)", + "type": "boolean", + "default": false + }, + "captchaChallengeEnabled": { + "description": "Specifies, when enabled, that if traffic meets the detection conditions, the system issues a CAPTCHA challenge to determine whether the client is a legal browser with a human user behind it, or an illegal script. (Legal browsers with human users behind them are able to respond, while illegal scripts cannot.)", + "type": "boolean", + "default": false + }, + "rateLimitingEnabled": { + "description": "Specifies, when enabled, that if traffic meets the detection conditions, the system applies rate limiting to the traffic", + "type": "boolean", + "default": false + }, + "rateLimitingMode": { + "description": "Specifies if rate limiting should block all traffic ('block-all') or apply normal rate limiting ('rate-limit').", + "type": "string", + "enum": [ + "rate-limit", + "block-all" + ], + "default": "rate-limit" + } + }, + "additionalProperties": false + }, + "DOS_Profile_Application_Detection_Geolocation": { + "description": "Specifies the criteria that determines when the system treats a geolocation as an attacker", + "type": "object", + "properties": { + "minimumShare": { + "description": "The minimum share of traffic (as a percentage) before a source can be considered an attacking entity. This condition and the share increase rate condition must be met for a source to be considered an attacking entity.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 10 + }, + "shareIncreaseRate": { + "description": "The share increase (as a percentage) that must occur before a source can be considered an attacking entity. This condition and the minimum share condition must be met for a source to be considered an attacking entity.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 500 + }, + "minimumAutoTps": { + "description": "Minimum number of transactions per second of an auto-calculated threshold before a source is considered an attacking entity", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 50 + }, + "maximumAutoTps": { + "description": "Maximum number of transactions per second of an auto-calculated threshold before a source is considered an attacking entity", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 20000 + }, + "clientSideDefenseEnabled": { + "description": "Specifies, when enabled, that if traffic meets the detection conditions, the system issues a client-side integrity challenge that will consume computation resources from the client and slow its attack rate. The system issues a client-side integrity challenge to determine whether the client is a legal browser or an illegal script by sending a JavaScript challenge and waiting for a response. (Legal browsers are able to respond, while illegal scripts cannot.)", + "type": "boolean", + "default": false + }, + "captchaChallengeEnabled": { + "description": "Specifies, when enabled, that if traffic meets the detection conditions, the system issues a CAPTCHA challenge to determine whether the client is a legal browser with a human user behind it, or an illegal script. (Legal browsers with human users behind them are able to respond, while illegal scripts cannot.)", + "type": "boolean", + "default": false + }, + "rateLimitingEnabled": { + "description": "Specifies, when enabled, that if traffic meets the detection conditions, the system applies rate limiting to the traffic", + "type": "boolean", + "default": false + }, + "rateLimitingMode": { + "description": "Specifies if rate limiting should block all traffic ('block-all') or apply normal rate limiting ('rate-limit').", + "type": "string", + "enum": [ + "rate-limit", + "block-all" + ], + "default": "rate-limit" + } + }, + "additionalProperties": false + }, + "DOS_Profile_Application_Detection_URL": { + "description": "Specifies the criteria that determines when the system treats a URL as an attacker", + "type": "object", + "properties": { + "minimumTps": { + "description": "The minimum number of transactions per second before a source can be considered an attacking entity. This condition and the increase rate condition must be met for a source to be considered an attacking entity.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 200 + }, + "tpsIncreaseRate": { + "description": "The transactions per second increase (as a percentage) that must occur before a source can be considered an attacking entity. This condition and the minimum TPS condition must be met for a source to be considered an attacking entity.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 500 + }, + "maximumTps": { + "description": "The maximum number of transactions per second before a source is always considered an attacking entity", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 1000 + }, + "minimumAutoTps": { + "description": "Minimum number of transactions per second of an auto-calculated threshold before a source is considered an attacking entity", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 5 + }, + "maximumAutoTps": { + "description": "Maximum number of transactions per second of an auto-calculated threshold before a source is considered an attacking entity", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 5000 + }, + "heavyURLProtectionEnabled": { + "description": "Specifies, when enabled, that heavy URL protection should be enabled", + "type": "boolean", + "default": true + }, + "clientSideDefenseEnabled": { + "description": "Specifies, when enabled, that if traffic meets the detection conditions, the system issues a client-side integrity challenge that will consume computation resources from the client and slow its attack rate. The system issues a client-side integrity challenge to determine whether the client is a legal browser or an illegal script by sending a JavaScript challenge and waiting for a response. (Legal browsers are able to respond, while illegal scripts cannot.)", + "type": "boolean", + "default": false + }, + "captchaChallengeEnabled": { + "description": "Specifies, when enabled, that if traffic meets the detection conditions, the system issues a CAPTCHA challenge to determine whether the client is a legal browser with a human user behind it, or an illegal script. (Legal browsers with human users behind them are able to respond, while illegal scripts cannot.)", + "type": "boolean", + "default": false + }, + "rateLimitingEnabled": { + "description": "Specifies, when enabled, that if traffic meets the detection conditions, the system applies rate limiting to the traffic", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false + }, + "DOS_Profile_Application_Detection_Site": { + "description": "Specifies the criteria that determines when the system treats a site as an attacker", + "type": "object", + "properties": { + "minimumTps": { + "description": "The minimum number of transactions per second before a source can be considered an attacking entity. This condition and the increase rate condition must be met for a source to be considered an attacking entity.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 2000 + }, + "tpsIncreaseRate": { + "description": "The transactions per second increase (as a percentage) that must occur before a source can be considered an attacking entity. This condition and the minimum TPS condition must be met for a source to be considered an attacking entity.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 500 + }, + "maximumTps": { + "description": "The maximum number of transactions per second before a source is always considered an attacking entity", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 10000 + }, + "minimumAutoTps": { + "description": "Minimum number of transactions per second of an auto-calculated threshold before a source is considered an attacking entity", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 5 + }, + "maximumAutoTps": { + "description": "Maximum number of transactions per second of an auto-calculated threshold before a source is considered an attacking entity", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 20000 + }, + "clientSideDefenseEnabled": { + "description": "Specifies, when enabled, that if traffic meets the detection conditions, the system issues a client-side integrity challenge that will consume computation resources from the client and slow its attack rate. The system issues a client-side integrity challenge to determine whether the client is a legal browser or an illegal script by sending a JavaScript challenge and waiting for a response. (Legal browsers are able to respond, while illegal scripts cannot.)", + "type": "boolean", + "default": false + }, + "captchaChallengeEnabled": { + "description": "Specifies, when enabled, that if traffic meets the detection conditions, the system issues a CAPTCHA challenge to determine whether the client is a legal browser with a human user behind it, or an illegal script. (Legal browsers with human users behind them are able to respond, while illegal scripts cannot.)", + "type": "boolean", + "default": false + }, + "rateLimitingEnabled": { + "description": "Specifies, when enabled, that if traffic meets the detection conditions, the system applies rate limiting to the traffic", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + }, + "DOS_Profile_Application_Rate_Based_Detection": { + "description": "Configure the system to prevent DoS attacks based on the client side transactions per second (TPS-based detection mode). The system considers traffic to be a DoS attack based on the following calculations:\n\n* Transaction rate detection interval: The average number of requests per second sent. This is the TPS value that triggered the attack. This number is calculated by the system, by default, every ten seconds.\n* Transaction rate history interval: The average number of requests per second sent. This number is the average number of transactions for the past hour, and it is updated every 10 seconds.\n\nIn TPS-based detection mode, if the ratio of the transaction rate detection interval to the transaction rate history interval is greater than the specific percentage configured, the system detects the URL/site to be under attack, or the IP address/geolocation to be attacking. In order to stop the attack, the system blocks some, or all, requests from the detected IP address/geolocation and/to the attacked URL/site, depending on the configuration of the DoS profile.", + "type": "object", + "properties": { + "operationMode": { + "description": "Specifies how the system reacts when it detects an attack", + "type": "string", + "enum": [ + "off", + "transparent", + "blocking" + ], + "default": "off" + }, + "thresholdsMode": { + "description": "Specifies what type of thresholds to use", + "type": "string", + "enum": [ + "manual", + "automatic" + ], + "default": "manual" + }, + "escalationPeriod": { + "description": "Specifies the minimum time spent in each mitigation step before the system moves to the next mitigation step when preventing a DoS attack. After the system detects a DoS attack, it performs attack prevention for the amount of time specified here for every method that is enabled. If after this period the attack has not been fully stopped, the system escalates to the next enabled prevention step.", + "type": "integer", + "minimum": 1, + "maximum": 3600, + "default": 120 + }, + "deEscalationPeriod": { + "description": "When preventing a DoS attack, specifies the time spent since the mitigation started until retrying the steps from the beginning of the enabled methods. If the value is 0, no de-escalation occurs.", + "type": "integer", + "minimum": 0, + "maximum": 86400, + "default": 7200 + }, + "sourceIP": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Detection_IP" + } + ], + "default": {} + }, + "deviceID": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Detection_Device" + } + ], + "default": {} + }, + "geolocation": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Detection_Geolocation" + } + ], + "default": {} + }, + "url": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Detection_URL" + } + ], + "default": {} + }, + "site": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Detection_Site" + } + ], + "default": {} + } + }, + "additionalProperties": false + }, + "DOS_Profile_Application_Stress_Based_Detection_Bad_Actor": { + "description": "Specifies properties of Behavioral Detection in Stress-based anomaly.\n\nThe following mitigation options are available:\n\n* Conservative protection: If detectionEnabled is true, slows down and rate limits requests from anomalous IP addresses based on its anomaly detection confidence and the server's health. If signatureDetectionEnabled is true, blocks requests that match the attack signatures.\n* Standard protection: If detectionEnabled is true, slows down requests from anomalous IP addresses based on its anomaly detection confidence and the server's health. Rate limits requests from anomalous IP addresses and, if necessary, rate limits all requests based on the server's health. Limits the number of concurrent connections from anomalous IP addresses and, if necessary, limits the number of all concurrent connections based on the server's health. If signatureDetectionEnabled is true, blocks requests that match the attack signatures.\n* Aggressive protection: If detectionEnabled is true, slows down requests from anomalous IP addresses based on its anomaly detection confidence and the server's health. Rate limits requests from anomalous IP addresses and, if necessary, rate limits all requests based on the server's health. Limits the number of concurrent connections from anomalous IP addresses and, if necessary, limits the number of all concurrent connections based on the server's health. Proactively performs all protection actions (even before an attack). Increases the impact of the protection techniques. If signatureDetectionEnabled is true, blocks requests that match the attack signatures. Increases the impact of blocked requests.", + "type": "object", + "properties": { + "detectionEnabled": { + "description": "Enables traffic behavior, server's capacity learning, and anomaly detection", + "type": "boolean", + "default": false + }, + "signatureDetectionEnabled": { + "description": "Enables request signature detection", + "type": "boolean", + "default": false + }, + "useApprovedSignaturesOnly": { + "description": "Limits request signature detection to approved signatures only", + "type": "boolean", + "default": false + }, + "mitigationMode": { + "description": "Specifies mitigation impact on suspicious bad actors/requests", + "type": "string", + "enum": [ + "none", + "conservative", + "standard", + "aggressive" + ], + "default": "none" + }, + "acceleratedSignaturesEnabled": { + "description": "Enables signature detection before the connection establishment", + "type": "boolean", + "default": false + }, + "tlsSignaturesEnabled": { + "description": "Enables tls signature detection before the connection establishment. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + }, + "DOS_Profile_Application_Stress_Based_Detection": { + "description": "Configure the system to prevent DoS attacks based on the server’s health condition. An attack is detected if the system finds the server to be under stress and either of the TPS thresholds are crossed.", + "type": "object", + "properties": { + "operationMode": { + "description": "Specifies how the system reacts when it detects an attack", + "type": "string", + "enum": [ + "off", + "transparent", + "blocking" + ], + "default": "off" + }, + "thresholdsMode": { + "description": "Specifies what type of thresholds to use", + "type": "string", + "enum": [ + "manual", + "automatic" + ], + "default": "manual" + }, + "escalationPeriod": { + "description": "Specifies the minimum time spent in each mitigation step before the system moves to the next mitigation step when preventing a DoS attack. After the system detects a DoS attack, it performs attack prevention for the amount of time specified here for every method that is enabled. If after this period the attack has not been fully stopped, the system escalates to the next enabled prevention step.", + "type": "integer", + "minimum": 1, + "maximum": 3600, + "default": 120 + }, + "deEscalationPeriod": { + "description": "When preventing a DoS attack, specifies the time spent since the mitigation started until retrying the steps from the beginning of the enabled methods. If the value is 0, no de-escalation occurs.", + "type": "integer", + "minimum": 0, + "maximum": 86400, + "default": 7200 + }, + "sourceIP": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Detection_IP" + } + ], + "default": {} + }, + "deviceID": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Detection_Device" + } + ], + "default": {} + }, + "geolocation": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Detection_Geolocation" + } + ], + "default": {} + }, + "url": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Detection_URL" + } + ], + "default": {} + }, + "site": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Detection_Site" + } + ], + "default": {} + }, + "badActor": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Stress_Based_Detection_Bad_Actor" + } + ], + "default": {} + } + }, + "additionalProperties": false + }, + "DOS_Profile_Application_TCP_Dump": { + "description": "Configure settings to record traffic (perform a TCP dump) when a DoS attack is underway, in order to diagnose the attack vectors and attackers, observe whether and how it was mitigated, and draw conclusions for changing the DoS profile configuration.", + "type": "object", + "properties": { + "recordTrafficEnabled": { + "description": "Enables the recording of traffic during attacks", + "type": "boolean", + "default": false + }, + "maximumDuration": { + "description": "Configures the maximum time for each TCP dump recording cycle", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 30 + }, + "maximumSize": { + "description": "Configures the maximum size (in MB) for each TCP dump recording cycle", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 10 + }, + "repetitionInterval": { + "description": "Allow multiple TCP dumps to be recorded during a single DoS attack", + "oneOf": [ + { + "type": "string", + "const": "once-per-attack" + }, + { + "type": "integer", + "minimum": 0, + "maximum": 4294967295 + } + ], + "default": 120 + } + }, + "additionalProperties": false + }, + "DOS_Profile_Application": { + "description": "Specifies the conditions for determining that your application is under a DoS attack, and how the system reacts to a suspected attack.", + "type": "object", + "properties": { + "heavyURLProtection": { + "description": "Configure Heavy URL include list, automatic detection, and exclude list", + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Heavy_URL" + } + ], + "default": {} + }, + "denylistedGeolocations": { + "description": "Override the DoS profile’s geolocation rate based threshold settings by selecting countries from which to block traffic during a DoS attack", + "type": "array", + "items": { + "type": "string" + } + }, + "blacklistedGeolocations": { + "description": "Deprecated. Replaced with functionally equivalent denylistedGeolocations. Override the DoS profile’s geolocation rate based threshold settings by selecting countries from which to block traffic during a DoS attack", + "type": "array", + "items": { + "type": "string" + } + }, + "allowlistedGeolocations": { + "description": "Override the DoS profile’s geolocation rate based threshold settings by selecting countries from which to allow traffic during a DoS attack", + "type": "array", + "items": { + "type": "string" + } + }, + "whitelistedGeolocations": { + "description": "Deprecated. Replaced with functionally equivalent allowlistedGeolocations. Override the DoS profile’s geolocation rate based threshold settings by selecting countries from which to allow traffic during a DoS attack", + "type": "array", + "items": { + "type": "string" + } + }, + "captchaResponse": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Captcha" + } + ], + "default": {} + }, + "triggerIRule": { + "description": "Specifies that the system activates an Application DoS iRule event", + "type": "boolean", + "default": false + }, + "singlePageApplicationEnabled": { + "description": "Specifies that your website is a Single Page Application, meaning a web application that loads new content without triggering a full page-reload. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + }, + "scrubbingDuration": { + "description": "Specifies the BGP route advertisement duration in seconds for Traffic Scrubbing during attacks. This requires configuration of the Scrubber Profile, and will function even when the Operation Mode is set to Transparent. A value of 0 disables Traffic Scrubbing. Requires the AFM module and if this property is unspecified it will be disabled.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + } + }, + "remoteTriggeredBlackHoleDuration": { + "description": "Specifies the BGP route advertisement duration in seconds for Remote Triggered Black Hole of attacking IPs. This requires configuration of the Blacklist Publisher, and will function even when the Operation Mode is set to Transparent. A value of 0 disables Remote Triggered Black Hole. Requires the AFM module and if this property is unspecified it will be disabled.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + } + }, + "profileAcceleration": { + "description": "Select a TCP fastL4 profile to be used as a fast-path for acceleration", + "allOf": [ + { + "$ref": "#/definitions/Pointer_L4_Profile" + } + ] + }, + "botDefense": { + "description": "This feature proactively detects bots and scripts, and prevents them from accessing the site. It may be used to prevent DDoS, Web Scraping, and Brute Force attacks. Enabling this feature requires JavaScript support from the browsers.", + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Bot_Defense" + } + ], + "default": {} + }, + "botSignatures": { + "description": "This feature automatically detects well known bots according to their HTTP characteristics. Malicious bots can be configured to be blocked, while benign bots can be configured to pass through the anti-bot defense mechanisms", + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Bot_Signatures" + } + ], + "default": {} + }, + "mobileDefense": { + "description": "This feature detects mobile applications built with the Anti-Bot Mobile SDK and defines how requests from these mobile application clients are handled", + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Mobile_Defense" + } + ], + "default": {} + }, + "rateBasedDetection": { + "description": "Configures the detection of DoS attacks based on high volume of incoming traffic", + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Rate_Based_Detection" + } + ], + "default": {} + }, + "stressBasedDetection": { + "description": "Configures the detection of DoS attacks based on server stress. The system automatically detects an increase in server stress and mitigates DoS attacks causing it. ", + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_Stress_Based_Detection" + } + ], + "default": {} + }, + "recordTraffic": { + "description": "This feature allows automatic recording of traffic during DoS attacks, and storing the recordings as TCP Dump files. The files are placed in the system file path /shared/dosl7/tcpdumps.", + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Application_TCP_Dump" + } + ], + "default": {} + } + }, + "additionalProperties": false, + "f5aliases": { + "allowlistedGeolocations": "whitelistedGeolocations", + "denylistedGeolocations": "blacklistedGeolocations" + } + }, + "DOS_Profile_Network_Dynamic_Signatures": { + "description": "", + "type": "object", + "properties": { + "detectionMode": { + "description": "Select the enforcement state for dynamic signatures. To enable enforcement of dynamic DoS vectors, select enabled. When enforcement is enabled, all thresholds and threshold actions are applied. Select disabled to apply no action or thresholds to dynamic Vectors. Select learn-only to track dynamic vector statistics, without enforcing any thresholds or limits.", + "type": "string", + "enum": [ + "disabled", + "learn-only", + "enabled" + ], + "default": "disabled" + }, + "mitigationMode": { + "description": "Specify the mitigation sensitivity for dynamic signatures", + "type": "string", + "enum": [ + "none", + "low", + "medium", + "high" + ], + "default": "none" + }, + "scrubbingEnabled": { + "description": "Specify whether to enable redirection and scrubbing of IP addresses identified by dynamic vectors. This enables handling of the dynamic vector hits by an IP intelligence category.", + "type": "boolean", + "default": false + }, + "scrubbingCategory": { + "description": "Specifies the IP intelligence denylist category to which scrubbed IPs are sent", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Denylist_Category" + } + ] + }, + "scrubbingDuration": { + "description": "Specify the duration in seconds for which an IP address is added to the denylist category", + "type": "integer", + "minimum": 60, + "maximum": 4294967295, + "default": 500 + } + }, + "additionalProperties": false + }, + "DOS_Profile_Network": { + "description": "", + "type": "object", + "properties": { + "dynamicSignatures": { + "default": {}, + "allOf": [ + { + "$ref": "#/definitions/DOS_Profile_Network_Dynamic_Signatures" + } + ] + }, + "vectors": { + "description": "A list of configured network DoS vectors", + "type": "array", + "items": { + "$ref": "#/definitions/DOS_Network_Vector" + } + } + }, + "additionalProperties": false + }, + "DOS_Network_Vector": { + "description": "Network Denial-of-Service (DoS) vector", + "type": "object", + "properties": { + "type": { + "description": "Specifies the name of the DoS attack vector whose thresholds you are configuring", + "type": "string", + "enum": [ + "ext-hdr-too-large", + "hop-cnt-low", + "host-unreachable", + "icmpv4-flood", + "icmpv6-flood", + "icmp-frag", + "ip-frag-flood", + "ip-low-ttl", + "ip-opt-frames", + "ipv6-ext-hdr-frames", + "ipv6-frag-flood", + "non-tcp-connection", + "opt-present-with-illegal-len", + "sweep", + "tcp-half-open", + "tcp-opt-overruns-tcp-hdr", + "tcp-psh-flood", + "tcp-rst-flood", + "tcp-syn-flood", + "tcp-synack-flood", + "tcp-syn-oversize", + "tcp-bad-urg", + "tcp-window-size", + "tidcmp", + "too-many-ext-hdrs", + "udp-flood", + "unk-tcp-opt-type" + ] + }, + "state": { + "description": "Specifies how to enforce protection for that attack type: mitigate (watch, learn, alert, and mitigate), detect-only (watch, learn, and alert), learn-only (collect stats, no mitigation), or Disabled (no stat collection, no mitigation).", + "type": "string", + "enum": [ + "disabled", + "learn-only", + "detect-only", + "mitigate" + ], + "default": "mitigate" + }, + "thresholdMode": { + "description": "Specifies how thresholds are set for this vector", + "type": "string", + "enum": [ + "manual", + "stress-based-mitigation", + "fully-automatic" + ], + "default": "manual" + }, + "badActorSettings": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Bad_Actor_Detection_Settings" + } + ], + "default": {} + }, + "autoDenylistSettings": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Auto_Denylist_Settings" + } + ] + }, + "autoBlacklistSettings": { + "description": "Deprecated. Replaced with functionally equivalent autoDenylistSettings.", + "allOf": [ + { + "$ref": "#/definitions/DOS_Auto_Denylist_Settings" + } + ], + "default": {} + }, + "autoAttackFloor": { + "description": "Specifies packets per second to identify an attack. These settings provide an absolute minimum of packets to allow before the attack is identified. As the automatic detection thresholds adjust to traffic and CPU usage on the system over time, this attack floor becomes less relevant.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 100 + }, + "autoAttackCeiling": { + "description": "Specifies the absolute maximum allowable for packets of this type. This setting rate limits packets to the packets per second setting, when specified. To set no hard limit and allow automatic thresholds to manage all rate limiting, set this to 4294967295.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 4294967295 + }, + "rateThreshold": { + "description": "Specify how many packets per second the system must discover in traffic in order to detect this attack", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 4294967295 + }, + "rateIncreaseThreshold": { + "description": "Specify percent of rate increase the system must discover in traffic in order to detect this attack", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 500 + }, + "rateLimit": { + "description": "Specify the maximum number of this type of packet per second the system allows for a vector. The system drops packets once the traffic level exceeds the rate limit.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 4294967295 + }, + "simulateAutoThresholdEnabled": { + "description": "Specifies that results of the current automatic thresholds are logged, though manual thresholds are enforced, and no action is taken on automatic thresholds", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false, + "f5aliases": { + "autoDenylistSettings": "autoBlacklistSettings" + } + }, + "DOS_Profile_Protocol_DNS": { + "description": "", + "type": "object", + "properties": { + "vectors": { + "description": "A list of configured DNS DoS vectors", + "type": "array", + "items": { + "$ref": "#/definitions/DOS_DNS_Vector" + } + } + }, + "additionalProperties": false + }, + "DOS_DNS_Vector": { + "description": "Protocol DNS Denial-of-Service (DoS) vector", + "type": "object", + "properties": { + "type": { + "description": "Specifies the name of the DoS attack vector whose thresholds you are configuring", + "type": "string", + "enum": [ + "a", + "aaaa", + "any", + "axfr", + "cname", + "ixfr", + "mx", + "ns", + "nxdomain", + "other", + "ptr", + "qdcount", + "soa", + "srv", + "txt", + "malformed" + ] + }, + "state": { + "description": "Specifies how to enforce protection for that attack type: mitigate (watch, learn, alert, and mitigate), detect-only (watch, learn, and alert), learn-only (collect stats, no mitigation), or Disabled (no stat collection, no mitigation).", + "type": "string", + "enum": [ + "disabled", + "learn-only", + "detect-only", + "mitigate" + ], + "default": "mitigate" + }, + "thresholdMode": { + "description": "Specifies how thresholds are set for this vector", + "type": "string", + "enum": [ + "manual", + "stress-based-mitigation", + "fully-automatic" + ], + "default": "manual" + }, + "badActorSettings": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Bad_Actor_Detection_Settings" + } + ], + "default": {} + }, + "autoDenylistSettings": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Auto_Denylist_Settings" + } + ] + }, + "autoBlacklistSettings": { + "description": "Deprecated. Replaced with functionally equivalent autoDenylistSettings.", + "allOf": [ + { + "$ref": "#/definitions/DOS_Auto_Denylist_Settings" + } + ], + "default": {} + }, + "autoAttackFloor": { + "description": "Specifies packets per second to identify an attack. These settings provide an absolute minimum of packets to allow before the attack is identified. As the automatic detection thresholds adjust to traffic and CPU usage on the system over time, this attack floor becomes less relevant.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 100 + }, + "autoAttackCeiling": { + "description": "Specifies the absolute maximum allowable for packets of this type. This setting rate limits packets to the packets per second setting, when specified. To set no hard limit and allow automatic thresholds to manage all rate limiting, set this to 4294967295.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 4294967295 + }, + "rateThreshold": { + "description": "Specify how many packets per second the system must discover in traffic in order to detect this attack", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 4294967295 + }, + "rateIncreaseThreshold": { + "description": "Specify percent of rate increase the system must discover in traffic in order to detect this attack", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 500 + }, + "rateLimit": { + "description": "Specify the maximum number of this type of packet per second the system allows for a vector. The system drops packets once the traffic level exceeds the rate limit.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 4294967295 + }, + "simulateAutoThresholdEnabled": { + "description": "Specifies that results of the current automatic thresholds are logged, though manual thresholds are enforced, and no action is taken on automatic thresholds", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false, + "required": [ + "type" + ], + "f5aliases": { + "autoDenylistSettings": "autoBlacklistSettings" + } + }, + "DOS_Profile_Protocol_SIP": { + "description": "", + "type": "object", + "properties": { + "vectors": { + "description": "A list of configured SIP DoS vectors", + "type": "array", + "items": { + "$ref": "#/definitions/DOS_SIP_Vector" + } + } + }, + "additionalProperties": false + }, + "DOS_SIP_Vector": { + "description": "Protocol SIP Denial-of-Service (DoS) vector", + "type": "object", + "properties": { + "type": { + "description": "Specifies the name of the DoS attack vector whose thresholds you are configuring", + "type": "string", + "enum": [ + "ack", + "cancel", + "message", + "options", + "prack", + "register", + "bye", + "invite", + "notify", + "other", + "publish", + "subscribe", + "uri-limit", + "malformed" + ] + }, + "state": { + "description": "Specifies how to enforce protection for that attack type: mitigate (watch, learn, alert, and mitigate), detect-only (watch, learn, and alert), learn-only (collect stats, no mitigation), or Disabled (no stat collection, no mitigation).", + "type": "string", + "enum": [ + "disabled", + "learn-only", + "detect-only", + "mitigate" + ], + "default": "mitigate" + }, + "thresholdMode": { + "description": "Specifies how thresholds are set for this vector", + "type": "string", + "enum": [ + "manual", + "stress-based-mitigation", + "fully-automatic" + ], + "default": "manual" + }, + "badActorSettings": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Bad_Actor_Detection_Settings" + } + ], + "default": {} + }, + "autoDenylistSettings": { + "allOf": [ + { + "$ref": "#/definitions/DOS_Auto_Denylist_Settings" + } + ] + }, + "autoBlacklistSettings": { + "description": "Deprecated. Replaced with functionally equivalent autoDenylistSettings.", + "allOf": [ + { + "$ref": "#/definitions/DOS_Auto_Denylist_Settings" + } + ], + "default": {} + }, + "autoAttackFloor": { + "description": "Specifies packets per second to identify an attack. These settings provide an absolute minimum of packets to allow before the attack is identified. As the automatic detection thresholds adjust to traffic and CPU usage on the system over time, this attack floor becomes less relevant.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 100 + }, + "autoAttackCeiling": { + "description": "Specifies the absolute maximum allowable for packets of this type. This setting rate limits packets to the packets per second setting, when specified. To set no hard limit and allow automatic thresholds to manage all rate limiting, set this to 4294967295.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 4294967295 + }, + "rateThreshold": { + "description": "Specify how many packets per second the system must discover in traffic in order to detect this attack", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 4294967295 + }, + "rateIncreaseThreshold": { + "description": "Specify percent of rate increase the system must discover in traffic in order to detect this attack", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 500 + }, + "rateLimit": { + "description": "Specify the maximum number of this type of packet per second the system allows for a vector. The system drops packets once the traffic level exceeds the rate limit.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 4294967295 + }, + "simulateAutoThresholdEnabled": { + "description": "Specifies that results of the current automatic thresholds are logged, though manual thresholds are enforced, and no action is taken on automatic thresholds", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false, + "required": [ + "type" + ], + "f5aliases": { + "autoDenylistSettings": "autoBlacklistSettings" + } + }, + "Enum_ISP": { + "description": "Enum values for Internet Service Providers (ISP)", + "type": "string", + "enum": [ + "AOL", + "BeijingCNC", + "ChinaEducationNetwork", + "ChinaMobilNetwork", + "ChinaRailwayTelcom", + "ChinaTelecom", + "ChinaUnicom", + "CNC", + "Comcast", + "Earthlink", + "ShanghaiCNC", + "ShanghaiTelecom" + ] + }, + "Enum_Continent_Code_Alpha_2": { + "description": "Enum values for Alpha-2 continent codes based on ISO 3166. Use two dashes (--) if Unknown", + "type": "string", + "enum": [ + "--", + "AF", + "AN", + "AS", + "EU", + "NA", + "OC", + "SA" + ] + }, + "Enum_Country_Code_Alpha_2": { + "description": "Enum values for Alpha-2 country codes based on ISO 3166. Use two dashes (--) if Unknown", + "type": "string", + "enum": [ + "--", + "A1", + "A2", + "AD", + "AE", + "AF", + "AG", + "AI", + "AL", + "AM", + "AN", + "AO", + "AP", + "AQ", + "AR", + "AS", + "AT", + "AU", + "AW", + "AX", + "AZ", + "BA", + "BB", + "BD", + "BE", + "BF", + "BG", + "BH", + "BI", + "BJ", + "BL", + "BM", + "BN", + "BO", + "BQ", + "BR", + "BS", + "BT", + "BV", + "BW", + "BY", + "BZ", + "CA", + "CC", + "CD", + "CF", + "CG", + "CH", + "CI", + "CK", + "CL", + "CM", + "CN", + "CO", + "CR", + "CU", + "CV", + "CX", + "CY", + "CZ", + "DE", + "DJ", + "DK", + "DM", + "DO", + "DZ", + "EC", + "EE", + "EG", + "EH", + "ER", + "ES", + "ET", + "EU", + "FI", + "FJ", + "FK", + "FM", + "FO", + "FR", + "FX", + "GA", + "GB", + "GD", + "GE", + "GF", + "GG", + "GH", + "GI", + "GL", + "GM", + "GN", + "GP", + "GQ", + "GR", + "GS", + "GT", + "GU", + "GW", + "GY", + "HK", + "HM", + "HN", + "HR", + "HT", + "HU", + "ID", + "IE", + "IL", + "IM", + "IN", + "IO", + "IQ", + "IR", + "IS", + "IT", + "JE", + "JM", + "JO", + "JP", + "KE", + "KG", + "KH", + "KI", + "KM", + "KN", + "KP", + "KR", + "KW", + "KY", + "KZ", + "LA", + "LB", + "LC", + "LI", + "LK", + "LR", + "LS", + "LT", + "LU", + "LV", + "LY", + "MA", + "MC", + "MD", + "ME", + "MF", + "MG", + "MH", + "MK", + "ML", + "MM", + "MN", + "MO", + "MP", + "MQ", + "MR", + "MS", + "MT", + "MU", + "MV", + "MW", + "MX", + "MY", + "MZ", + "NA", + "NC", + "NE", + "NF", + "NG", + "NI", + "NL", + "NO", + "NP", + "NR", + "NU", + "NZ", + "O1", + "OM", + "PA", + "PE", + "PF", + "PG", + "PH", + "PK", + "PL", + "PM", + "PN", + "PR", + "PS", + "PT", + "PW", + "PY", + "QA", + "RE", + "RO", + "RS", + "RU", + "RW", + "SA", + "SB", + "SC", + "SD", + "SE", + "SG", + "SH", + "SI", + "SJ", + "SK", + "SL", + "SM", + "SN", + "SO", + "SR", + "ST", + "SV", + "SY", + "SZ", + "TC", + "TD", + "TF", + "TG", + "TH", + "TJ", + "TK", + "TL", + "TM", + "TN", + "TO", + "TR", + "TT", + "TV", + "TW", + "TZ", + "UA", + "UG", + "UM", + "US", + "UY", + "UZ", + "VA", + "VC", + "VE", + "VG", + "VI", + "VN", + "VU", + "WF", + "WS", + "YE", + "YT", + "ZA", + "ZM", + "ZW" + ] + }, + "Enum_Protocols_Idle_Timeout_Policy": { + "description": "Enum values for Idle_Timeout_Policy protocols", + "type": "string", + "enum": [ + "3pc", + "a/n", + "ah", + "all-other", + "argus", + "aris", + "ax.25", + "bbn-rcc", + "bna", + "br-sat-mon", + "cbt", + "cftp", + "chaos", + "compaq-peer", + "cphb", + "cpnx", + "crdup", + "crtp", + "dccp", + "dcn", + "ddp", + "ddx", + "dgp", + "dsr", + "egp", + "eigrp", + "emcon", + "encap", + "esp", + "etherip", + "fc", + "fire", + "ggp", + "gmtp", + "gre", + "hip", + "hmp", + "hopopt", + "i-nlsp", + "iatp", + "icmp", + "idpr", + "idpr-cmtp", + "idrp", + "ifmp", + "igmp", + "igp", + "il", + "ip", + "ipcomp", + "ipcv", + "ipencap", + "ipip", + "iplt", + "ippc", + "ipv4", + "ipv6", + "ipv6-auth", + "ipv6-crypt", + "ipv6-frag", + "ipv6-icmp", + "ipv6-nonxt", + "ipv6-opts", + "ipv6-route", + "ipx-in-ip", + "irtp", + "isis", + "iso-ip", + "iso-tp4", + "kryptolan", + "l2tp", + "larp", + "leaf-1", + "leaf-2", + "manet", + "merit-inp", + "mfe-nsp", + "micp", + "mobile", + "mobility-header", + "mpls-in-ip", + "mtp", + "mux", + "narp", + "netblt", + "nsfnet-igp", + "nvp", + "ospf", + "pgm", + "pim", + "pipe", + "pnni", + "prm", + "ptp", + "pup", + "pvp", + "qnx", + "rdp", + "rohc", + "rsvp", + "rspv-e2e-ignore", + "rvd", + "sat-expak", + "sat-mon", + "scc-sp", + "scps", + "sctp", + "sdrp", + "secure-vmtp", + "shim6", + "skip", + "sm", + "smp", + "snp", + "sprite-rpc", + "sps", + "srp", + "sscopmce", + "st", + "stp", + "sun-nd", + "swipe", + "tcf", + "tcp", + "tlsp", + "tp++", + "trunk-1", + "trunk-2", + "ttp", + "udp", + "udplite", + "uti", + "vines", + "visa", + "vmtp", + "vrrp", + "wb-expak", + "wb-mon", + "wesp", + "wsn", + "xnet", + "xns-idp", + "xtp" + ] + }, + "GSLB_Domain": { + "title": "GSLB_Domain", + "description": "Configures GSLB (Global Server Load Balancing) settings for a domain.", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "GSLB_Domain" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "domainName": { + "title": "Domain Name", + "description": "The name of the domain for the site content you are load balancing. If you have many domains, you can use two different wildcard characters, * and ?, to represent one or more characters in the domain alias, which reduces the number of aliases you have to add to the configuration", + "type": "string", + "minLength": 3 + }, + "aliases": { + "title": "Aliases", + "description": "List of alternate domain names. Each may include wildcard characters.", + "type": "array", + "items": { + "title": "GSLB domain name", + "type": "string", + "minLength": 3 + } + }, + "enabled": { + "title": "Enabled", + "description": "When true (default), the system can use the domain and its resources for load balancing requests", + "type": "boolean", + "default": true + }, + "resourceRecordType": { + "title": "Resource Record (RR) Type", + "description": "Specifies the type of resource records for this domain", + "type": "string", + "enum": [ + "A", + "AAAA", + "CNAME", + "MX" + ] + }, + "pools": { + "title": "Pools", + "description": "Specifies the pools that this domain uses for load balancing. The system evaluates the pools in the order in which they are listed, until it finds a matching pool", + "type": "array", + "items": { + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to GSLB Pool declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "GSLB_Pool" + } + }, + "required": [ + "class" + ] + } + } + }, + "ratio": { + "title": "Ratio weight", + "description": "Ratio weight assigned to GSLB pool", + "type": "integer", + "default": 1 + } + }, + "additionalProperties": false, + "dependencies": { + "ratio": { + "minProperties": 2, + "maxProperties": 2 + }, + "use": { + "minProperties": 1, + "maxProperties": 2 + } + } + } + }, + "poolsCname": { + "title": "Pools Cname", + "description": "Specifies the cname pools this domain uses for load balancing. The system evaluates the pools in the order in which they are listed, until it finds a matching pool", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_GSLB_Pool" + } + }, + "poolLbMode": { + "title": "Pool Load Balancing Mode", + "description": "Specifies the load balancing method used to select a pool in this domain", + "type": "string", + "enum": [ + "global-availability", + "ratio", + "round-robin", + "topology" + ], + "default": "round-robin" + }, + "lastResortPool": { + "title": "Last Resort Pool", + "description": "Specifies the pools this domain uses for load balancing. The system evaluates the pools in the order in which they are listed, until it finds a matching pool", + "$ref": "#/definitions/Pointer_GSLB_Pool" + }, + "lastResortPoolType": { + "title": "Last Resort Pool type", + "description": "This is used to specify the type of pool being used for the lastResortPool", + "type": "string", + "enum": [ + "A", + "AAAA", + "CNAME", + "MX" + ] + }, + "iRules": { + "title": "iRules", + "description": "List of GSLB iRules for this GSLB Domain (order is significant)", + "type": "array", + "items": { + "title": "iRule", + "description": "BIG-IP AS3 pointer to GSLB_iRule (declared separately)", + "if": { + "type": "string" + }, + "then": { + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "GSLB_iRule" + } + }, + "required": [ + "class" + ] + } + } + }, + "else": { + "type": "object", + "properties": { + "bigip": { + "title": "BIG-IP GTM iRule", + "description": "Pathname of existing BIG-IP GTM iRule", + "type": "string", + "format": "f5bigip" + }, + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to GSLB_iRule (declared separately)", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "GSLB_iRule" + } + }, + "required": [ + "class" + ] + } + } + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query gtm rule" + ] + } + } + }, + "$comment": "uniqueItems: true" + }, + "persistenceEnabled": { + "title": "Persistence", + "description": "Specifies that when a local DNS server makes repetitive requests on behalf of a client, the system reconnects the client to the same resource as previous requests. Set to true to enable.", + "type": "boolean", + "default": false + }, + "persistCidrIpv4": { + "title": "PersistCidrIpv4", + "description": "Specifies a mask used to group IPv4 LDNS addresses.", + "type": "integer", + "minimum": 0, + "maximum": 32, + "default": 32 + }, + "persistCidrIpv6": { + "title": "PersistCidrIpv6", + "description": "Specifies a mask used to group IPv6 LDNS addresses.", + "type": "integer", + "minimum": 0, + "maximum": 128, + "default": 128 + }, + "ttlPersistence": { + "title": "TTL Persistence", + "description": "Specifies, in seconds, the length of time for which a persistence entry is valid.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 3600 + }, + "clientSubnetPreferred": { + "title": "Client Subnet Preferred", + "description": "Specifies that this domain should use the edns0 client subnet option when using topology load balancing. If the query does not contain a client subnet option, the system will fall back to the default option of using the source address.", + "type": "boolean", + "default": false, + "f5PostProcess": { + "tag": "minVersion", + "data": "14.1" + } + } + }, + "if": { + "properties": { + "pools": {} + }, + "required": [ + "pools" + ] + }, + "then": { + "not": { + "properties": { + "poolsCname": {} + }, + "required": [ + "poolsCname" + ] + } + }, + "required": [ + "resourceRecordType", + "domainName" + ] + }, + "GSLB_Domain_A": { + "description": "Configures GSLB (Global Server Load Balancing) settings for A domain.", + "allOf": [ + { + "$ref": "#/definitions/GSLB_Domain" + } + ] + }, + "GSLB_Domain_AAAA": { + "description": "Configures GSLB (Global Server Load Balancing) settings for AAAA domain.", + "allOf": [ + { + "$ref": "#/definitions/GSLB_Domain" + } + ] + }, + "GSLB_Domain_CNAME": { + "description": "Configures GSLB (Global Server Load Balancing) settings for CNAME domain.", + "allOf": [ + { + "$ref": "#/definitions/GSLB_Domain" + } + ] + }, + "GSLB_Domain_MX": { + "description": "Configures GSLB (Global Server Load Balancing) settings for MX domain.", + "allOf": [ + { + "$ref": "#/definitions/GSLB_Domain" + } + ] + }, + "GSLB_iRule": { + "title": "GSLB_iRule", + "description": "Specifies or configures an iRule for use in GSLB Domains", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "GSLB_iRule" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "expand": { + "title": "Expand", + "description": "If true (default), expand backquoted variables in iRule", + "type": "boolean", + "default": true + }, + "iRule": { + "$ref": "#/definitions/IRule_Core" + } + }, + "additionalProperties": false, + "required": [ + "class", + "iRule" + ] + }, + "GSLB_Monitor": { + "title": "GSLB_Monitor", + "description": "Declares a monitor that verifies the availability and/or performance status of a particular protocol, service, or application", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "GSLB_Monitor" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "monitorType": { + "title": "Monitor Type", + "description": "Specifies the type of monitor", + "type": "string", + "enum": [ + "http", + "https", + "gateway-icmp", + "tcp", + "udp", + "external" + ] + }, + "target": { + "title": "Target (Address:Port)", + "description": "Specifies the IP address and service port of the resource that is the destination of this monitor. Format is ip:port", + "type": "string", + "default": "*:*" + }, + "interval": { + "title": "Interval", + "description": "Specifies, in seconds, the frequency at which the system issues the monitor check when either the resource is down or the status of the resource is unknown", + "type": "integer", + "minimum": 0, + "maximum": 86399, + "default": 30 + }, + "timeout": { + "title": "Timeout", + "description": "Specifies the number of seconds the target has in which to respond to the monitor request", + "type": "integer", + "minimum": 0, + "maximum": 86400, + "default": 120 + }, + "probeTimeout": { + "title": "Probe Timeout", + "description": "Specifies the number of seconds after which the system times out the probe request to the system", + "type": "integer", + "minimum": 0, + "default": 5 + }, + "ignoreDownResponseEnabled": { + "title": "Ignore Down Response", + "description": "Specifies whether the monitor immediately marks an object down when it receives a down response. If enabled, the monitor ignores the down response for the duration of timeout. The default is false (disabled)", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "f5PostProcess": { + "tag": "modules", + "data": [ + "gtm" + ] + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "http" + } + } + }, + "then": { + "$ref": "#/definitions/GSLB_Monitor_HTTP" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "https" + } + } + }, + "then": { + "$ref": "#/definitions/GSLB_Monitor_HTTPS" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "gateway-icmp" + } + } + }, + "then": { + "$ref": "#/definitions/GSLB_Monitor_ICMP" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "udp" + } + } + }, + "then": { + "$ref": "#/definitions/GSLB_Monitor_UDP" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "tcp" + } + } + }, + "then": { + "$ref": "#/definitions/GSLB_Monitor_TCP" + } + }, + { + "if": { + "properties": { + "monitorType": { + "const": "external" + } + } + }, + "then": { + "$ref": "#/definitions/GSLB_Monitor_External" + } + } + ], + "required": [ + "class", + "monitorType" + ] + }, + "GSLB_Monitor_External": { + "description": "Additional Monitor class properties available when monitorType = external", + "type": "object", + "properties": { + "pathname": { + "title": "pathname", + "description": "Tmsh object path name of an imported existing external monitor (e.g. /Common/arg_example)", + "type": "string", + "minLength": 2, + "f5PostProcess": { + "tag": "expand" + } + }, + "expand": { + "title": "Expand", + "description": "If true (default), expand backquoted variables in script", + "type": "boolean", + "default": true + }, + "script": { + "title": "External monitor script", + "description": "Bash(1) script which implements external monitor", + "allOf": [ + { + "$ref": "#/definitions/F5string" + }, + { + "f5PostProcess": { + "tag": "expand", + "data": { + "when": "1/expand" + } + } + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "string" + } + } + ] + }, + "arguments": { + "title": "Arguments", + "description": "Arguments to specified external monitor (will be backquote-expanded)", + "type": "string", + "default": "", + "f5PostProcess": { + "tag": "expand" + } + }, + "environmentVariables": { + "description": "Specifies user defined command line parameters that the external program requires.", + "type": "object", + "additionalProperties": { + "type": "string" + }, + "default": {} + } + }, + "oneOf": [ + { + "required": [ + "pathname" + ] + }, + { + "required": [ + "script" + ] + } + ] + }, + "GSLB_Monitor_HTTP": { + "description": "Additional Monitor class properties available when monitorType = http", + "type": "object", + "properties": { + "reverseEnabled": { + "title": "Reverse Enabled", + "description": "When enabled, a successful check marks the monitored object down instead of up. You can use the Reverse mode only if you configure both the send and receive options", + "type": "boolean", + "default": false + }, + "send": { + "title": "Send String", + "description": "Specifies the text string that the monitor sends to the target object. If you do not specify a value for both the send and receive options, the monitor performs a simple service check and connect only", + "type": "string", + "default": "HEAD / HTTP/1.0\\r\\n\\r\\n", + "f5PostProcess": { + "tag": "expand" + } + }, + "receive": { + "title": "Receive String", + "description": "Specifies the text string that the monitor looks for in the returned resource. If you do not specify a value for both the send and receive options, the monitor performs a simple service check and connect only", + "type": "string", + "default": "HTTP/1.", + "f5PostProcess": { + "tag": "expand" + } + }, + "transparent": { + "title": "Transparent", + "description": "Enables monitoring of pool members through firewalls. The default value is false (disabled)", + "type": "boolean", + "default": false + } + } + }, + "GSLB_Monitor_HTTPS": { + "description": "Additional Monitor class properties available when monitorType = https", + "type": "object", + "allOf": [ + { + "properties": { + "ciphers": { + "title": "Ciphers", + "description": "Ciphersuite selection string", + "type": "string", + "default": "DEFAULT" + }, + "clientCertificate": { + "title": "Client certificate", + "description": "BIG-IP AS3 pointer to client Certificate declaration, for TLS authentication (optional)", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Certificate" + } + }, + "required": [ + "class" + ] + } + } + } + } + }, + { + "$ref": "#/definitions/GSLB_Monitor_HTTP" + } + ] + }, + "GSLB_Monitor_ICMP": { + "description": "Additional Monitor class properties available when monitorType = gateway-icmp", + "type": "object", + "properties": { + "probeInterval": { + "title": "Probe Interval", + "description": "Specifies the frequency at which the BIG-IP system probes the host server", + "type": "integer", + "minimum": 0, + "default": 1 + }, + "probeAttempts": { + "title": "Probe Attempts", + "description": "Specifies the number of times the BIG-IP system attempts to probe the host server, after which the BIG-IP system considers the host server down or unavailable", + "type": "integer", + "minimum": 0, + "default": 3 + }, + "transparent": { + "title": "Transparent", + "description": "Enables monitoring of pool members through firewalls. The default value is false (disabled)", + "type": "boolean", + "default": false + } + } + }, + "GSLB_Monitor_TCP": { + "description": "Additional Monitor class properties available when monitorType = tcp", + "type": "object", + "properties": { + "reverseEnabled": { + "title": "Reverse Enabled", + "description": "When enabled, a successful check marks the monitored object down instead of up. You can use the Reverse mode only if you configure both the send and receive options", + "type": "boolean", + "default": false + }, + "send": { + "title": "Send String", + "description": "Specifies the text string that the monitor sends to the target object. If you do not specify a value for both the send and receive options, the monitor performs a simple service check and connect only", + "type": "string", + "default": "" + }, + "receive": { + "title": "Receive String", + "description": "Specifies the text string that the monitor looks for in the returned resource. If you do not specify a value for both the send and receive options, the monitor performs a simple service check and connect only", + "type": "string", + "default": "" + }, + "transparent": { + "title": "Transparent", + "description": "Enables monitoring of pool members through firewalls. The default value is false (disabled)", + "type": "boolean", + "default": false + } + } + }, + "GSLB_Monitor_UDP": { + "description": "Additional Monitor class properties available when monitorType = udp", + "type": "object", + "properties": { + "debugEnabled": { + "title": "Debug Enabled", + "description": "When enabled, the monitor sends error messages and additional information to a log file created and labeled specifically for this monitor. The default is false (disabled)", + "type": "boolean", + "default": false + }, + "probeAttempts": { + "title": "Probe Attempts", + "description": "Specifies the number of times the BIG-IP system attempts to probe the host server, after which the BIG-IP system considers the host server down or unavailable", + "type": "integer", + "minimum": 0, + "default": 3 + }, + "probeInterval": { + "title": "Probe Interval", + "description": "Specifies the frequency at which the BIG-IP system probes the host server", + "type": "integer", + "minimum": 0, + "default": 1 + }, + "reverseEnabled": { + "title": "Reverse Enabled", + "description": "When enabled, a successful check marks the monitored object down instead of up. You can use the Reverse mode only if you configure both the send and receive options", + "type": "boolean", + "default": false + }, + "send": { + "title": "Send String", + "description": "Specifies the text string that the monitor sends to the target object. If you do not specify a value for both the send and receive options, the monitor performs a simple service check and connect only", + "type": "string", + "default": "default send string" + }, + "receive": { + "title": "Receive String", + "description": "Specifies the text string that the monitor looks for in the returned resource. If you do not specify a value for both the send and receive options, the monitor performs a simple service check and connect only", + "type": "string", + "default": "" + }, + "transparent": { + "title": "Transparent", + "description": "Enables monitoring of pool members through firewalls. The default value is false (disabled)", + "type": "boolean", + "default": false + } + } + }, + "GSLB_Pool": { + "title": "GSLB_Pool", + "description": "Declares a pool to use for load balancing", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "GSLB_Pool" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "resourceRecordType": { + "title": "Resource Record (RR) Type", + "description": "Specifies the type of resource records for this domain", + "type": "string", + "enum": [ + "A", + "AAAA", + "CNAME", + "MX" + ] + }, + "enabled": { + "title": "Enabled", + "description": "Specifies whether the pool and its resources are available for load balancing", + "type": "boolean", + "default": true + }, + "lbModePreferred": { + "title": "Preferred LB Mode", + "description": "Preferred Load Balancing mode", + "type": "string", + "enum": [ + "completion-rate", + "cpu", + "drop-packet", + "fallback-ip", + "fewest-hops", + "global-availability", + "kilobytes-per-second", + "least-connections", + "lowest-round-trip-time", + "packet-rate", + "quality-of-service", + "ratio", + "return-to-dns", + "round-robin", + "static-persistence", + "topology", + "virtual-server-capacity", + "virtual-server-score" + ], + "default": "round-robin" + }, + "lbModeAlternate": { + "title": "Alternate LB Mode", + "description": "Alternate Load Balancing mode", + "type": "string", + "enum": [ + "drop-packet", + "fallback-ip", + "global-availability", + "packet-rate", + "ratio", + "return-to-dns", + "round-robin", + "static-persistence", + "topology", + "virtual-server-capacity", + "virtual-server-score", + "none" + ], + "default": "round-robin" + }, + "lbModeFallback": { + "title": "Fallback LB mode", + "description": "Fallback Load Balancing mode", + "type": "string", + "enum": [ + "completion-rate", + "cpu", + "drop-packet", + "fallback-ip", + "fewest-hops", + "global-availability", + "kilobytes-per-second", + "least-connections", + "lowest-round-trip-time", + "packet-rate", + "quality-of-service", + "ratio", + "return-to-dns", + "round-robin", + "static-persistence", + "topology", + "virtual-server-capacity", + "virtual-server-score", + "none" + ], + "default": "return-to-dns" + }, + "manualResumeEnabled": { + "title": "Manual Resume Enabled", + "description": "Specifies whether you must manually restart a pool member that goes down", + "type": "boolean", + "default": false + }, + "ttl": { + "title": "Time-to-Live (TTL)", + "description": "Specifies the number of seconds the IP address, once found, is valid. Once the time-to-live (TTL) expires, the client has to request the IP address resolution again ", + "type": "integer", + "default": 30, + "minimum": 0, + "maximum": 4294967295 + }, + "verifyMemberEnabled": { + "title": "Verify Member Availability Enabled", + "description": "Specifies the system verifies the availability of the pool members before sending a connection to those resources", + "type": "boolean", + "default": true + } + }, + "allOf": [ + { + "if": { + "properties": { + "resourceRecordType": { + "const": "MX" + } + } + }, + "then": { + "properties": { + "maxAnswersReturned": { + "title": "Maximum Number of Answers Returned", + "description": "Specifies the maximum number of available virtual servers that the system lists in a response", + "type": "integer", + "minimum": 1, + "default": 1, + "maximum": 500 + }, + "members": { + "title": "Members", + "description": "Specifies the members of this pool", + "type": "array", + "items": { + "$ref": "#/definitions/GSLB_Pool_Member_MX" + } + } + } + } + }, + { + "if": { + "properties": { + "resourceRecordType": { + "const": "CNAME" + } + } + }, + "then": { + "allOf": [ + { + "properties": { + "members": { + "title": "Members", + "description": "Specifies the members of this pool", + "type": "array", + "items": { + "$ref": "#/definitions/GSLB_Pool_Member_CNAME" + } + } + } + }, + { + "not": { + "required": [ + "maxAnswersReturned", + "monitors" + ] + } + } + ] + } + }, + { + "if": { + "properties": { + "resourceRecordType": { + "const": "A" + } + } + }, + "then": { + "properties": { + "maxAnswersReturned": { + "title": "Maximum Number of Answers Returned", + "description": "Specifies the maximum number of available virtual servers that the system lists in a response", + "type": "integer", + "minimum": 1, + "default": 1, + "maximum": 500 + }, + "members": { + "title": "Members", + "description": "Specifies the members of this pool", + "type": "array", + "items": { + "$ref": "#/definitions/GSLB_Pool_Member_A" + } + } + } + } + }, + { + "if": { + "properties": { + "resourceRecordType": { + "const": "AAAA" + } + } + }, + "then": { + "properties": { + "maxAnswersReturned": { + "title": "Maximum Number of Answers Returned", + "description": "Specifies the maximum number of available virtual servers the system lists in a response", + "type": "integer", + "minimum": 1, + "default": 1, + "maximum": 500 + }, + "members": { + "title": "Members", + "description": "Specifies the members of this pool", + "type": "array", + "items": { + "$ref": "#/definitions/GSLB_Pool_Member_AAAA" + } + } + } + } + }, + { + "if": { + "anyOf": [ + { + "properties": { + "resourceRecordType": { + "const": "A" + } + } + }, + { + "properties": { + "resourceRecordType": { + "const": "AAAA" + } + } + } + ] + }, + "then": { + "properties": { + "monitors": { + "title": "Monitors", + "description": "Specifies the health monitors the system uses to determine whether it can use this pool for load balancing", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_GSLB_Monitor" + } + }, + "fallbackIP": { + "title": "Fallback IP", + "description": "Specifies the IP address of the server to which the system directs requests when it cannot use one of its pools to do so. Note that the system uses the fallback IP only if you select a Fallback load balancing method", + "type": "string", + "format": "f5ip" + }, + "bpsLimit": { + "title": "Maximum Bits Per Second", + "description": "The maximum allowable data throughput rate, in bits per second, for the virtual servers in the pool. If the network traffic volume exceeds this value, the system marks the pool as unavailable", + "type": "integer", + "default": 0, + "minimum": 0 + }, + "bpsLimitEnabled": { + "title": "Maximum Bits Per Second - Limit Enabled", + "description": "Enables or disables the maximum Bits Per Second (BPS) option for this pool. The default value is false (disabled)", + "type": "boolean", + "default": false + }, + "ppsLimit": { + "title": "Maximum Packets Per Second", + "description": "The maximum allowable data transfer rate, in packets per second, for the virtual servers in the pool. If the network traffic volume exceeds this value, the system marks the pool as unavailable", + "type": "integer", + "default": 0, + "minimum": 0 + }, + "ppsLimitEnabled": { + "title": "Maximum Packets Per Second - Limit Enabled", + "description": "Enables or disables the maximum Packets Per Second (PPS) option for this pool. The default value is false (disabled)", + "type": "boolean", + "default": false + }, + "connectionsLimit": { + "title": "Maximum Current Connections Per Second", + "description": "The number of current connections allowed for the virtual servers in the pool. If the current connections exceed this value, the system marks the pool as unavailable", + "type": "integer", + "default": 0, + "minimum": 0 + }, + "connectionsLimitEnabled": { + "title": "Maximum Current Connections Per Second - Limit Enabled", + "description": "Enables or disables the maximum current connections option for this pool. The default value is false (disabled)", + "type": "boolean", + "default": false + } + } + } + }, + { + "if": { + "anyOf": [ + { + "properties": { + "lbModePreferred": { + "const": "quality-of-service" + } + } + }, + { + "properties": { + "lbModeFallback": { + "const": "quality-of-service" + } + } + } + ] + }, + "then": { + "properties": { + "qosHitRatio": { + "title": "Quality of Service (QOS) Hit Ratio", + "description": "Assigns a weight to the Hit Ratio performance factor for the Quality of Service dynamic load balancing mode", + "type": "integer", + "minimum": 0, + "default": 5 + }, + "qosHops": { + "title": "Quality of Service (QOS) Hops", + "description": "Assigns a weight to the Hops performance factor for the Quality of Service dynamic load balancing mode", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "qosKbps": { + "title": "Quality of Service (QOS) Kilobytes per Second (Kbps)", + "description": "Assigns a weight to the Kilobytes per Second performance factor for the Quality of Service dynamic load balancing mode", + "type": "integer", + "minimum": 0, + "default": 3 + }, + "qosLinkCapacity": { + "title": "Quality of Service (QOS) Link Capacity", + "description": "Assigns a weight to the Link Capacity performance factor for the Quality of Service dynamic load balancing mode", + "type": "integer", + "minimum": 0, + "default": 30 + }, + "qosPacketRate": { + "title": "Quality of Service (QOS) Packet Rate", + "description": "Assigns a weight to the Packet Rate performance factor for the Quality of Service dynamic load balancing mode", + "type": "integer", + "minimum": 0, + "default": 1 + }, + "qosRoundTripTime": { + "title": "Quality of Service (QOS) Round Trip Time", + "description": "Assigns a weight to the Round Trip Time performance factor for the Quality of Service dynamic load balancing mode", + "type": "integer", + "minimum": 0, + "default": 50 + }, + "qosTopology": { + "title": "Quality of Service (QOS) Topology", + "description": "Assigns a weight to the Topology performance factor for the Quality of Service dynamic load balancing mode", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "qosVirtualServerCapacity": { + "title": "Quality of Service (QOS) Virtual Server Capacity", + "description": "Assigns a weight to the Virtual Server performance factor for the Quality of Service dynamic load balancing mode", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "qosVirtualServerScore": { + "title": "Quality of Service (QOS) Virtual Server Score", + "description": "Assigns a weight to the Virtual Server Score performance factor for the Quality of Service dynamic load balancing mode", + "type": "integer", + "minimum": 0, + "default": 0 + } + } + } + } + ], + "required": [ + "class", + "resourceRecordType" + ] + }, + "GSLB_Pool_Member_A": { + "title": "GSLB A rrType Pool Member", + "description": "Declares member of the GSLB pool", + "type": "object", + "properties": { + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "server": { + "$ref": "#/definitions/Pointer_GSLB_Server" + }, + "virtualServer": { + "description": "Specifies that the Global Traffic Manager assigns connection requests to virtual servers based on a user-defined ranking system.", + "oneOf": [ + { + "type": "string" + }, + { + "$ref": "#/definitions/Pointer_Service" + } + ] + }, + "ratio": { + "title": "Ratio", + "description": "Specifies the ratio weight assigned to the pool member. This weight determines the frequency at which the pool member is selected for load balancing", + "type": "integer", + "default": 1, + "minimum": 0, + "maximum": 65535 + }, + "enabled": { + "title": "Enabled", + "description": "When true (default), the system can use the pool member and its resources for load balancing requests", + "type": "boolean", + "default": true + }, + "dependsOn": { + "description": "Specifies the name of the virtual server on which this pool member depends.", + "type": [ + "string", + "array" + ], + "oneOf": [ + { + "type": "string", + "const": "none" + }, + { + "type": "array", + "items": { + "type": "string", + "pattern": "^/Common/Shared/.*:.*" + } + } + ] + } + }, + "additionalProperties": false, + "required": [ + "server", + "virtualServer" + ] + }, + "GSLB_Pool_Member_AAAA": { + "title": "GSLB AAAA rrType Pool Member", + "description": "Declares member of the GSLB pool", + "type": "object", + "properties": { + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "server": { + "$ref": "#/definitions/Pointer_GSLB_Server" + }, + "virtualServer": { + "description": "Specifies that the Global Traffic Manager assigns connection requests to virtual servers based on a user-defined ranking system.", + "oneOf": [ + { + "type": "string" + }, + { + "$ref": "#/definitions/Pointer_Service" + } + ] + }, + "ratio": { + "title": "Ratio", + "description": "Specifies the ratio weight assigned to the pool member. This weight determines the frequency at which the pool member is selected for load balancing", + "type": "integer", + "default": 1, + "minimum": 0, + "maximum": 65535 + }, + "enabled": { + "title": "Enabled", + "description": "When true (default), the system can use the pool member and its resources for load balancing requests", + "type": "boolean", + "default": true + }, + "dependsOn": { + "description": "Specifies the name of the virtual server on which this pool member depends.", + "type": [ + "string", + "array" + ], + "oneOf": [ + { + "type": "string", + "const": "none" + }, + { + "type": "array", + "items": { + "type": "string", + "pattern": "^/Common/Shared/.*:.*" + } + } + ] + } + }, + "additionalProperties": false, + "required": [ + "server", + "virtualServer" + ] + }, + "GSLB_Pool_Member_CNAME": { + "title": "GSLB CNAME rrType Pool Member", + "description": "Declares member of the GSLB pool", + "type": "object", + "properties": { + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "ratio": { + "title": "Ratio", + "description": "Specifies the ratio weight assigned to the pool member. This weight determines the frequency at which the pool member is selected for load balancing", + "type": "integer", + "default": 1, + "minimum": 0, + "maximum": 65535 + }, + "enabled": { + "title": "Enabled", + "description": "When true (default), the system can use the pool member and its resources for load balancing requests", + "type": "boolean", + "default": true + }, + "domainName": { + "title": "Domain Name", + "description": "Specifies the domain name for this pool member", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/definitions/Pointer_GSLB_Domain_A" + }, + { + "$ref": "#/definitions/Pointer_GSLB_Domain_AAAA" + }, + { + "$ref": "#/definitions/Pointer_GSLB_Domain_CNAME" + }, + { + "$ref": "#/definitions/Pointer_GSLB_Domain_MX" + } + ] + }, + "isDomainNameStatic": { + "title": "Static DomainName/ Static Target", + "description": "Specifies that the member's name specifies a static domain name rather than a name linked to a domain defined on the system. This might be required if the target domainName is not owned by the organization or configured on the BIG-IP. One side-effect of using a static target is that the member is always considered available for load balancing. The default is (false) disabled", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false, + "required": [ + "domainName" + ] + }, + "GSLB_Pool_Member_MX": { + "title": "GSLB MX rrType Pool Member", + "description": "Declares member of the GSLB pool", + "type": "object", + "properties": { + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "enabled": { + "title": "Enabled", + "description": "When true (default), the system can use the pool member and its resources for load balancing requests", + "type": "boolean", + "default": true + }, + "domainName": { + "title": "Domain Name", + "description": "Specifies the domain name for this pool member", + "anyOf": [ + { + "$ref": "#/definitions/Pointer_GSLB_Domain_A" + }, + { + "$ref": "#/definitions/Pointer_GSLB_Domain_AAAA" + } + ] + }, + "priority": { + "title": "Priority", + "description": "Specifies the MX resource record priority", + "type": "integer", + "default": 10, + "minimum": 0, + "maximum": 65535 + }, + "ratio": { + "title": "Ratio", + "description": "Specifies the ratio weight assigned to the pool member. This weight determines the frequency at which the pool member is selected for load balancing", + "type": "integer", + "default": 1, + "minimum": 0, + "maximum": 65535 + } + }, + "additionalProperties": false, + "required": [ + "domainName" + ] + }, + "GSLB_Server": { + "title": "GSLB_Server", + "description": "Declares a GSLB server object which contains configuration for a load balancer or a host server", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "GSLB_Server" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "enabled": { + "title": "Enabled", + "description": "Specifies whether the server is enabled or disabled", + "type": "boolean", + "default": true + }, + "serverType": { + "title": "Server Type", + "description": "Specifies the server type. The server type determines the metrics that the system can collect from the server", + "type": "string", + "enum": [ + "bigip", + "generic-host" + ], + "default": "bigip" + }, + "proberPreferred": { + "title": "Prober Preferred", + "description": "Specifies the type of prober to use to monitor servers defined in this data center. The default value is inside-data-center. Note: Prober pools are not used by the bigip monitor", + "type": "string", + "enum": [ + "inherit", + "inside-datacenter", + "outside-datacenter", + "pool" + ], + "default": "inherit" + }, + "proberFallback": { + "title": "Prober Fallback", + "description": "Specifies the type of prober to use to monitor servers defined in this data center when the preferred type is not available. The default value is any-available", + "type": "string", + "enum": [ + "inherit", + "any-available", + "inside-datacenter", + "none", + "outside-datacenter", + "pool" + ], + "default": "inherit" + }, + "dataCenter": { + "$ref": "#/definitions/Pointer_GSLB_Data_Center" + }, + "devices": { + "title": "Device List", + "description": "Specifies the actual device(s) that are represented by this server object", + "type": "array", + "items": { + "$ref": "#/definitions/GSLB_Server_Device" + }, + "minItems": 1 + }, + "virtualServers": { + "title": "Virtual Server List", + "description": "Specifies the virtual server(s) that are resources on this server object", + "type": "array", + "items": { + "$ref": "#/definitions/GSLB_Virtual_Server" + } + }, + "virtualServerDiscoveryMode": { + "title": "Virtual Server Auto Discovery Mode", + "description": "Specifies virtual server auto-discovery settings. Use 'enabled' (add, modify, delete), 'enabled-no-delete' (add, modify) or the default 'disabled' (manual configuration)", + "type": "string", + "enum": [ + "disabled", + "enabled", + "enabled-no-delete" + ], + "default": "disabled" + }, + "exposeRouteDomainsEnabled": { + "title": "Expose Route Domains Enabled", + "description": "Allows virtual servers from all route domains to be auto-discovered. The default setting is false", + "type": "boolean", + "default": false + }, + "monitors": { + "title": "Monitor List", + "description": "Specifies the health monitors the system uses to determine whether it can use this server for load balancing", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_GSLB_Monitor" + }, + "default": [ + { + "bigip": "/Common/bigip" + } + ] + }, + "bpsLimit": { + "title": "Maximum Bits Per Second", + "description": "Specifies the maximum allowable data throughput rate, in bits per second, for the virtual servers on the server. If the network traffic volume exceeds this limit, the system marks the server as unavailable", + "type": "integer", + "default": 0, + "minimum": 0 + }, + "bpsLimitEnabled": { + "title": "Maximum Bits Per Second - Limit Enabled", + "description": "Enables or disables the maximum Bits Per Second (BPS) option for the virtual servers on the server. The default value is false (disabled)", + "type": "boolean", + "default": false + }, + "ppsLimit": { + "title": "Maximum Packets Per Second", + "description": "The maximum allowable data transfer rate, in packets per second, for the virtual servers on the server. If the network traffic volume exceeds this value, the system marks the server as unavailable", + "type": "integer", + "default": 0, + "minimum": 0 + }, + "ppsLimitEnabled": { + "title": "Maximum Packets Per Second - Limit Enabled", + "description": "Enables or disables the maximum Packets Per Second (PPS) option for the virtual servers on the server. The default value is false (disabled)", + "type": "boolean", + "default": false + }, + "connectionsLimit": { + "title": "Maximum Current Connections Per Second", + "description": "The number of current connections allowed for the virtual servers on the server. If the current connections exceed this value, the system marks the server as unavailable", + "type": "integer", + "default": 0, + "minimum": 0 + }, + "connectionsLimitEnabled": { + "title": "Maximum Current Connections Per Second - Limit Enabled", + "description": "Enables or disables the maximum current connections option for the virtual servers on the server. The default value is false (disabled)", + "type": "boolean", + "default": false + }, + "cpuUsageLimit": { + "title": "Maximum CPU Percent Usage", + "description": "Specifies the percent of CPU usage. If percent of CPU usage goes above the limit, the system marks the server as unavailable", + "type": "integer", + "minimum": 0 + }, + "cpuUsageLimitEnabled": { + "title": "Maximum CPU Percent Usage - Limit Enabled", + "description": "Enables or disables the CPU Usage limit option for this pool. The default value is false (disabled)", + "type": "boolean" + }, + "memoryLimit": { + "title": "Memory Available (KB)", + "description": "Specifies the available memory in kilobytes required by the virtual servers on the server. If available memory falls below this limit, the system marks the server as unavailable", + "type": "integer", + "minimum": 0 + }, + "memoryLimitEnabled": { + "title": "Memory Available - Limit Enabled", + "description": "Enables or disables the maximum Bits Per Second (BPS) option for this pool. The default value is false (disabled)", + "type": "boolean" + }, + "serviceCheckProbeEnabled": { + "title": "Path Probe - Enabled", + "description": "Specifies whether this BIG-IP device will be used to conduct a service check probe before traffic will be delegated to it. The default value is (true) enabled ", + "type": "boolean" + }, + "pathProbeEnabled": { + "title": "Service Check Probe - Enabled", + "description": "Specifies whether this BIG-IP device will be used to conduct a path probe before traffic will be delegated to it. The default value is (true) enabled ", + "type": "boolean" + }, + "snmpProbeEnabled": { + "title": "SNMP Probe - Enabled", + "description": "Specifies whether this BIG-IP device will be used to conduct a SNMP probe before traffic will be delegated to it. The default value is (true) enabled ", + "type": "boolean" + }, + "proberPool": { + "$ref": "#/definitions/Pointer_GSLB_Prober_Pool" + } + }, + "dependencies": { + "cpuUsageLimit": { + "properties": { + "serverType": { + "const": "generic-host" + } + } + }, + "cpuUsageLimitEnabled": { + "properties": { + "serverType": { + "const": "generic-host" + } + } + }, + "memoryLimit": { + "properties": { + "serverType": { + "const": "generic-host" + } + } + }, + "memoryLimitEnabled": { + "properties": { + "serverType": { + "const": "generic-host" + } + } + }, + "serviceCheckProbeEnabled": { + "properties": { + "serverType": { + "const": "bigip" + } + } + }, + "pathProbeEnabled": { + "properties": { + "serverType": { + "const": "bigip" + } + } + }, + "snmpProbeEnabled": { + "properties": { + "serverType": { + "const": "bigip" + } + } + }, + "proberPreferred": { + "if": { + "properties": { + "proberPreferred": { + "const": "pool" + } + } + }, + "then": { + "required": [ + "proberPool" + ] + } + }, + "proberFallback": { + "if": { + "properties": { + "proberFallback": { + "const": "pool" + } + } + }, + "then": { + "required": [ + "proberPool" + ] + } + } + }, + "allOf": [ + { + "if": { + "required": [ + "serverType" + ], + "properties": { + "serverType": { + "const": "generic-host" + } + } + }, + "then": { + "properties": { + "devices": { + "maxItems": 1 + }, + "cpuUsageLimit": { + "default": 0 + }, + "cpuUsageLimitEnabled": { + "default": false + }, + "memoryLimit": { + "default": 0 + }, + "memoryLimitEnabled": { + "default": false + } + } + } + }, + { + "if": { + "required": [ + "serverType" + ], + "properties": { + "serverType": { + "const": "bigip" + } + } + }, + "then": { + "properties": { + "serviceCheckProbeEnabled": { + "default": true + }, + "pathProbeEnabled": { + "default": true + }, + "snmpProbeEnabled": { + "default": true + } + } + } + } + ], + "required": [ + "class", + "dataCenter", + "devices" + ], + "additionalProperties": false + }, + "GSLB_Server_Device": { + "description": "Configures a device for the GSLB Server", + "type": "object", + "properties": { + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "address": { + "title": "Address", + "type": "string", + "description": " Specifies an external (public) address for the device. If BIG-IP DNS configuration synchronization is enabled and all existing addresses for a device are being replaced, new addresses should be added and synchronized before old addresses are removed, otherwise the changes may fail to synchronize. Alternatively, the address configuration changes can be performed on each BIG-IP DNS system", + "format": "f5ip" + }, + "addressTranslation": { + "title": "Address Translation", + "type": "string", + "description": "Specifies the internal (private) address that corresponds to the external address", + "format": "f5ip" + } + }, + "required": [ + "address" + ] + }, + "GSLB_Data_Center": { + "title": "GSLB_Data_Center", + "description": "Declares a GSLB Data Center configuration", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "GSLB_Data_Center" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "enabled": { + "title": "Enabled", + "description": "Specifies whether the data center is enabled or disabled", + "type": "boolean", + "default": true + }, + "location": { + "title": "Location", + "description": "Specifies the location of the data center", + "type": "string" + }, + "contact": { + "title": "Contact", + "description": "Specifies the name of the administrator or the name of the department that manages the data center", + "type": "string" + }, + "proberPreferred": { + "title": "Prober Preferred", + "description": "Specifies the type of prober to use to monitor servers defined in this data center. The default value is inside-data-center. Note: Prober pools are not used by the bigip monitor", + "type": "string", + "enum": [ + "inside-datacenter", + "outside-datacenter", + "pool" + ], + "default": "inside-datacenter" + }, + "proberFallback": { + "title": "Prober Fallback", + "description": "Specifies the type of prober to use to monitor servers defined in this data center when the preferred type is not available. The default value is any-available", + "type": "string", + "enum": [ + "any-available", + "inside-datacenter", + "none", + "outside-datacenter", + "pool" + ], + "default": "any-available" + }, + "proberPool": { + "$ref": "#/definitions/Pointer_GSLB_Prober_Pool" + } + }, + "dependencies": { + "proberPool": { + "anyOf": [ + { + "properties": { + "proberPreferred": { + "const": "pool" + } + } + }, + { + "properties": { + "proberFallback": { + "const": "pool" + } + } + } + ] + } + }, + "additionalProperties": false, + "required": [ + "class" + ] + }, + "GSLB_Virtual_Server": { + "title": "GSLB virtual server", + "description": "GSLB virtual server", + "type": "object", + "properties": { + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "enabled": { + "title": "Enabled", + "description": "Specifies whether the virtual server is enabled or disabled", + "type": "boolean", + "default": true + }, + "port": { + "title": "Port", + "description": "L4 port for service (like 443 for HTTPS)", + "type": "integer", + "minimum": 0, + "maximum": 65535 + }, + "address": { + "title": "Address", + "description": "Format of address for virtual server (such as IPv4)", + "type": "string", + "format": "f5ip" + }, + "addressTranslation": { + "title": "Address Translation", + "description": "Specifies the public address that this virtual server translates into when the GSLB provider communicates between the network and the Internet. The default value is disabled", + "type": "string", + "format": "f5ip" + }, + "addressTranslationPort": { + "title": "Address Translation Port", + "description": "L4 port for service (like 443 for HTTPS)", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 0 + }, + "monitors": { + "title": "Monitors", + "description": "Specifies the health monitors that the system uses to determine whether it can use this linked virtual server for load balancing", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_GSLB_Monitor" + } + }, + "name": { + "title": "Name", + "description": "Specifies the name of the Virtual Server", + "type": "string" + } + }, + "required": [ + "address", + "port" + ], + "additionalProperties": false + }, + "GSLB_Prober_Pool": { + "title": "GSLB_Prober_Pool", + "description": "Declares a pool of BIG-IP devices that will monitor server resources for health and performance. Note: Prober pools are not used by the bigip monitor", + "f5PostProcess": { + "tag": "modules", + "data": [ + "gtm" + ] + }, + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "GSLB_Prober_Pool" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "enabled": { + "title": "Enabled", + "description": "Specifies whether this pool is available for conducting probes", + "type": "boolean", + "default": true + }, + "lbMode": { + "title": "Load Balancing Mode", + "description": "Specifies the load balancing mode the system uses to select the members of this pool", + "type": "string", + "enum": [ + "global-availability", + "round-robin" + ] + }, + "members": { + "title": "Members", + "description": "Specifies the members of the prober pool", + "type": "array", + "items": { + "$ref": "#/definitions/GSLB_Prober_Pool_Member" + } + } + } + }, + "GSLB_Prober_Pool_Member": { + "title": "GSLB Prober Pool Member", + "description": "Declares member of the GSLB prober pool", + "type": "object", + "properties": { + "enabled": { + "title": "Prober Pool Member Enabled", + "description": "Specifies whether the server can be used as a member of a prober pool", + "type": "boolean", + "default": true + }, + "memberOrder": { + "title": "Prober Pool Member Order", + "description": "Specifies the order in which this server appears in the prober pool", + "type": "integer", + "default": 0, + "minimum": 0, + "maximum": 65535 + } + } + }, + "GSLB_Topology_Records": { + "title": "GSLB_Topology_Records", + "description": "Defines GSLB Topology records", + "type": "object", + "properties": { + "label": { + "$ref": "#/definitions/Label" + }, + "class": { + "title": "Class", + "type": "string", + "const": "GSLB_Topology_Records" + }, + "longestMatchEnabled": { + "title": "Longest Match Algorithm Enabled", + "description": "Enables the algorithm that requires the system to evaluate all records in the topology statement and use the record that most completely matches the source IP address of the name resolution request. If true, the order of the records as they appear in the array will not be preserved", + "type": "boolean", + "default": true + }, + "records": { + "title": "Record List", + "description": "Specifies the actual device(s) that are represented by this server object", + "type": "array", + "items": { + "$ref": "#/definitions/GSLB_Topology_Record" + }, + "minItems": 1 + } + }, + "required": [ + "class", + "records" + ] + }, + "GSLB_Topology_Record": { + "type": "object", + "properties": { + "source": { + "title": "Request Source", + "description": "Specifies the origination section of the topology record, the local DNS", + "allOf": [ + { + "$ref": "#/definitions/GSLB_Topology_Condition" + } + ] + }, + "destination": { + "title": "Request Destination", + "description": "Specifies where the system directs the incoming DNS request", + "allOf": [ + { + "$ref": "#/definitions/GSLB_Topology_Condition" + } + ] + }, + "weight": { + "title": "Record Weight", + "description": "Specifies the weight for the topology record. The system load balances to the server object and DNS that matches the record with the highest topology weight", + "type": "integer", + "default": 1, + "minimum": 0, + "maximum": 4294967295 + } + }, + "allOf": [ + { + "not": { + "properties": { + "source": { + "properties": { + "matchType": { + "const": "pool" + } + } + } + } + } + }, + { + "not": { + "properties": { + "source": { + "properties": { + "matchType": { + "const": "datacenter" + } + } + } + } + } + } + ], + "required": [ + "source", + "destination" + ] + }, + "GSLB_Topology_Region": { + "title": "GSLB_Topology_Region", + "description": "Defines a GSLB Topology region", + "type": "object", + "properties": { + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "class": { + "title": "Class", + "type": "string", + "const": "GSLB_Topology_Region" + }, + "members": { + "title": "Region Member List", + "description": "Configures the list of members for this region", + "type": "array", + "items": { + "$ref": "#/definitions/GSLB_Topology_Condition" + } + } + }, + "required": [ + "class" + ] + }, + "GSLB_Topology_Condition": { + "type": "object", + "properties": { + "matchType": { + "title": "Match Type", + "description": "Specifies the type/category of match to perform", + "type": "string", + "enum": [ + "continent", + "country", + "datacenter", + "geoip-isp", + "isp", + "pool", + "region", + "state", + "subnet" + ] + }, + "matchOperator": { + "title": "Match Operator", + "description": "Specifies the operation to perform a match. Default value is equals (matches)", + "type": "string", + "enum": [ + "equals", + "not-equals" + ], + "default": "equals" + }, + "matchValue": { + "title": "Match Value", + "description": "Specifies the value to match", + "type": [ + "string", + "object" + ] + } + }, + "allOf": [ + { + "if": { + "properties": { + "matchType": { + "const": "continent" + } + } + }, + "then": { + "properties": { + "matchValue": { + "$ref": "#/definitions/Enum_Continent_Code_Alpha_2" + } + } + } + }, + { + "if": { + "properties": { + "matchType": { + "const": "country" + } + } + }, + "then": { + "properties": { + "matchValue": { + "$ref": "#/definitions/Enum_Country_Code_Alpha_2" + } + } + } + }, + { + "if": { + "properties": { + "matchType": { + "const": "datacenter" + } + } + }, + "then": { + "properties": { + "matchValue": { + "$ref": "#/definitions/Pointer_GSLB_Data_Center" + } + } + } + }, + { + "if": { + "properties": { + "matchType": { + "const": "geoip-isp" + } + } + }, + "then": { + "properties": { + "matchValue": { + "type": "string" + } + } + } + }, + { + "if": { + "properties": { + "matchType": { + "const": "isp" + } + } + }, + "then": { + "properties": { + "matchValue": { + "$ref": "#/definitions/Enum_ISP" + } + } + } + }, + { + "if": { + "properties": { + "matchType": { + "const": "pool" + } + } + }, + "then": { + "properties": { + "matchValue": { + "$ref": "#/definitions/Pointer_GSLB_Pool" + } + } + } + }, + { + "if": { + "properties": { + "matchType": { + "const": "region" + } + } + }, + "then": { + "properties": { + "matchValue": { + "$ref": "#/definitions/Pointer_GSLB_Topology_Region" + } + } + } + }, + { + "if": { + "properties": { + "matchType": { + "const": "state" + } + } + }, + "then": { + "properties": { + "matchValue": { + "description": "State value in the format /, for example: US/Washington", + "type": "string", + "minLength": 4 + } + } + } + }, + { + "if": { + "properties": { + "matchType": { + "const": "subnet" + } + } + }, + "then": { + "properties": { + "matchValue": { + "type": "string", + "format": "f5ip" + } + } + } + } + ], + "required": [ + "matchType", + "matchValue" + ] + }, + "GSLB_Pool_A": { + "description": "Pointer to a Pool A object", + "allOf": [ + { + "$ref": "#/definitions/GSLB_Pool" + } + ] + }, + "GSLB_Pool_AAAA": { + "description": "Pointer to a Pool AAAA object", + "allOf": [ + { + "$ref": "#/definitions/GSLB_Pool" + } + ] + }, + "GSLB_Pool_CNAME": { + "description": "Pointer to a Pool CNAME object", + "allOf": [ + { + "$ref": "#/definitions/GSLB_Pool" + } + ] + }, + "GSLB_Pool_MX": { + "description": "Pointer to a Pool MX object", + "allOf": [ + { + "$ref": "#/definitions/GSLB_Pool" + } + ] + }, + "ALG_Log_Profile": { + "type": "object", + "title": "ALG_Log_Profile", + "description": "Configures an application layer gateway log profle", + "f5PostProcess": { + "tag": "modules", + "data": [ + "cgnat" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "ALG_Log_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "csvFormat": { + "description": "Generate entries in comma-separated-values (csv) format", + "type": "boolean", + "default": false + }, + "startControlChannel": { + "description": "Event for start of control channel connection", + "type": "object", + "properties": { + "action": { + "description": "Specify the logging action to be taken when a particular event is encountered. If 'enabled' logging is enabled for the event, regardless of how the flow is created. If 'disabled' logging is disabled for the event. If 'backup-allocation-only' logging is enabled for the event when the ALG is proxy with a LSN, and translation is taken from the backup pool member only.", + "type": "string", + "enum": [ + "enabled", + "disabled", + "backup-allocation-only" + ], + "default": "disabled" + }, + "includeDestination": { + "description": "Include destination address/port in the log message", + "type": "boolean", + "default": false + } + }, + "default": { + "action": "disabled", + "includeDestination": false + }, + "additionalProperties": false + }, + "endControlChannel": { + "description": "Event for end of control channel connection", + "type": "object", + "properties": { + "action": { + "description": "Specify the logging action to be taken when a particular event is encountered. If 'enabled' logging is enabled for the event, regardless of how the flow is created. If 'disabled' logging is disabled for the event. If 'backup-allocation-only' logging is enabled for the event when the ALG is proxy with a LSN, and translation is taken from the backup pool member only.", + "type": "string", + "enum": [ + "enabled", + "disabled", + "backup-allocation-only" + ], + "default": "enabled" + }, + "includeDestination": { + "description": "Include destination address/port in the log message", + "type": "boolean", + "default": false + } + }, + "default": { + "action": "enabled", + "includeDestination": false + }, + "additionalProperties": false + }, + "startDataChannel": { + "description": "Event for start of data channel connection", + "type": "object", + "properties": { + "action": { + "description": "Specify the logging action to be taken when a particular event is encountered. If 'enabled' logging is enabled for the event, regardless of how the flow is created. If 'disabled' logging is disabled for the event. If 'backup-allocation-only' logging is enabled for the event when the ALG is proxy with a LSN, and translation is taken from the backup pool member only.", + "type": "string", + "enum": [ + "enabled", + "disabled", + "backup-allocation-only" + ], + "default": "disabled" + }, + "includeDestination": { + "description": "Include destination address/port in the log message", + "type": "boolean", + "default": false + } + }, + "default": { + "action": "disabled", + "includeDestination": false + }, + "additionalProperties": false + }, + "endDataChannel": { + "description": "Event for end of data channel connection", + "type": "object", + "properties": { + "action": { + "description": "Specify the logging action to be taken when a particular event is encountered. If 'enabled' logging is enabled for the event, regardless of how the flow is created. If 'disabled' logging is disabled for the event. If 'backup-allocation-only' logging is enabled for the event when the ALG is proxy with a LSN, and translation is taken from the backup pool member only.", + "type": "string", + "enum": [ + "enabled", + "disabled", + "backup-allocation-only" + ], + "default": "enabled" + }, + "includeDestination": { + "description": "Include destination address/port in the log message", + "type": "boolean", + "default": false + } + }, + "default": { + "action": "enabled", + "includeDestination": false + }, + "additionalProperties": false + }, + "inboundTransaction": { + "description": "Generates event log entries of SIP messages. Triggered by inbound connection to the BIG-IP system", + "type": "object", + "properties": { + "action": { + "description": "Specify the logging action to be taken when a particular event is encountered. If 'enabled' logging is enabled for the event, regardless of how the flow is created. If 'disabled' logging is disabled for the event. Inbound transaction log entry could contain both incoming and outgoing messages.", + "type": "string", + "enum": [ + "enabled", + "disabled" + ], + "default": "disabled" + } + }, + "default": { + "action": "disabled" + } + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "Security_Log_Profile": { + "type": "object", + "title": "Security_Log_Profile", + "description": "Configures a Security log profile", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm", + "asm" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Security_Log_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "application": { + "$ref": "#/definitions/Security_Log_Profile_Application" + }, + "botDefense": { + "$ref": "#/definitions/Security_Log_Profile_Bot_Defense" + }, + "classification": { + "$ref": "#/definitions/Security_Log_Profile_Classification" + }, + "dosApplication": { + "$ref": "#/definitions/Security_Log_Profile_Dos_Application" + }, + "dosNetwork": { + "$ref": "#/definitions/Security_Log_Profile_Dos_Network" + }, + "ipIntelligence": { + "$ref": "#/definitions/Security_Log_Profile_Ip_Intelligence" + }, + "nat": { + "$ref": "#/definitions/Security_Log_Profile_Nat" + }, + "network": { + "$ref": "#/definitions/Security_Log_Profile_Network" + }, + "protocolDns": { + "$ref": "#/definitions/Security_Log_Profile_Protocol_Dns" + }, + "protocolDnsDos": { + "$ref": "#/definitions/Security_Log_Profile_Protocol_Dns_Dos" + }, + "protocolInspection": { + "$ref": "#/definitions/Security_Log_Profile_Protocol_Inspection" + }, + "protocolSip": { + "$ref": "#/definitions/Security_Log_Profile_Protocol_Sip" + }, + "protocolSipDos": { + "$ref": "#/definitions/Security_Log_Profile_Protocol_Sip_Dos" + }, + "protocolTransfer": { + "$ref": "#/definitions/Security_Log_Profile_Protocol_Transfer" + }, + "sshProxy": { + "$ref": "#/definitions/Security_Log_Profile_Ssh_Proxy" + } + }, + "required": [ + "class" + ], + "dependencies": { + "application": { + "not": { + "oneOf": [ + { + "required": [ + "protocolDns" + ] + }, + { + "required": [ + "protocolSip" + ] + }, + { + "required": [ + "sshProxy" + ] + } + ] + } + }, + "protocolDns": { + "not": { + "required": [ + "application" + ] + } + }, + "protocolSip": { + "not": { + "required": [ + "application" + ] + } + }, + "sshProxy": { + "not": { + "required": [ + "application" + ] + } + } + } + }, + "Security_Log_Profile_Application": { + "description": "When enabled, specifies the system logs events from applications.", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "asm" + ] + }, + "properties": { + "facility": { + "description": "Specifies the facility category of the logged traffic", + "type": "string", + "enum": [ + "local0", + "local1", + "local2", + "local3", + "local4", + "local5", + "local6", + "local7" + ], + "default": "local0" + }, + "storageFilter": { + "description": "Adds, deletes, or replaces a set of request filters", + "type": "object", + "properties": { + "logicalOperation": { + "description": "Specifies the logical operation on associated filters", + "type": "string", + "enum": [ + "and", + "or" + ], + "default": "or" + }, + "requestType": { + "description": "Specifies which kind of requests the system or server will log", + "type": "string", + "enum": [ + "all", + "illegal", + "illegal-including-staged-signatures" + ], + "default": "illegal" + }, + "protocols": { + "description": "Specifies if request logging is dependent on the protocols", + "type": "array", + "items": { + "type": "string", + "enum": [ + "http", + "https", + "ws", + "wss" + ] + } + }, + "responseCodes": { + "description": "Specifies whether request logging is dependent on the response status codes", + "type": "array", + "items": { + "type": "string", + "enum": [ + "100", + "101", + "102", + "200", + "201", + "202", + "203", + "204", + "205", + "206", + "207", + "300", + "301", + "302", + "303", + "304", + "305", + "306", + "307", + "400", + "401", + "402", + "403", + "404", + "405", + "406", + "407", + "408", + "409", + "410", + "411", + "412", + "413", + "414", + "415", + "416", + "417", + "422", + "423", + "424", + "500", + "501", + "502", + "503", + "504", + "505", + "507", + "510" + ] + } + }, + "httpMethods": { + "description": "Specifies whether request logging is dependent on the HTTP methods", + "type": "array", + "items": { + "type": "string", + "enum": [ + "ACL", + "BDELETE", + "BMOVE", + "BPROPFIND", + "BPROPPATCH", + "CHECKIN", + "CHECKOUT", + "CONNECT", + "COPY", + "DELETE", + "GET", + "HEAD", + "LINK", + "LOCK", + "MERGE", + "MKCOL", + "MKWORKSPACE", + "MOVE", + "NOTIFY", + "OPTIONS", + "PATCH", + "POLL", + "POST", + "PROPFIND", + "PROPPATCH", + "PUT", + "REPORT", + "RPC_IN_DATA", + "RPC_OUT_DATA", + "SEARCH", + "SUBSCRIBE", + "TRACE", + "TRACK", + "UNLINK", + "UNLOCK", + "UNSUBSCRIBE", + "VERSION_CONTROL", + "X-MS-ENUMATTS" + ] + } + }, + "requestContains": { + "description": "Specifies whether the request logging is dependent on s specific string and where to look for that string", + "type": "object", + "properties": { + "searchIn": { + "description": "Where to look for the specified string", + "type": "string", + "enum": [ + "search-in-headers", + "search-in-post-data", + "search-in-query-string", + "search-in-request", + "search-in-uri" + ] + }, + "value": { + "description": "The specified string to look for", + "type": "string", + "minLength": 1 + } + }, + "required": [ + "searchIn", + "value" + ], + "additionalProperties": false + }, + "loginResults": { + "description": "Specifies whether the request logging is dependent on the login results", + "type": "array", + "items": { + "type": "string", + "enum": [ + "login-result-successful", + "login-result-failed", + "login-result-unknown" + ] + } + } + }, + "default": {}, + "additionalProperties": false + }, + "storageFormat": { + "description": "Specifies a storage format", + "anyOf": [ + { + "description": "Specifies a user string", + "type": "string", + "minLength": 1 + }, + { + "type": "object", + "properties": { + "fields": { + "description": "Replaces a set of fields when predefined storage format. Order is important - the server will display the selected items in the log sequentially according to this", + "type": "array", + "items": { + "type": "string", + "enum": [ + "attack_type", + "avr_id", + "blocking_exception_reason", + "captcha_result", + "client_type", + "date_time", + "dest_ip", + "dest_port", + "device_id", + "fragment", + "geo_location", + "headers", + "http_class_name", + "ip_address_intelligence", + "ip_client", + "ip_with_route_domain", + "is_truncated", + "logic_result", + "management_ip_address", + "management_ip_address_2", + "method", + "mobile_application_name", + "mobile_application_version", + "password", + "policy_apply_date", + "policy_name", + "protocol", + "query_string", + "request", + "request_status", + "response", + "response_code", + "route_domain", + "salt", + "session_id", + "severity", + "sig_ids", + "sig_names", + "sig_set_names", + "slot_number", + "src_port", + "staged_sig_names", + "staged_sig_set_names", + "staged_threat_campaign_names", + "sub_violations", + "support_id", + "threat_campaign_names", + "unit_hostname", + "uri", + "username", + "violation_details", + "violation_rating", + "violations", + "virus_name", + "websocket_direction", + "websocket_message_type", + "x_forwarded_for_header_value" + ] + } + }, + "delimiter": { + "description": "Specifies a delimiter when predefined storage format", + "type": "string", + "default": ",", + "minLength": 1 + } + }, + "required": [ + "fields" + ], + "additionalProperties": false + } + ] + }, + "guaranteeLoggingEnabled": { + "description": "Indicates whether to guarantee local logging", + "type": "boolean", + "default": false + }, + "guaranteeResponseLoggingEnabled": { + "description": "Indicates whether to guarantee local response logging. guaranteeLoggingEnabled must be true and responseLogging must be illegal or all", + "type": "boolean", + "default": false + }, + "localStorage": { + "description": "Enables or disabled local storage", + "type": "boolean", + "default": true + }, + "maxEntryLength": { + "description": "Specifies the maximum entry length", + "type": "string", + "enum": [ + "1k", + "2k", + "10k", + "64k" + ], + "default": "2k" + }, + "maxHeaderSize": { + "description": "Specifies the maximum headers size", + "type": "integer", + "minimum": 1, + "maximum": 2048 + }, + "maxQuerySize": { + "description": "Specifies the maximum query string size", + "type": "integer", + "minimum": 1, + "maximum": 2048 + }, + "maxRequestSize": { + "description": "Specifies the maximum request size", + "type": "integer", + "minimum": 1, + "maximum": 2048 + }, + "protocol": { + "description": "Specifies the protocol supported by the remote server", + "type": "string", + "enum": [ + "udp", + "tcp", + "tcp-rfc3195" + ], + "default": "tcp" + }, + "remoteStorage": { + "description": "Specifies a remote storage type", + "type": "string", + "enum": [ + "remote", + "splunk", + "arcsight", + "bigiq" + ] + }, + "reportAnomaliesEnabled": { + "description": "Indicates whether to report detected anomalies", + "type": "boolean", + "default": false + }, + "responseLogging": { + "description": "Specifies a response logging type", + "type": "string", + "enum": [ + "none", + "illegal", + "all" + ], + "default": "none" + }, + "servers": { + "description": "Adds, deletes, or replaces a set of remote servers", + "type": "array", + "items": { + "type": "object", + "properties": { + "address": { + "description": "The IP address", + "type": "string" + }, + "port": { + "description": "The service port", + "type": "string" + } + }, + "required": [ + "address", + "port" + ], + "additionalProperties": false + } + } + }, + "additionalProperties": false + }, + "Security_Log_Profile_Bot_Defense": { + "title": "Bot Defense Log Profile", + "description": "Specifies, when enabled, the system logs events from the Proactive Bot Defense mechanism.", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "asm" + ] + }, + "properties": { + "localPublisher": { + "description": "Specifies, when enabled, a Log Publisher to log events to (Note: This publisher should have a single local-database destination)", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Log_Publisher" + } + ] + }, + "remotePublisher": { + "description": "Enables selecting a Log Publisher that has Splunk enabled", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Log_Publisher" + } + ] + }, + "logBotSignatureMatchedRequests": { + "description": "This option enables or disables the logging of reported bot signature requests", + "type": "boolean", + "default": false + }, + "logCaptchaChallengedRequests": { + "description": "This option enables or disables the logging of captcha challenged requests", + "type": "boolean", + "default": false + }, + "logChallengedRequests": { + "description": "This option enables or disables the logging of challenged requests", + "type": "boolean", + "default": false + }, + "logIllegalRequests": { + "description": "This option enables or disables the logging of illegal requests", + "type": "boolean", + "default": true + }, + "logLegalRequests": { + "description": "This option enables or disables the logging of legal requests", + "type": "boolean", + "default": false + }, + "logAlarm": { + "description": "This option enables or disables the logging of requests with alarm mitigation. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + }, + "logBlock": { + "description": "This option enables or disables the logging of requests with block mitigation. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + }, + "logBrowser": { + "description": "This option enables or disables the logging of requests with browser classification. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + }, + "logBrowserVerificationAction": { + "description": "This option enables or disables the logging of requests by browser verification action. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + }, + "logCaptcha": { + "description": "This option enables or disables the logging of requests with captcha mitigation. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + }, + "logDeviceIdCollectionRequest": { + "description": "This option enables or disables the logging of requests by device ID collection. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + }, + "logMaliciousBot": { + "description": "This option enables or disables the logging of requests with malicious bot classification. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + }, + "logMobileApplication": { + "description": "This option enables or disables the logging of requests with mobile application classification. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + }, + "logNone": { + "description": "This option enables or disables the logging of requests with no mitigation. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + }, + "logRateLimit": { + "description": "This option enables or disables the logging of requests with rate limit mitigation. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + }, + "logSuspiciousBrowser": { + "description": "This option enables or disables the logging of requests with suspicious browser classification. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + }, + "logTcpReset": { + "description": "This option enables or disables the logging of requests with TCP reset mitigation. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + }, + "logTrustedBot": { + "description": "This option enables or disables the logging of requests with trusted bot classification. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + }, + "logUnknown": { + "description": "This option enables or disables the logging of requests with unknown classification. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": true + }, + "logUntrustedBot": { + "description": "This option enables or disables the logging of requests with untrusted bot classification. This property is available on BIGIP 14.1 and above.", + "type": "boolean", + "default": false + }, + "logHoneyPotPage": { + "description": "This option enables or disables the logging of requests with honey pot page mitigation. This property is available on BIGIP 15.0 and above.", + "type": "boolean", + "default": false + }, + "logRedirectToPool": { + "description": "This option enables or disables the logging of requests with redirect to pool mitigation. This property is available on BIGIP 15.0 and above.", + "type": "boolean", + "default": false + }, + "logChallengeFailureRequest": { + "description": "This option enables or disables the logging of requests by challenge failure. This property is available on BIGIP 15.0 and above.", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + }, + "Security_Log_Profile_Classification": { + "title": "Classification Log Profile", + "description": "Specifies, when enabled, that the system logs events from the Classification engine.", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + }, + "properties": { + "publisher": { + "description": "Specifies where the system sends log messages", + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to log publisher declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Log_Publisher" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP log publisher", + "description": "Pathname of existing BIG-IP log publisher", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys log-config publisher" + ] + } + }, + "logAllMatches": { + "description": "This option enables or disables the logging of all matches", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + }, + "Security_Log_Profile_Dos_Application": { + "title": "DoS Application Log Profile", + "description": "Specifies, when enabled, that the system logs detected application DoS attacks", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "asm" + ] + }, + "properties": { + "localPublisher": { + "description": "Specifies the local log publisher used for Application DoS attacks (Note: This publisher should have a single local-database destination)", + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to log publisher declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Log_Publisher" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP log publisher", + "description": "Pathname of existing BIG-IP log publisher", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys log-config publisher" + ] + } + }, + "remotePublisher": { + "description": "Specifies the remote log publisher used for Application DoS attacks (Note: This publisher should have ArcSight or Splunk destinations)", + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to log publisher declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Log_Publisher" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP log publisher", + "description": "Pathname of existing BIG-IP log publisher", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys log-config publisher" + ] + } + } + }, + "additionalProperties": false + }, + "Security_Log_Profile_Dos_Network": { + "title": "DoS Network Log Profile", + "description": "Specifies, when enabled, that the system logs detected network DoS attacks", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm", + "dos", + "em" + ] + }, + "properties": { + "publisher": { + "description": "Specifies the name of the log publisher used for logging Network DoS events", + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to log publisher declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Log_Publisher" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP log publisher", + "description": "Pathname of existing BIG-IP log publisher", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys log-config publisher" + ] + } + } + }, + "additionalProperties": false + }, + "Security_Log_Profile_Nat": { + "title": "Network Address Translation Log Profile", + "description": "Specifies, when enabled, that the system logs Firewall NAT events", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm" + ] + }, + "properties": { + "publisher": { + "description": "Specifies the name of the log publisher used for logging Network Address Translation events", + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to log publisher declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Log_Publisher" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP log publisher", + "description": "Pathname of existing BIG-IP log publisher", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys log-config publisher" + ] + } + }, + "logErrors": { + "description": "Generates event log entries when a NAT translation errors occur", + "type": "boolean", + "default": false + }, + "logSubscriberId": { + "description": "Logs the subscriber ID associated with a subscriber IP address", + "type": "boolean", + "default": false + }, + "logQuotaExceeded": { + "description": "Generates event log entries when a NAT client exceeds allocated resources", + "type": "boolean", + "default": false + }, + "logStartInboundSession": { + "description": "Generates event log entries at the start of the incoming connection event for a translated endpoint. Triggered when the system creates the inbound session.", + "type": "boolean", + "default": false + }, + "logEndInboundSession": { + "description": "Generates event log entries at the end of the incoming connection event for a translated endpoint. Triggered when the system frees the inbound session.", + "type": "boolean", + "default": false + }, + "logStartOutboundSession": { + "description": "Generates event log entries at start of the translation event for a NAT client. Triggered when the system creates the outbound session.", + "type": "boolean", + "default": false + }, + "logStartOutboundSessionDestination": { + "description": "Include destination address and port with log entry for the start of the translation event for a NAT client. This is applicable only if lsn-legacy-mode is enabled", + "type": "boolean", + "default": false + }, + "logEndOutboundSession": { + "description": "Generates event log entries at end of translation event for a NAT client. Triggered when the system frees the outbound session.", + "type": "boolean", + "default": false + }, + "logEndOutboundSessionDestination": { + "description": "Include destination address and port with log entry for the end of the translation event for a NAT client. This is applicable only if lsn-legacy-mode is enabled", + "type": "boolean", + "default": false + }, + "lsnLegacyMode": { + "description": "This option specifies whether translation events (and other NAT events) are logged in existing CGNAT/LSN formats (for backward compatibility with LSN events).", + "type": "boolean", + "default": false + }, + "rateLimitAggregate": { + "description": " This option sets the aggregate rate for all the Firewall NAT log events that the system can log per second", + "type": "integer", + "default": 4294967295 + }, + "rateLimitErrors": { + "description": "This option rate limits the errors the system logs per second", + "type": "integer", + "default": 4294967295 + }, + "rateLimitQuotaExceeded": { + "description": "This option rate limits the quota exceeded log events per second", + "type": "integer", + "default": 4294967295 + }, + "rateLimitStartInboundSession": { + "description": "This option rate limits the start inbound session log events per second", + "type": "integer", + "default": 4294967295 + }, + "rateLimitEndInboundSession": { + "description": "This option rate limits the end inbound session log events per second", + "type": "integer", + "default": 4294967295 + }, + "rateLimitStartOutboundSession": { + "description": "This option rate limits the start outbound session log events per second", + "type": "integer", + "default": 4294967295 + }, + "rateLimitEndOutboundSession": { + "description": "This option rate limits the end outbound session log events per second", + "type": "integer", + "default": 4294967295 + }, + "formatErrors": { + "$ref": "#/definitions/Security_Log_Profile_Nat_Storage_Format" + }, + "formatQuotaExceeded": { + "$ref": "#/definitions/Security_Log_Profile_Nat_Storage_Format" + }, + "formatStartInboundSession": { + "$ref": "#/definitions/Security_Log_Profile_Nat_Storage_Format" + }, + "formatEndInboundSession": { + "$ref": "#/definitions/Security_Log_Profile_Nat_Storage_Format" + }, + "formatStartOutboundSession": { + "$ref": "#/definitions/Security_Log_Profile_Nat_Storage_Format" + }, + "formatEndOutboundSession": { + "$ref": "#/definitions/Security_Log_Profile_Nat_Storage_Format" + } + }, + "required": [ + "publisher" + ], + "additionalProperties": false, + "dependencies": { + "logStartOutboundSessionDestination": { + "if": { + "properties": { + "logStartOutboundSessionDestination": { + "const": true + } + } + }, + "then": { + "properties": { + "logStartOutboundSession": { + "const": true + } + } + } + }, + "logEndOutboundSessionDestination": { + "if": { + "properties": { + "logEndOutboundSessionDestination": { + "const": true + } + } + }, + "then": { + "properties": { + "logEndOutboundSession": { + "const": true + } + } + } + } + } + }, + "Security_Log_Profile_Nat_Storage_Format": { + "description": "Specifies the format type for log messages", + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "object", + "properties": { + "fields": { + "description": "Replaces a set of fields in the predefined storage format", + "type": "array", + "items": { + "type": "string", + "enum": [ + "context-name", + "duration", + "route-domain", + "sub-id", + "translated-dest-port", + "translated-src-port", + "dest-ip", + "event-name", + "src-ip", + "timestamp", + "translated-route-domain", + "dest-port", + "protocol", + "src-port", + "translated-dest-ip", + "translated-src-ip" + ] + } + }, + "delimiter": { + "description": "Specifies a field delimiter in the predefined storage format", + "type": "string", + "default": "." + } + }, + "required": [ + "fields" + ], + "additionalProperties": false + } + ] + }, + "Security_Log_Profile_Network": { + "title": "Network Log Profile", + "description": "Specifies, when enabled, that the system logs ACL rule matches, TCP events, and/or TCP/IP errors sent to the network firewall", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm", + "em" + ] + }, + "properties": { + "publisher": { + "description": "Specifies the name of the log publisher used for logging Network events", + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to log publisher declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Log_Publisher" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP log publisher", + "description": "Pathname of existing BIG-IP log publisher", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys log-config publisher" + ] + } + }, + "logRuleMatchAccepts": { + "description": "Specifies, when enabled, that the system logs packets that match ACL rules configured with action = Accept", + "type": "boolean", + "default": false + }, + "logRuleMatchDrops": { + "description": "Specifies, when enabled, that the system logs packets that match ACL rules configured with action = Drop", + "type": "boolean", + "default": false + }, + "logRuleMatchRejects": { + "description": "Specifies, when enabled, that the system logs packets that match ACL rules configured with action = Reject", + "type": "boolean", + "default": false + }, + "logIpErrors": { + "description": "Specifies, when enabled, that the system logs IP error packets", + "type": "boolean", + "default": false + }, + "logTcpErrors": { + "description": "Specifies, when enabled, that the system logs TCP error packets", + "type": "boolean", + "default": false + }, + "logTcpEvents": { + "description": "Specifies, when enabled, that the system logs TCP events (open and close of TCP sessions)", + "type": "boolean", + "default": false + }, + "logTranslationFields": { + "description": "Specifies, when enabled, that the system logs translation values if and when it logs a network firewall event", + "type": "boolean", + "default": false + }, + "alwaysLogRegion": { + "description": "Specifies, when enabled, that when a geolocation event causes a network firewall event, the system logs the associated IP address", + "type": "boolean", + "default": false + }, + "rateLimitRuleMatchAccepts": { + "description": "This option sets rate limits for the logging of packets that match ACL rules configured with action = Accept or action = Accept Decisively", + "type": "integer", + "default": 4294967295 + }, + "rateLimitRuleMatchDrops": { + "description": "This option sets rate limits for the logging of packets that match ACL rules configured with action = Accept or action = Accept Decisively", + "type": "integer", + "default": 4294967295 + }, + "rateLimitRuleMatchRejects": { + "description": "This option sets rate limits for the logging of packets that match ACL rules configured with action = Reject", + "type": "integer", + "default": 4294967295 + }, + "rateLimitIpErrors": { + "description": "This option enables or disables the logging of IP error packets", + "type": "integer", + "default": 4294967295 + }, + "rateLimitTcpErrors": { + "description": "This option sets rate limits for the logging of TCP error packets", + "type": "integer", + "default": 4294967295 + }, + "rateLimitTcpEvents": { + "description": "This option sets rate limits for the logging of TCP events on client side", + "type": "integer", + "default": 4294967295 + }, + "rateLimitAggregate": { + "description": "This option sets the aggregate rate limit that applies to any network logging message", + "type": "integer", + "default": 4294967295 + }, + "storageFormat": { + "description": "Specifies the format type for log messages. If it is a string it is user-defined", + "anyOf": [ + { + "description": "Use this for user-defined storage format", + "type": "string", + "minLength": 1 + }, + { + "type": "object", + "properties": { + "fields": { + "description": "Replaces a set of fields in the predefined storage format", + "type": "array", + "items": { + "type": "string", + "enum": [ + "acl-policy-name", + "acl-policy-type", + "acl-rule-name", + "action", + "bigip-hostname", + "context-name", + "context-type", + "date-time", + "dest-ip", + "dest-port", + "drop-reason", + "management-ip-address", + "protocol", + "route-domain", + "sa-translation-pool", + "sa-translation-type", + "src-ip", + "src-port", + "translated-dest-ip", + "translated-dest-port", + "translated-ip-protocol", + "translated-route-domain", + "translated-src-ip", + "translated-src-port", + "translated-vlan", + "vlan" + ] + } + }, + "delimiter": { + "description": "Specifies a field delimiter in the predefined storage format", + "type": "string", + "default": "." + } + }, + "required": [ + "fields" + ], + "additionalProperties": false + } + ] + } + }, + "additionalProperties": false + }, + "Security_Log_Profile_Ip_Intelligence": { + "title": "IP Intelligence Log Profile", + "description": "Specifies, when enabled, that the system logs IP Intelligence events", + "type": "object", + "properties": { + "publisher": { + "description": "Specifies the name of the log publisher used for logging IP Intelligence events", + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to log publisher declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Log_Publisher" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP log publisher", + "description": "Pathname of existing BIG-IP log publisher", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys log-config publisher" + ] + } + }, + "logTranslationFields": { + "description": "Specifies, when enabled, that the system logs translation values if and when it logs a network firewall event", + "type": "boolean", + "default": false + }, + "rateLimitAggregate": { + "description": "Defines a rate limit for all combined IP intelligence log messages per second", + "type": "integer", + "default": 4294967295 + } + }, + "additionalProperties": false + }, + "Security_Log_Profile_Protocol_Dns": { + "title": "Protocol DNS Log Profile", + "description": "Specifies, when enabled, that the system logs DNS security events", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm", + "em" + ] + }, + "properties": { + "publisher": { + "description": "Specifies the name of the log publisher used for logging DNS security events", + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to log publisher declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Log_Publisher" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP log publisher", + "description": "Pathname of existing BIG-IP log publisher", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys log-config publisher" + ] + } + }, + "logDroppedRequests": { + "description": "Specifies, when enabled, that the system logs dropped DNS requests", + "type": "boolean", + "default": false + }, + "logFilteredDroppedRequests": { + "description": "Specifies, when enabled, that the system logs DNS requests dropped due to DNS query/header-opcode filtering. The system does not log DNS requests dropped due to errors in the way the system processes DNS packets.", + "type": "boolean", + "default": false + }, + "logMalformedRequests": { + "description": "Specifies, when enabled, that the system logs malformed DNS requests", + "type": "boolean", + "default": false + }, + "logRejectedRequests": { + "description": "Specifies, when enabled, that the system logs rejected DNS requests", + "type": "boolean", + "default": false + }, + "logMaliciousRequests": { + "description": "Specifies, when enabled, that the system logs malicious DNS requests", + "type": "boolean", + "default": false + }, + "storageFormat": { + "description": "Specifies the format type for log messages", + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "object", + "properties": { + "fields": { + "description": "Replaces a set of fields in the predefined storage format", + "type": "array", + "items": { + "type": "string", + "enum": [ + "action", + "attack-type", + "context-name", + "date-time", + "dest-ip", + "dest-port", + "dns-query-name", + "dns-query-type", + "src-ip", + "src-port", + "vlan", + "route-domain" + ] + } + }, + "delimiter": { + "description": "Specifies a field delimiter in the predefined storage format", + "type": "string", + "default": "." + } + }, + "required": [ + "fields" + ], + "additionalProperties": false + } + ] + } + }, + "additionalProperties": false + }, + "Security_Log_Profile_Protocol_Sip_Dos": { + "title": "Protocol SIP DoS Log Profile", + "description": "Specifies, when enabled, that the system logs detected SIP DoS attacks", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm", + "em" + ] + }, + "properties": { + "publisher": { + "description": "Specifies the name of the log publisher used for logging SIP DoS events", + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to log publisher declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Log_Publisher" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP log publisher", + "description": "Pathname of existing BIG-IP log publisher", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys log-config publisher" + ] + } + } + }, + "additionalProperties": false + }, + "Security_Log_Profile_Protocol_Sip": { + "title": "Protocol SIP Log Profile", + "description": "Specifies, when enabled, that the system logs SIP protocol security events", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm", + "em" + ] + }, + "properties": { + "publisher": { + "description": "Specifies the name of the log publisher used for logging SIP protocol security events", + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to log publisher declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Log_Publisher" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP log publisher", + "description": "Pathname of existing BIG-IP log publisher", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys log-config publisher" + ] + } + }, + "logDroppedRequests": { + "description": "Specifies, when enabled, that the system logs dropped requests", + "type": "boolean", + "default": false + }, + "logGlobalFailures": { + "description": "Specifies, when enabled, that the system logs global failures", + "type": "boolean", + "default": false + }, + "logMalformedRequests": { + "description": "Specifies, when enabled, that the system logs malformed requests", + "type": "boolean", + "default": false + }, + "logRedirectedResponses": { + "description": "Specifies, when enabled, that the system logs redirection responses", + "type": "boolean", + "default": false + }, + "logRequestFailures": { + "description": "Specifies, when enabled, that the system logs request failures", + "type": "boolean", + "default": false + }, + "logServerErrors": { + "description": "Specifies, when enabled, that the system logs server errors", + "type": "boolean", + "default": false + }, + "storageFormat": { + "description": "Specifies the format type for log messages", + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "object", + "properties": { + "fields": { + "description": "Replaces a set of fields in the predefined storage format", + "type": "array", + "items": { + "type": "string", + "enum": [ + "action", + "context-name", + "date-time", + "dest-ip", + "dest-port", + "sip-method-type", + "sip-caller", + "sip-callee", + "src-ip", + "src-port", + "vlan", + "route-domain" + ] + } + }, + "delimiter": { + "description": "Specifies a field delimiter in the predefined storage format", + "type": "string", + "default": "." + } + }, + "required": [ + "fields" + ], + "additionalProperties": false + } + ] + } + }, + "additionalProperties": false + }, + "Security_Log_Profile_Protocol_Dns_Dos": { + "title": "Protocol DNS DoS Log Profile", + "description": "Specifies, when enabled, that the system logs detected DNS DoS attacks", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm", + "em" + ] + }, + "properties": { + "publisher": { + "description": "Specifies the name of the log publisher used for logging DNS DoS events", + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to log publisher declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Log_Publisher" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP log publisher", + "description": "Pathname of existing BIG-IP log publisher", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys log-config publisher" + ] + } + } + }, + "additionalProperties": false + }, + "Security_Log_Profile_Protocol_Inspection": { + "title": "Protocol Inspection Log Profile", + "description": "Specifies, when enabled, that the system logs events from the Protocol Inspection engine", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm", + "em" + ] + }, + "properties": { + "publisher": { + "$ref": "#/definitions/Pointer_Log_Publisher" + }, + "logPacketPayloadEnabled": { + "description": "Enable logging of the packet payload for Protocol Inspection events", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + }, + "Security_Log_Profile_Protocol_Transfer": { + "title": "Protocol Transfer Log Profile", + "description": "Specifies, when enabled, that the system logs HTTP, FTP, and SMTP protocol security events", + "type": "object", + "properties": { + "publisher": { + "description": "Specifies where the system sends log messages", + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to log publisher declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Log_Publisher" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP log publisher", + "description": "Pathname of existing BIG-IP log publisher", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys log-config publisher" + ] + } + } + }, + "additionalProperties": false + }, + "Security_Log_Profile_Ssh_Proxy": { + "title": "SSH Proxy Security Log Profile", + "description": "Specifies, when enabled, that the system logs SSH Proxy events", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "afm", + "em" + ] + }, + "properties": { + "publisher": { + "description": "Specifies the name of the log publisher used for logging SSH Proxy events", + "type": "object", + "properties": { + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to log publisher declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Log_Publisher" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "title": "BIG-IP log publisher", + "description": "Pathname of existing BIG-IP log publisher", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys log-config publisher" + ] + } + }, + "logClientAuthFail": { + "description": "Specifies the name of the log publisher used for logging SSH Proxy events", + "type": "boolean", + "default": false + }, + "logClientAuthSuccess": { + "description": "Specifies, when enabled, that the system logs client auth success events", + "type": "boolean", + "default": false + }, + "logClientAuthPartial": { + "description": "Specifies, when enabled, that the system logs client auth partial events", + "type": "boolean", + "default": false + }, + "logServerAuthFail": { + "description": "Specifies, when enabled, that the system logs server auth failure events", + "type": "boolean", + "default": false + }, + "logServerAuthSuccess": { + "description": "Specifies, when enabled, that the system logs server auth failure events", + "type": "boolean", + "default": false + }, + "logServerAuthPartial": { + "description": "Specifies, when enabled, that the system logs server auth partial events", + "type": "boolean", + "default": false + }, + "logDisallowedChannelAction": { + "description": "Specifies, when enabled, that the system logs disallowed channel actions", + "type": "boolean", + "default": false + }, + "logAllowedChannelAction": { + "description": "Specifies, when enabled, that the system logs allowed channel actions", + "type": "boolean", + "default": false + }, + "logSshTimeout": { + "description": "Specifies, when enabled, that the system logs SSH timeouts", + "type": "boolean", + "default": false + }, + "logNonSshTraffic": { + "description": "Specifies, when enabled, that the system logs non-SSH traffic events", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + }, + "Traffic_Log_Profile": { + "title": "Traffic_Log_Profile", + "description": "A traffic log profile", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Traffic_Log_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "parentProfile": { + "description": "Specifies the name of the object to inherit the settings from", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Traffic_Log_Profile" + } + ], + "default": { + "bigip": "/Common/request-log" + } + }, + "requestSettings": { + "description": "The request settings for the profile", + "allOf": [ + { + "$ref": "#/definitions/Traffic_Log_Profile_Request_Settings" + } + ], + "default": {} + }, + "responseSettings": { + "description": "The response settings for the profile", + "allOf": [ + { + "$ref": "#/definitions/Traffic_Log_Profile_Response_Settings" + } + ], + "default": {} + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "Traffic_Log_Profile_Response_Settings": { + "description": "A traffic log profiles response settings", + "type": "object", + "properties": { + "byDefaultEnabled": { + "description": "Default response action and if response logging can be overridden by iRule", + "type": "boolean", + "default": true + }, + "responseErrorLoggingEnabled": { + "description": "Enable secondary logging if insufficient bandwidth for primary. Best used to send an alert to a separate destination", + "type": "boolean", + "default": false + }, + "responseErrorPool": { + "description": "Specifies the name of the pool from which to select log servers", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Pool" + } + ] + }, + "responseErrorProtocol": { + "description": "Specifies the HighSpeedLogging protocol to use when logging", + "type": "string", + "enum": [ + "mds-tcp", + "mds-udp" + ], + "default": "mds-udp" + }, + "responseErrorTemplate": { + "description": "Template to use when generating log messages", + "type": "string" + }, + "responsePool": { + "description": "Specifies the name of the pool from which to select log servers", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Pool" + } + ] + }, + "responseProtocol": { + "description": "Specifies the HighSpeedLogging protocol to use when logging", + "type": "string", + "enum": [ + "mds-tcp", + "mds-udp" + ], + "default": "mds-udp" + }, + "responseTemplate": { + "description": "Template to use when generating log messages", + "type": "string" + }, + "responseEnabled": { + "description": "Enables or disables logging before the response is returned to the client", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + }, + "Traffic_Log_Profile_Request_Settings": { + "description": "A traffic log profiles request settings", + "type": "object", + "properties": { + "requestErrorLoggingEnabled": { + "description": "Enable secondary logging if insufficient bandwidth for primary. Best used to send an alert to a separate destination", + "type": "boolean", + "default": false + }, + "proxyCloseOnErrorEnabled": { + "description": "Specifies, if enabled, that the logging profile will close the connection after sending its proxy-response", + "type": "boolean", + "default": false + }, + "proxyRespondOnLoggingErrorEnabled": { + "description": "Specifies that the logging profile respond directly if the logging fails", + "type": "boolean", + "default": false + }, + "proxyResponse": { + "description": "Specifies the response to send on logging errors", + "type": "string" + }, + "requestErrorPool": { + "description": "Specifies the name of the pool from which to select log servers", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Pool" + } + ] + }, + "requestErrorProtocol": { + "description": "Specifies the HighSpeedLogging protocol to use when logging", + "type": "string", + "enum": [ + "mds-tcp", + "mds-udp" + ], + "default": "mds-udp" + }, + "requestErrorTemplate": { + "description": "Template to use when generating log messages", + "type": "string" + }, + "requestPool": { + "description": "Specifies the name of the pool from which to select log servers", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Pool" + } + ] + }, + "requestProtocol": { + "description": "Specifies the HighSpeedLogging protocol to use when logging", + "type": "string", + "enum": [ + "mds-tcp", + "mds-udp" + ], + "default": "mds-udp" + }, + "requestTemplate": { + "description": "Template to use when generating log messages", + "type": "string" + }, + "requestEnabled": { + "description": "Enables or disables logging before the response is returned to the client", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + }, + "Endpoint_Policy_Rule": { + "title": "Rule", + "description": "A rule for an Endpoint policy that describes actions to perform on traffic matching given conditions", + "type": "object", + "properties": { + "name": { + "title": "Name", + "description": "Name of the endpoint policy rule", + "type": "string", + "pattern": "^[a-zA-Z0-9_\\-.:%]+$", + "maxLength": 64000 + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "conditions": { + "title": "Conditions", + "description": "Specifies the conditions for the rule to apply", + "type": "array", + "items": { + "$ref": "#/definitions/Policy_Condition" + }, + "default": [] + }, + "actions": { + "title": "Actions", + "description": "Specifies the actions for the rule to execute", + "type": "array", + "items": { + "$ref": "#/definitions/Policy_Action" + }, + "default": [] + } + }, + "additionalProperties": false, + "required": [ + "name" + ] + }, + "Endpoint_Policy": { + "title": "Endpoint_Policy", + "description": "Policy to manage connections based on metadata and content", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Endpoint_Policy" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "rules": { + "title": "Rules", + "description": "List of policy rules, order is significant", + "type": "array", + "items": { + "$ref": "#/definitions/Endpoint_Policy_Rule" + } + }, + "strategy": { + "title": "Strategy", + "description": "Rule-matching strategy; value 'custom' means BIG-IP AS3 requires a custom strategy (default is best-match)", + "type": "string", + "enum": [ + "all-match", + "best-match", + "first-match", + "custom" + ], + "default": "best-match" + }, + "customStrategy": { + "title": "Custom strategy", + "description": "BIG-IP AS3 pointer to custom strategy declaration", + "if": { + "type": "string" + }, + "then": { + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Endpoint_Strategy" + } + }, + "required": [ + "class" + ] + } + } + }, + "else": { + "type": "object", + "properties": { + "bigip": { + "title": "BIG-IP LTM strategy", + "description": "Pathname of existing BIG-IP LTM strategy", + "type": "string", + "format": "f5bigip" + } + }, + "required": [ + "bigip" + ], + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm policy-strategy" + ] + } + } + } + }, + "additionalProperties": false, + "dependencies": { + "strategy": { + "if": { + "properties": { + "strategy": { + "const": "custom" + } + } + }, + "then": { + "required": [ + "customStrategy" + ] + } + } + }, + "required": [ + "class" + ] + }, + "Endpoint_Strategy": { + "title": "Endpoint_Strategy", + "description": "Strategy for evaluation of an Endpoint policy", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Endpoint_Strategy" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "matchMethod": { + "title": "Match method", + "description": "Specifies the match method", + "type": "string", + "enum": [ + "all-match", + "best-match", + "first-match" + ] + }, + "operands": { + "title": "Operands", + "description": "Specifies the attribute for the rule to match. Sometimes this represents a specific value (for example, http-method or http-status), but frequently the operand needs a specific Selector to identify an instance (for example, http-header needs a Selectorname parameter).", + "type": "array", + "items": { + "title": "Operand", + "type": "string" + } + } + }, + "additionalProperties": false, + "required": [ + "class", + "matchMethod" + ] + }, + "Policy_Action": { + "type": "object", + "description": "LTM policy action", + "properties": { + "type": { + "description": "Selects the LTM policy action this object describes", + "type": "string", + "enum": [ + "http", + "httpCookie", + "httpHeader", + "httpRedirect", + "httpUri", + "botDefense", + "waf", + "forward", + "drop", + "clientSsl", + "persist", + "tcl", + "log" + ] + } + }, + "allOf": [ + { + "if": { + "properties": { + "type": { + "const": "http" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Action_HTTP" + } + }, + { + "if": { + "properties": { + "type": { + "const": "waf" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Action_WAF" + } + }, + { + "if": { + "properties": { + "type": { + "const": "botDefense" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Action_Bot_Defense" + } + }, + { + "if": { + "properties": { + "type": { + "const": "forward" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Action_Forward" + } + }, + { + "if": { + "properties": { + "type": { + "const": "drop" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Action_Drop" + } + }, + { + "if": { + "properties": { + "type": { + "const": "httpRedirect" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Action_HTTP_Redirect" + } + }, + { + "if": { + "properties": { + "type": { + "const": "httpHeader" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Action_HTTP_Header" + } + }, + { + "if": { + "properties": { + "type": { + "const": "httpUri" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Action_HTTP_URI" + } + }, + { + "if": { + "properties": { + "type": { + "const": "httpCookie" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Action_HTTP_Cookie" + } + }, + { + "if": { + "properties": { + "type": { + "const": "clientSsl" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Action_Client_SSL" + } + }, + { + "if": { + "properties": { + "type": { + "const": "persist" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Action_Persist" + } + }, + { + "if": { + "properties": { + "type": { + "const": "tcl" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Action_TCL" + } + }, + { + "if": { + "properties": { + "type": { + "const": "log" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Action_Log" + } + } + ], + "required": [ + "type" + ] + }, + "Policy_Action_HTTP": { + "type": "object", + "description": "Provides the ability to enable or disable BIG-IP's HTTP filter processing", + "properties": { + "event": { + "type": "string", + "description": "When to run this event in the request-response cycle", + "enum": [ + "client-accepted", + "proxy-request", + "request", + "response", + "server-connected" + ], + "default": "request" + }, + "enabled": { + "description": "Enable BIG-IP's HTTP filter processing", + "type": "boolean", + "default": true + } + }, + "required": [] + }, + "Policy_Action_WAF": { + "type": "object", + "description": "Control web security", + "properties": { + "event": { + "type": "string", + "description": "When to run this event in the request-response cycle", + "enum": [ + "client-accepted", + "proxy-request", + "request" + ], + "default": "request" + }, + "policy": { + "$ref": "#/definitions/Pointer_WAF_Policy" + } + }, + "required": [] + }, + "Policy_Action_Bot_Defense": { + "type": "object", + "description": "Enable or disable Unified Bot Defense processing", + "properties": { + "event": { + "type": "string", + "description": "When to run this event in the request-response cycle", + "enum": [ + "client-accepted", + "proxy-request", + "request" + ], + "default": "request" + }, + "profile": { + "$ref": "#/definitions/Pointer_Bot_Defense_Profile" + } + }, + "required": [] + }, + "Policy_Action_Drop": { + "type": "object", + "description": "Reset connection", + "properties": { + "event": { + "type": "string", + "description": "When to run this event in the request-response cycle", + "enum": [ + "proxy-request", + "request", + "ssl-client-hello" + ], + "default": "ssl-client-hello" + } + } + }, + "Policy_Action_Forward_Select": { + "description": "Select appropriate location for forwarding the connection based on specified parameters", + "type": "object", + "allOf": [ + { + "oneOf": [ + { + "type": "object", + "properties": { + "pool": { + "$ref": "#/definitions/Pointer_Pool" + } + }, + "required": [ + "pool" + ] + }, + { + "type": "object", + "properties": { + "service": { + "$ref": "#/definitions/Pointer_Service" + } + }, + "required": [ + "service" + ] + } + ] + }, + { + "properties": { + "snat": { + "description": "Controls SNAT Automap", + "type": "string", + "enum": [ + "disable", + "automap" + ] + } + } + } + ] + }, + "Policy_Action_Forward": { + "description": "Controls where the system forwards a connection", + "type": "object", + "allOf": [ + { + "properties": { + "event": { + "type": "string", + "description": "When to run this event in the request-response cycle", + "enum": [ + "ssl-client-hello", + "request" + ], + "default": "ssl-client-hello" + } + } + }, + { + "oneOf": [ + { + "type": "object", + "properties": { + "select": { + "description": "Select appropriate location for forwarding the connection based on specified parameters", + "allOf": [ + { + "$ref": "#/definitions/Policy_Action_Forward_Select" + } + ] + } + }, + "required": [ + "select" + ] + } + ] + } + ] + }, + "Policy_Action_HTTP_Redirect": { + "type": "object", + "description": "Redirect an HTTP request to a different URL", + "properties": { + "event": { + "type": "string", + "description": "When to run this event in the request-response cycle", + "enum": [ + "proxy-request", + "request", + "response" + ], + "default": "proxy-request" + }, + "location": { + "description": "The new URL for which the system will send a redirect response; you can use a Tcl command substitution for this field", + "type": "string" + }, + "code": { + "description": "HTTP status code for the redirect. Note: code is only supported in TMOS version 14.0+.", + "type": "integer", + "minimum": 300, + "maximum": 399 + } + }, + "required": [ + "location" + ] + }, + "Policy_Action_HTTP_Header": { + "type": "object", + "description": "Modify HTTP header in request or response", + "allOf": [ + { + "type": "object", + "properties": { + "event": { + "type": "string", + "description": "When to run this event in the request-response cycle", + "enum": [ + "request", + "response" + ], + "default": "request" + } + } + }, + { + "oneOf": [ + { + "type": "object", + "properties": { + "replace": { + "type": "object", + "description": "Replace HTTP header in request or response", + "properties": { + "name": { + "type": "string", + "description": "Name of HTTP header" + }, + "value": { + "type": "string", + "description": "New value for HTTP header; you can use a Tcl command substitution for this field" + } + }, + "required": [ + "name", + "value" + ], + "additionalProperties": false + } + }, + "required": [ + "replace" + ] + }, + { + "type": "object", + "properties": { + "insert": { + "type": "object", + "description": "Insert HTTP header into request or response", + "properties": { + "name": { + "type": "string", + "description": "Name of HTTP header" + }, + "value": { + "type": "string", + "description": "New value for HTTP header; you can use a Tcl command substitution for this field" + } + }, + "required": [ + "name", + "value" + ], + "additionalProperties": false + } + }, + "required": [ + "insert" + ] + }, + { + "type": "object", + "properties": { + "remove": { + "type": "object", + "description": "Remove HTTP header from request or response", + "properties": { + "name": { + "type": "string", + "description": "Name of HTTP header" + } + }, + "required": [ + "name" + ], + "additionalProperties": false + } + }, + "required": [ + "remove" + ] + } + ] + } + ] + }, + "Policy_Action_HTTP_URI": { + "type": "object", + "description": "Modify the request's URI, path, or query string", + "properties": { + "event": { + "type": "string", + "description": "When to run this event in the request-response cycle", + "enum": [ + "request" + ], + "default": "request" + }, + "replace": { + "type": "object", + "description": "Replace URI, path, or query string in request", + "oneOf": [ + { + "type": "object", + "properties": { + "value": { + "type": "string", + "description": "New value for URI; you can use a Tcl command substitution for this field" + } + }, + "required": [ + "value" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "path": { + "type": "string", + "description": "New value for path; you can use a Tcl command substitution for this field" + } + }, + "required": [ + "path" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "queryString": { + "type": "string", + "description": "New value for query string; you can use a Tcl command substitution for this field" + } + }, + "required": [ + "queryString" + ], + "additionalProperties": false + } + ] + } + }, + "required": [ + "replace" + ] + }, + "Policy_Action_HTTP_Cookie": { + "type": "object", + "description": "Modify the request's \"Cookie:\" header", + "allOf": [ + { + "type": "object", + "properties": { + "event": { + "type": "string", + "description": "When to run this event in the request-response cycle", + "enum": [ + "request" + ], + "default": "request" + } + } + }, + { + "oneOf": [ + { + "type": "object", + "properties": { + "insert": { + "type": "object", + "description": "Insert HTTP \"Cookie:\" header into request", + "properties": { + "name": { + "type": "string", + "description": "Name of HTTP cookie" + }, + "value": { + "type": "string", + "description": "New value for HTTP cookie; you can use a Tcl command substitution for this field" + } + }, + "required": [ + "name", + "value" + ], + "additionalProperties": false + } + }, + "required": [ + "insert" + ] + }, + { + "type": "object", + "properties": { + "remove": { + "type": "object", + "description": "Remove HTTP \"Cookie:\" header from request", + "properties": { + "name": { + "type": "string", + "description": "Name of HTTP cookie" + } + }, + "required": [ + "name" + ], + "additionalProperties": false + } + }, + "required": [ + "remove" + ] + } + ] + } + ] + }, + "Policy_Action_Client_SSL": { + "type": "object", + "description": "Enable or disable encrypted connections to backend servers", + "properties": { + "event": { + "type": "string", + "description": "When to run this event in the request-response cycle", + "enum": [ + "client-accepted", + "proxy-request", + "request", + "proxy-connect", + "proxy-response", + "server-connected" + ], + "default": "client-accepted" + }, + "enabled": { + "description": "Enable encrypted connections to backend servers", + "type": "boolean", + "default": true + } + }, + "required": [] + }, + "Policy_Action_Persist": { + "type": "object", + "description": "Control over how a connection is persisted", + "allOf": [ + { + "type": "object", + "properties": { + "event": { + "type": "string", + "description": "When to run this event in the request-response cycle", + "enum": [ + "client-accepted", + "proxy-request", + "request" + ], + "default": "client-accepted" + } + } + }, + { + "oneOf": [ + { + "type": "object", + "properties": { + "disable": { + "type": "object", + "title": "Disable", + "description": "Disable persistence. When specifying set this property to an empty object (disable: {}).", + "additionalProperties": false + } + }, + "required": [ + "disable" + ] + }, + { + "type": "object", + "properties": { + "sourceAddress": { + "type": "object", + "title": "Source Address", + "description": "Persist the connection based on the source IP address", + "properties": { + "netmask": { + "title": "Network Mask", + "type": "string", + "description": "Network mask", + "format": "f5ip" + }, + "timeout": { + "title": "Timeout", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "description": "Timeout value in seconds" + } + }, + "required": [ + "netmask", + "timeout" + ], + "additionalProperties": false + } + }, + "required": [ + "sourceAddress" + ] + }, + { + "type": "object", + "properties": { + "destinationAddress": { + "type": "object", + "title": "Destination Address", + "description": "Persist the connection based on the destination IP address", + "properties": { + "netmask": { + "title": "Network Mask", + "type": "string", + "description": "Network mask", + "format": "f5ip" + }, + "timeout": { + "title": "Timeout", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "description": "Timeout value in seconds" + } + }, + "required": [ + "netmask", + "timeout" + ], + "additionalProperties": false + } + }, + "required": [ + "destinationAddress" + ] + }, + { + "type": "object", + "properties": { + "cookieInsert": { + "type": "object", + "title": "Cookie Insert", + "description": "Persist the connection using cookie insertion", + "properties": { + "name": { + "type": "string", + "title": "Name", + "description": "Name of cookie" + }, + "expiry": { + "type": "string", + "title": "Expiry", + "description": "Expiration duration expressed as [Nd][HH:MM[:SS]]" + } + }, + "required": [ + "name", + "expiry" + ], + "additionalProperties": false + } + }, + "required": [ + "cookieInsert" + ] + }, + { + "type": "object", + "properties": { + "cookieRewrite": { + "type": "object", + "title": "Cookie Rewrite", + "description": "Persist the connection using cookie rewrite", + "properties": { + "name": { + "type": "string", + "title": "Name", + "description": "Name of cookie" + }, + "expiry": { + "type": "string", + "title": "Expiry", + "description": "Expiration duration expressed as [Nd][HH:MM[:SS]]" + } + }, + "required": [ + "name", + "expiry" + ], + "additionalProperties": false + } + }, + "required": [ + "cookieRewrite" + ] + }, + { + "type": "object", + "properties": { + "cookiePassive": { + "type": "object", + "title": "Cookie Passive", + "description": "Persist the connection using cookie passive", + "properties": { + "name": { + "type": "string", + "title": "Name", + "description": "Name of cookie" + } + }, + "required": [ + "name" + ], + "additionalProperties": false + } + }, + "required": [ + "cookiePassive" + ] + }, + { + "type": "object", + "properties": { + "cookieHash": { + "type": "object", + "title": "Cookie Hash", + "description": "Persist the connection using cookie hash", + "properties": { + "name": { + "type": "string", + "title": "Name", + "description": "Name of cookie" + }, + "offset": { + "type": "integer", + "title": "Offset", + "minimum": 0, + "maximum": 65535, + "description": "Offset into hash" + }, + "length": { + "type": "integer", + "title": "Length", + "minimum": 0, + "maximum": 65535, + "description": "Substring length" + }, + "timeout": { + "title": "Timeout", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "description": "Timeout value in seconds" + } + }, + "required": [ + "name", + "offset", + "length", + "timeout" + ], + "additionalProperties": false + } + }, + "required": [ + "cookieHash" + ] + }, + { + "type": "object", + "properties": { + "universal": { + "type": "object", + "title": "Universal", + "description": "Persist the connection using a user-defined key", + "properties": { + "key": { + "type": "string", + "title": "Key", + "description": "The key to use. Tcl command substitution is allowed" + }, + "timeout": { + "title": "Timeout", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "description": "Timeout value in seconds" + } + }, + "required": [ + "key", + "timeout" + ], + "additionalProperties": false + } + }, + "required": [ + "universal" + ] + }, + { + "type": "object", + "properties": { + "hash": { + "type": "object", + "title": "Hash", + "description": "Persist the connection using the hash of a key", + "properties": { + "key": { + "type": "string", + "title": "Key", + "description": "The key to use. Tcl command substitution is allowed" + }, + "timeout": { + "title": "Timeout", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "description": "Timeout value in seconds" + } + }, + "required": [ + "key", + "timeout" + ], + "additionalProperties": false + } + }, + "required": [ + "hash" + ] + }, + { + "type": "object", + "properties": { + "carp": { + "type": "object", + "title": "Cache Array Routing Protocol (CARP)", + "description": "Persist the connection using Cache Array Routing Protocol (CARP) algorithm", + "properties": { + "key": { + "type": "string", + "title": "Key", + "description": "The key to use. Tcl command substitution is allowed" + }, + "timeout": { + "title": "Timeout", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "description": "Timeout value in seconds" + } + }, + "required": [ + "key", + "timeout" + ], + "additionalProperties": false + } + }, + "required": [ + "carp" + ] + } + ] + } + ] + }, + "Policy_Action_TCL": { + "type": "object", + "description": "Set a Tcl variable in runtime environment", + "properties": { + "event": { + "type": "string", + "description": "When to run this event in the request-response cycle", + "enum": [ + "proxy-request", + "request", + "response", + "ssl-client-hello", + "ssl-server-hello", + "ssl-server-handshake" + ], + "default": "request" + }, + "setVariable": { + "type": "object", + "description": "Set a Tcl variable in the runtime environment", + "properties": { + "expression": { + "type": "string", + "description": "Tcl expression to evaluate" + }, + "name": { + "type": "string", + "description": "Name of variable" + } + }, + "required": [ + "expression", + "name" + ] + } + }, + "required": [ + "setVariable" + ] + }, + "Policy_Action_Log": { + "type": "object", + "description": "Writes messages to local or remote system log", + "properties": { + "event": { + "type": "string", + "description": "When to run this event in the request-response cycle", + "enum": [ + "classification-detected", + "client-accepted", + "proxy-connect", + "proxy-request", + "proxy-response", + "request", + "response", + "server-connected", + "ssl-client-hello", + "ssl-client-serverhello-send", + "ssl-server-handshake", + "ssl-server-hello", + "ws-request", + "ws-response" + ], + "default": "ssl-client-hello" + }, + "write": { + "type": "object", + "description": "Write a message to the system log files", + "properties": { + "message": { + "type": "string", + "description": "The message to write to the system log. Can also be a Tcl command substitution", + "minLength": 1 + }, + "facility": { + "type": "string", + "description": "Standard syslog facility associated with the message", + "enum": [ + "authpriv", + "cron", + "daemon", + "ftp", + "kern", + "local0", + "local1", + "local2", + "local3", + "local4", + "local5", + "local6", + "local7", + "lpr", + "mail", + "news", + "security", + "user", + "uucp" + ], + "default": "local0" + }, + "priority": { + "type": "string", + "description": "Standard syslog priority associated with the message", + "enum": [ + "crit", + "debug", + "error", + "info", + "notice", + "warning" + ], + "default": "info" + }, + "ipAddress": { + "type": "string", + "description": "The IP address of the remote syslog server", + "format": "f5ip" + }, + "port": { + "type": "integer", + "description": "The port number of the remote syslog server", + "minimum": 0, + "maximum": 65535, + "default": 0 + } + }, + "required": [ + "message" + ] + } + }, + "required": [ + "write" + ] + }, + "Policy_Condition": { + "type": "object", + "description": "LTM policy condition", + "properties": { + "type": { + "description": "Selects the LTM policy condition this object describes", + "type": "string", + "enum": [ + "httpHeader", + "httpMethod", + "httpUri", + "httpCookie", + "sslExtension", + "tcp", + "geoip" + ] + } + }, + "allOf": [ + { + "if": { + "properties": { + "type": { + "const": "httpUri" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Condition_HTTP_URI" + } + }, + { + "if": { + "properties": { + "type": { + "const": "httpHeader" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Condition_HTTP_Header" + } + }, + { + "if": { + "properties": { + "type": { + "const": "httpMethod" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Condition_HTTP_Method" + } + }, + { + "if": { + "properties": { + "type": { + "const": "httpCookie" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Condition_HTTP_Cookie" + } + }, + { + "if": { + "properties": { + "type": { + "const": "sslExtension" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Condition_SSL_Extension" + } + }, + { + "if": { + "properties": { + "type": { + "const": "tcp" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Condition_TCP" + } + }, + { + "if": { + "properties": { + "type": { + "const": "geoip" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Condition_GeoIP" + } + } + ], + "required": [ + "type" + ] + }, + "Policy_Condition_HTTP_URI": { + "description": "Inspect the URI on a request and match on various parts or the entire URI", + "type": "object", + "allOf": [ + { + "type": "object", + "properties": { + "event": { + "description": "When to evaluate this condition in the request-response cycle", + "type": "string", + "enum": [ + "proxy-request", + "request" + ], + "default": "request" + } + } + }, + { + "oneOf": [ + { + "type": "object", + "properties": { + "path": { + "description": "Match on the URI path", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_String" + } + ] + }, + "normalized": { + "description": "Normalizes the result to a canonical form to allow consistent comparisons", + "type": "boolean", + "default": false + } + }, + "required": [ + "path" + ] + }, + { + "type": "object", + "properties": { + "scheme": { + "description": "Match on the scheme (e.g. http, https, ftp, file)", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_String" + } + ] + }, + "normalized": { + "description": "Normalizes the result to a canonical form to allow consistent comparisons", + "type": "boolean", + "default": false + } + }, + "required": [ + "scheme" + ] + }, + { + "type": "object", + "properties": { + "host": { + "description": "Match on the hostname in the URI", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_String" + } + ] + }, + "normalized": { + "description": "Normalizes the result to a canonical form to allow consistent comparisons", + "type": "boolean", + "default": false + } + }, + "required": [ + "host" + ] + }, + { + "type": "object", + "properties": { + "port": { + "description": "Match on the port number in the URI", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_Number" + } + ] + }, + "normalized": { + "description": "Normalizes the result to a canonical form to allow consistent comparisons", + "type": "boolean", + "default": false + } + }, + "required": [ + "port" + ] + }, + { + "type": "object", + "properties": { + "extension": { + "description": "Match on the file extension in the URI (e.g. jpg, html, cgi)", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_String" + } + ] + }, + "normalized": { + "description": "Normalizes the result to a canonical form to allow consistent comparisons", + "type": "boolean", + "default": false + } + }, + "required": [ + "extension" + ] + }, + { + "type": "object", + "properties": { + "queryString": { + "description": "Match against text in the query string", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_String" + } + ] + }, + "normalized": { + "description": "Normalizes the result to a canonical form to allow consistent comparisons", + "type": "boolean", + "default": false + } + }, + "required": [ + "queryString" + ] + }, + { + "type": "object", + "properties": { + "queryParameter": { + "description": "Match value of the named query parameter from the query string", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_String" + } + ] + }, + "name": { + "description": "Specify the name of the particular query parameter whose value you want to use", + "type": "string" + }, + "normalized": { + "description": "Normalizes the result to a canonical form to allow consistent comparisons", + "type": "boolean", + "default": false + } + }, + "required": [ + "queryParameter", + "name" + ] + }, + { + "type": "object", + "properties": { + "unnamedQueryParameter": { + "description": "Match the value of a query parameter by a numeric index instead of by name", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_String" + } + ] + }, + "index": { + "description": "The numeric order of the item whose value you want to use, start at 1; negative values indicate counting right to left", + "type": "integer", + "minimum": 1 + }, + "normalized": { + "description": "Normalizes the result to a canonical form to allow consistent comparisons", + "type": "boolean", + "default": false + } + }, + "required": [ + "unnamedQueryParameter", + "index" + ] + }, + { + "type": "object", + "properties": { + "pathSegment": { + "description": "Match a part of the URI path by a numeric index", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_String" + } + ] + }, + "index": { + "description": "The numeric order of the item whose value you want to use, start at 1; negative values indicate counting right to left", + "type": "integer", + "minimum": 1 + }, + "normalized": { + "description": "Normalizes the result to a canonical form to allow consistent comparisons", + "type": "boolean", + "default": false + } + }, + "required": [ + "pathSegment", + "index" + ] + }, + { + "type": "object", + "properties": { + "all": { + "description": "Match on the full URI", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_String" + } + ] + }, + "normalized": { + "description": "Normalizes the result to a canonical form to allow consistent comparisons", + "type": "boolean", + "default": false + } + }, + "required": [ + "all" + ] + } + ] + } + ] + }, + "Policy_Condition_HTTP_Header": { + "description": "Match against any HTTP header", + "type": "object", + "allOf": [ + { + "type": "object", + "properties": { + "event": { + "description": "When to evaluate this condition in the request-response cycle", + "type": "string", + "enum": [ + "proxy-request", + "request", + "proxy-connect", + "proxy-response", + "response" + ], + "default": "proxy-request" + } + } + }, + { + "oneOf": [ + { + "type": "object", + "properties": { + "all": { + "description": "Match on the full HTTP header", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_String" + } + ] + }, + "name": { + "description": "Specify the name of the particular HTTP header whose value you want to use", + "type": "string" + } + }, + "required": [ + "all", + "name" + ] + } + ] + } + ] + }, + "Policy_Condition_HTTP_Method": { + "description": "Match against any HTTP method", + "type": "object", + "allOf": [ + { + "type": "object", + "properties": { + "event": { + "description": "When to evaluate this condition in the request-response cycle", + "type": "string", + "enum": [ + "proxy-request", + "request" + ], + "default": "proxy-request" + } + } + }, + { + "type": "object", + "properties": { + "all": { + "description": "Match on the full HTTP method", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_String" + } + ] + } + }, + "required": [ + "all" + ] + } + ] + }, + "Policy_Condition_HTTP_Cookie": { + "description": "Inspect an HTTP request Cookie: header", + "type": "object", + "allOf": [ + { + "type": "object", + "properties": { + "event": { + "description": "When to evaluate this condition in the request-response cycle", + "type": "string", + "enum": [ + "proxy-request", + "request", + "proxy-connect" + ], + "default": "proxy-request" + } + } + }, + { + "oneOf": [ + { + "type": "object", + "properties": { + "all": { + "description": "Match on the full HTTP cookie", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_String" + } + ] + }, + "name": { + "description": "Specify the name of the particular HTTP cookie whose value you want to use", + "type": "string" + } + }, + "required": [ + "all", + "name" + ] + } + ] + } + ] + }, + "Policy_Condition_SSL_Extension": { + "description": "Inspect SSL extensions being negotiated during HELLO phase", + "type": "object", + "allOf": [ + { + "type": "object", + "properties": { + "event": { + "description": "When to evaluate this condition in the request-response cycle", + "type": "string", + "enum": [ + "ssl-client-hello", + "ssl-server-hello" + ], + "default": "ssl-client-hello" + } + } + }, + { + "oneOf": [ + { + "type": "object", + "properties": { + "serverName": { + "description": "Server name indication", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_String" + } + ] + } + }, + "required": [ + "serverName" + ] + }, + { + "type": "object", + "properties": { + "npn": { + "description": "Server name indication", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_String" + } + ] + }, + "index": { + "description": "The numeric order of the item whose value you want to use, start at 1; negative values indicate counting right to left", + "type": "integer", + "minimum": 1, + "default": 0 + } + }, + "required": [ + "npn" + ] + }, + { + "type": "object", + "properties": { + "alpn": { + "description": "Server name indication", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_String" + } + ] + }, + "index": { + "description": "The numeric order of the item whose value you want to use, start at 1; negative values indicate counting right to left", + "type": "integer", + "minimum": 1, + "default": 0 + } + }, + "required": [ + "alpn" + ] + } + ] + } + ] + }, + "Policy_Condition_TCP": { + "description": "Match against specific TCP properties", + "type": "object", + "allOf": [ + { + "type": "object", + "properties": { + "event": { + "description": "When to evaluate this condition in the request-response cycle", + "type": "string", + "enum": [ + "request", + "response", + "classification-detected", + "client-accepted", + "proxy-connect", + "proxy-request", + "proxy-response", + "server-connected", + "ssl-client-hello", + "ssl-client-serverhello-send", + "ssl-server-handshake", + "ssl-server-hello", + "ws-request", + "ws-response" + ], + "default": "request" + } + } + }, + { + "oneOf": [ + { + "type": "object", + "properties": { + "address": { + "description": "Specify the address to use", + "allOf": [ + { + "$ref": "#/definitions/Policy_Match_String" + } + ] + } + }, + "required": [ + "address" + ] + }, + { + "type": "object", + "properties": { + "port": { + "description": "Specify the port to use", + "allOf": [ + { + "$ref": "#/definitions/Policy_Compare_Number" + } + ] + } + }, + "required": [ + "port" + ] + } + ] + } + ] + }, + "Policy_Condition_GeoIP": { + "description": "Match against specific GeoIP properties", + "type": "object", + "allOf": [ + { + "type": "object", + "properties": { + "event": { + "description": "When to evaluate this condition in the request-response cycle", + "type": "string", + "enum": [ + "request", + "response", + "client-accepted", + "proxy-connect", + "proxy-request", + "proxy-response", + "server-connected", + "ssl-client-hello", + "ssl-client-serverhello-send", + "ssl-server-handshake", + "ssl-server-hello" + ], + "default": "request" + } + } + }, + { + "oneOf": [ + { + "type": "object", + "properties": { + "continent": { + "description": "Two-character continent code: AF, AN, AS, OC, EU, NA, SA", + "allOf": [ + { + "$ref": "#/definitions/Policy_Match_String" + } + ] + } + }, + "required": [ + "continent" + ] + }, + { + "type": "object", + "properties": { + "countryCode": { + "description": "Two-character country code as defined in ISO-3166-2", + "allOf": [ + { + "$ref": "#/definitions/Policy_Match_String" + } + ] + } + }, + "required": [ + "countryCode" + ] + }, + { + "type": "object", + "properties": { + "countryName": { + "description": "Full name of country", + "allOf": [ + { + "$ref": "#/definitions/Policy_Match_String" + } + ] + } + }, + "required": [ + "countryName" + ] + }, + { + "type": "object", + "properties": { + "isp": { + "description": "Internet Service Provider associated with address", + "allOf": [ + { + "$ref": "#/definitions/Policy_Match_String" + } + ] + } + }, + "required": [ + "isp" + ] + }, + { + "type": "object", + "properties": { + "org": { + "description": "Organization associated with address", + "allOf": [ + { + "$ref": "#/definitions/Policy_Match_String" + } + ] + } + }, + "required": [ + "org" + ] + }, + { + "type": "object", + "properties": { + "regionCode": { + "description": "Abbreviation of State, Province, or country-specific region", + "allOf": [ + { + "$ref": "#/definitions/Policy_Match_String" + } + ] + } + }, + "required": [ + "regionCode" + ] + }, + { + "type": "object", + "properties": { + "regionName": { + "description": "Full name of State, Province, or country-specific region", + "allOf": [ + { + "$ref": "#/definitions/Policy_Match_String" + } + ] + } + }, + "required": [ + "regionName" + ] + } + ] + } + ] + }, + "Policy_Compare_String": { + "description": "Perform a comparison against string values", + "type": "object", + "properties": { + "operand": { + "description": "Specifies the comparison the system should perform with values. The operands exists and does-not-exist do not accept values and are available on BIGIP 15.0 and above.", + "type": "string", + "enum": [ + "equals", + "does-not-equal", + "starts-with", + "does-not-start-with", + "ends-with", + "does-not-end-with", + "contains", + "does-not-contain", + "exists", + "does-not-exist" + ], + "default": "equals" + }, + "values": { + "description": "A list of strings to do comparisons against", + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "datagroup": { + "description": "Reference to a data-group containing the values", + "$ref": "#/definitions/Datagroup_Value" + }, + "caseSensitive": { + "description": "Specifies if the comparison the system should perform with case sensitivity", + "type": "boolean", + "default": false + } + }, + "dependencies": { + "operand": { + "if": { + "allOf": [ + { + "properties": { + "operand": { + "not": { + "const": "exists" + } + } + } + }, + { + "properties": { + "operand": { + "not": { + "const": "does-not-exist" + } + } + } + } + ] + }, + "then": { + "oneOf": [ + { + "required": [ + "values" + ] + }, + { + "required": [ + "datagroup" + ] + } + ] + } + } + }, + "additionalProperties": false + }, + "Policy_Compare_Number": { + "description": "Perform a comparison against number values", + "type": "object", + "properties": { + "operand": { + "description": "Specifies the comparison the system should perform with values", + "type": "string", + "enum": [ + "equals", + "does-not-equal", + "less", + "greater", + "less-or-equal", + "greater-or-equal" + ], + "default": "equals" + }, + "values": { + "description": "A list of numbers to do comparisons against", + "type": "array", + "items": { + "type": "integer" + }, + "minItems": 1 + } + }, + "required": [ + "values" + ], + "additionalProperties": false + }, + "Policy_Match_String": { + "description": "Perform a comparison that either matches or does-not-match", + "type": "object", + "properties": { + "operand": { + "description": "Specifies the comparison", + "type": "string", + "enum": [ + "matches", + "does-not-match" + ], + "default": "matches" + }, + "values": { + "description": "A list of strings to compare against", + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "datagroup": { + "description": "Reference to a data-group containing the values", + "$ref": "#/definitions/Datagroup_Value" + } + }, + "oneOf": [ + { + "required": [ + "values" + ] + }, + { + "required": [ + "datagroup" + ] + } + ], + "additionalProperties": false + }, + "Datagroup_Value": { + "description": "Reference to a data-group containing the values", + "type": "object", + "properties": { + "bigip": { + "title": "BIG-IP Data-Group", + "description": "Pathname of existing BIG-IP Data-Group", + "type": "string", + "format": "f5bigip" + }, + "use": { + "title": "Use", + "description": "BIG-IP AS3 pointer to Data_Group", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Data_Group" + } + }, + "required": [ + "class" + ] + } + } + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm data-group internal" + ] + } + }, + "Bandwidth_Control_Policy": { + "title": "Bandwidth_Control_Policy", + "description": "Create a listener to specify how to handle traffic for policy enforcement", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Bandwidth_Control_Policy" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "dynamicControlEnabled": { + "description": "Specifies whether the policy is a static or dynamic policy. When enabled, the policy is dynamic, and additional settings are available. A dynamic policy enforces the specified maximum user rate and flow fairness for all traffic associated with the policy and for each session. The default is disabled, which indicates a static policy. A static policy enforces the maximum rate for combined traffic and does not guarantee fairness bandwidth for each session.", + "type": "boolean", + "default": false + }, + "maxBandwidth": { + "description": "Specifies the maximum amount of bandwidth that traffic associated with the bandwidth control policy can use. The range is from 1 Mbps to 320 Gbps (between 1000000 bps and 320000000000 bps.", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709552000 + }, + "maxBandwidthUnit": { + "description": "Specifies the units used by the maxBandwidth property", + "type": "string", + "enum": [ + "bps", + "Kbps", + "Mbps", + "Gbps" + ], + "default": "Mbps" + }, + "maxUserBandwidth": { + "description": "Specifies the maximum amount of bandwidth that each session associated with the bandwidth control policy can use. The range is from 5 Kbps to 2 Gbps. Note: For FTP traffic, the throughput is roughly half of this setting, because the FTP protocol creates two connections per user: a control connection and a data connection.", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709552000, + "default": 0 + }, + "maxUserBandwidthUnit": { + "description": "Specifies the units used by the maxUserBandwidth property", + "type": "string", + "enum": [ + "bps", + "Kbps", + "Mbps", + "Gbps" + ], + "default": "Mbps" + }, + "maxUserPPS": { + "description": "Specifies the limiter in packets per second that traffic is allowed per instance. It functions as a DoS limiter without fair share allocation. The system applies whichever value is lower, between this value and the specified Maximum Rate Per User. When both values are specified, both must pass for packets to go through. You can specify the rate in packets per second (PPS), kilo packets per second (KPPS), mega packets per second (MPPS), or giga packets per second (GPPS). The default value is 0 (not configured).", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709552000, + "default": 0 + }, + "maxUserPPSUnit": { + "description": "Specifies the units used by the maxUserBandwidthPPS property", + "type": "string", + "enum": [ + "bpps", + "Kpps", + "Mpps", + "Gpps" + ], + "default": "Mpps" + }, + "loggingEnabled": { + "description": "Specifies whether the system measures bandwidth on all future instances of this bandwidth control policy. When enabled, the system measures bandwidth and sends it to the log publisher specified by the logPublisher setting. You can override this setting using iRules. For example, if you want measurement on only some instances, keep this setting disabled, and use iRules to enable measurement on specific instances.", + "type": "boolean", + "default": false + }, + "logPublisher": { + "$ref": "#/definitions/Pointer_Log_Publisher" + }, + "logPeriod": { + "description": "Specifies the frequency, in milliseconds, with which the system generates bandwidth measurement logs", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709552000, + "default": 2048 + }, + "markIP": { + "description": "Specifies whether to mark traffic that exceeds the per-user limit by setting a Type of Service (ToS) bit in the IP headers of TCP packets associated with this bandwidth control policy. The default value is \"pass-through\", which means there is no change to the ToS bit. To set a ToS bit use a value from 0 to 63. If this setting is specified, the bandwidth policy is not enforced, but rather the packets are marked for a downstream system to process.", + "if": { + "type": "string" + }, + "then": { + "const": "pass-through" + }, + "else": { + "type": "integer", + "minimum": 0, + "maximum": 63 + }, + "default": "pass-through" + }, + "markL2": { + "description": "Specifies whether to mark traffic that exceeds the per-user limit by setting a Quality of Service (QoS) bit in the L2 headers of packets associated with this bandwidth control policy. The default value is \"pass-through\", which means there is no change to the QoS bit. To set a QoS bit use a value from 0 to 7. If this setting is specified, the bandwidth policy is not enforced, but rather the packets are marked for a downstream system to process.", + "if": { + "type": "string" + }, + "then": { + "const": "pass-through" + }, + "else": { + "type": "integer", + "minimum": 0, + "maximum": 7 + }, + "default": "pass-through" + }, + "categories": { + "description": "This specifies the categories under policy. Note: policy need to be enabled as dynamic to configure categories. Up to a maximum of 32 categories can be configured. All the categories under the dynamic policy share the bandwidth as specified for the category, up to a maximum of maxUserBandwidth.", + "additionalProperties": { + "$ref": "#/definitions/Bandwidth_Control_Policy_Category" + } + } + }, + "required": [ + "class", + "maxBandwidth" + ], + "if": { + "required": [ + "dynamicControlEnabled" + ], + "properties": { + "dynamicControlEnabled": { + "const": true + } + } + }, + "then": { + "required": [ + "maxUserBandwidth" + ] + }, + "additionalProperties": false + }, + "Idle_Timeout_Policy": { + "title": "Idle_Timeout_Policy", + "description": "Destination port based idle timeout policy", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Idle_Timeout_Policy" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "rules": { + "description": "List of idle timeout rules", + "type": "array", + "items": { + "$ref": "#/definitions/Idle_Timeout_Rule" + } + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "Idle_Timeout_Rule": { + "description": "Idle timeout rule", + "type": "object", + "properties": { + "name": { + "description": "Idle timeout rule name", + "type": "string", + "pattern": "^[A-Za-z_][0-9A-Za-z_/-]*$", + "maxLength": 64 + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "protocol": { + "type": "string", + "allOf": [ + { + "$ref": "#/definitions/Enum_Protocols_Idle_Timeout_Policy" + } + ], + "default": "all-other" + }, + "destinationPorts": { + "type": "array", + "description": "List of ports, port ranges (for example, 80, \"8080-8090\"), or \"all-other\".", + "items": { + "type": [ + "integer", + "string" + ] + }, + "minItems": 1 + }, + "idleTimeout": { + "description": "Idle timeout in seconds", + "type": [ + "integer", + "string" + ], + "oneOf": [ + { + "type": "integer" + }, + { + "type": "string", + "enum": [ + "immediate", + "indefinite", + "unspecified" + ] + } + ], + "default": "unspecified" + } + }, + "required": [ + "name" + ], + "additionalProperties": false + }, + "Bandwidth_Control_Policy_Category": { + "description": "Create a listener to specify how to handle traffic for policy enforcement", + "type": "object", + "properties": { + "remark": { + "$ref": "#/definitions/Remark" + }, + "maxBandwidth": { + "description": "Specifies the maximum bandwidth that this category of traffic can use when associated with this bandwidth control policy. The range is from 5 kbps to the value set for Maximum Rate Per User.", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709552000 + }, + "maxBandwidthUnit": { + "description": "Specifies the units used by the maxBandwidth property", + "type": "string", + "enum": [ + "bps", + "Kbps", + "Mbps", + "Gbps", + "%" + ], + "default": "Mbps" + }, + "markIP": { + "description": "Specifies whether to mark traffic that exceeds the per-user limit by setting a Type of Service (ToS) bit in the IP headers of TCP packets associated with this bandwidth control policy. The default value is \"pass-through\", which means there is no change to the ToS bit. To set a ToS bit use a value from 0 to 63. If this setting is specified, the bandwidth policy is not enforced, but rather the packets are marked for a downstream system to process.", + "if": { + "type": "string" + }, + "then": { + "const": "pass-through" + }, + "else": { + "type": "integer", + "minimum": 0, + "maximum": 63 + }, + "default": "pass-through" + }, + "markL2": { + "description": "Specifies whether to mark traffic that exceeds the per-user limit by setting a Quality of Service (QoS) bit in the L2 headers of packets associated with this bandwidth control policy. The default value is \"pass-through\", which means there is no change to the QoS bit. To set a QoS bit use a value from 0 to 7. If this setting is specified, the bandwidth policy is not enforced, but rather the packets are marked for a downstream system to process.", + "if": { + "type": "string" + }, + "then": { + "const": "pass-through" + }, + "else": { + "type": "integer", + "minimum": 0, + "maximum": 7 + }, + "default": "pass-through" + } + }, + "required": [ + "maxBandwidth" + ], + "additionalProperties": false + }, + "Net_Address_List": { + "title": "Net_Address_List", + "description": "You can use the address-list component to define reusable lists of addresses. This property requires a BIG-IP version of 14.1 or higher.", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Net_Address_List" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "addresses": { + "type": "array", + "description": "A list of IPv4 and IPv6 addresses and address ranges. You can specify a network with CIDR slash notation.", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "addressLists": { + "type": "array", + "description": "A list of other address lists (each by BIG-IP AS3 pointer or BIG-IP pathname).", + "items": { + "$ref": "#/definitions/Pointer_Net_Address_List" + }, + "minItems": 1 + } + }, + "required": [ + "class" + ], + "anyOf": [ + { + "required": [ + "addresses" + ] + }, + { + "required": [ + "addressLists" + ] + } + ], + "additionalProperties": false + }, + "Net_Port_List": { + "title": "Net_Port_List", + "description": "You can use the port-list component to define reusable lists of ports. This property requires a BIG-IP version of 14.1 or higher.", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Net_Port_List" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "ports": { + "type": "array", + "description": "A list of ports and port ranges (for example, 80, \"8080-8090\").", + "items": { + "type": [ + "integer", + "string" + ] + }, + "minItems": 1 + }, + "portLists": { + "type": "array", + "description": "A list of other port lists (each by BIG-IP AS3 pointer or BIG-IP pathname).", + "items": { + "$ref": "#/definitions/Pointer_Net_Port_List" + }, + "minItems": 1 + } + }, + "required": [ + "class" + ], + "anyOf": [ + { + "required": [ + "ports" + ] + }, + { + "required": [ + "portLists" + ] + } + ], + "additionalProperties": false + }, + "Enforcement_Policy": { + "title": "Enforcement_Policy", + "description": "Configures policies for the Policy Enforcement Manager (PEM)", + "f5PostProcess": { + "tag": "modules", + "data": [ + "pem" + ] + }, + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Enforcement_Policy" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "enable": { + "description": "Specifies the current status of the policy", + "type": "boolean", + "default": true + }, + "allTransactions": { + "description": "Specifies, when set to true, that the system enables policy enforcement for each http transaction. When set to false, the system allows only policy enforcement of the first http transaction.", + "type": "boolean", + "default": false + }, + "rules": { + "description": "Enforcement policy rules", + "type": "array", + "items": { + "$ref": "#/definitions/Enforcement_Rule" + } + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "Enforcement_Rule": { + "description": "A rule to match traffic flows and apply actions", + "type": "object", + "properties": { + "dscpMarkingDownlink": { + "description": "Specifies whether to set DSCP bits in the IP header of outgoing traffic to the subscriber", + "if": { + "type": "string" + }, + "then": { + "const": "pass-through" + }, + "else": { + "type": "integer", + "minimum": 0, + "maximum": 63 + }, + "default": "pass-through" + }, + "dscpMarkingUplink": { + "description": "Specifies whether to set DSCP bits in the IP header of outgoing traffic to the network", + "if": { + "type": "string" + }, + "then": { + "const": "pass-through" + }, + "else": { + "type": "integer", + "minimum": 0, + "maximum": 63 + }, + "default": "pass-through" + }, + "gateStatusEnabled": { + "description": "Specifies, when set to true, that the traffic can pass through the system without being changed. Select false to drop traffic that this rule applies to.", + "type": "boolean", + "default": true + }, + "interceptionEndpoint": { + "$ref": "#/definitions/Pointer_Enforcement_Interception_Endpoint" + }, + "iRule": { + "$ref": "#/definitions/Pointer_Enforcement_iRule" + }, + "l2MarkingDownlink": { + "description": "Set Layer-2 Quality of Service Marking in downlink traffic that matches a rule. Setting a L2 QoS Marking affects the packet delivery priority. The range is 0 to 7, or pass-through. The default value is pass-through, indicating the L2 QoS Marking of the packet will not be changed when the packet matches the rule.", + "if": { + "type": "string" + }, + "then": { + "const": "pass-through" + }, + "else": { + "type": "integer", + "minimum": 0, + "maximum": 7 + }, + "default": "pass-through" + }, + "l2MarkingUplink": { + "description": "Set Layer-2 Quality of Service Marking in uplink traffic that matches a rule. Setting a L2 QoS marking affects the packet delivery priority. The range is 0 to 7, or pass-through. The default value is pass-through, indicating the L2 QoS Marking of the packet will not be changed when the packet matches the rule.", + "if": { + "type": "string" + }, + "then": { + "const": "pass-through" + }, + "else": { + "type": "integer", + "minimum": 0, + "maximum": 7 + }, + "default": "pass-through" + }, + "name": { + "description": "The name of the policy rule.", + "type": "string" + }, + "precedence": { + "description": "Specifies an integer that indicates the precedence for the rule in relation to the other rules. Number 1 has the highest precedence. Rules with higher precedence (lower numbers) are evaluated before other rules with lower precedence (higher numbers).", + "type": "integer", + "minimum": 1, + "maximum": 4294967295 + }, + "qosBandwidthControllerUplink": { + "$ref": "#/definitions/Enforcement_Rule_QOS" + }, + "qosBandwidthControllerDownlink": { + "$ref": "#/definitions/Enforcement_Rule_QOS" + }, + "serviceChain": { + "$ref": "#/definitions/Pointer_Enforcement_Service_Chain_Endpoint" + }, + "tclFilter": { + "description": "Specifies the tcl expression which uses iRule commands to filter the packet. It is a match if tclFilter returns TRUE/1 or nomatch if FALSE/0.", + "type": "string" + }, + "tcpAnalyticsEnabled": { + "description": "Specifies the action to enable tcp analytics when the traffic flow matches the rule matching criteria", + "type": "boolean", + "default": false + }, + "tcpOptimizationDownlink": { + "$ref": "#/definitions/Pointer_TCP_Profile" + }, + "tcpOptimizationUplink": { + "$ref": "#/definitions/Pointer_TCP_Profile" + }, + "classificationFilters": { + "description": "Classification filters to apply to the traffic", + "type": "array", + "items": { + "$ref": "#/definitions/Enforcement_Rule_Classification_Filter" + } + }, + "DTOSTethering": { + "allOf": [ + { + "$ref": "#/definitions/Enforcement_Rule_DTOS_Tethering" + } + ], + "default": {} + }, + "flowInfoFilters": { + "description": "Flow information filters to apply to the traffic", + "type": "array", + "items": { + "$ref": "#/definitions/Enforcement_Rule_Flow_Filter" + } + }, + "forwarding": { + "$ref": "#/definitions/Enforcement_Rule_Forwarding" + }, + "insertContent": { + "$ref": "#/definitions/Enforcement_Rule_Insert_Content" + }, + "modifyHttpHeader": { + "$ref": "#/definitions/Enforcement_Rule_Modify_HTTP_Header" + }, + "qoeReporting": { + "$ref": "#/definitions/Enforcement_Rule_Report_Destination_HSL" + }, + "quota": { + "$ref": "#/definitions/Enforcement_Rule_Quota" + }, + "ranCongestion": { + "$ref": "#/definitions/Enforcement_Rule_Ran_Congestion" + }, + "usageReporting": { + "$ref": "#/definitions/Enforcement_Rule_Usage_Reporting" + }, + "urlCategorizationFilters": { + "description": "URL categorization filters to apply to the traffic", + "type": "array", + "items": { + "$ref": "#/definitions/Enforcement_Rule_URL_Categorization_Filter" + } + } + }, + "required": [ + "name", + "precedence" + ], + "additionalProperties": false + }, + "Enforcement_Rule_QOS": { + "description": "Specifies a previously configured bandwidth control policy to apply to traffic that matches this rule", + "type": "object", + "properties": { + "policy": { + "$ref": "#/definitions/Pointer_Bandwidth_Control_Policy" + }, + "category": { + "description": "Specifies a category of traffic within the bandwidth control policy to which to apply the rule. This option provides more specific rate control to a certain type of traffic. The category must be defined in the selected bandwidth control policy.", + "type": "string" + } + }, + "required": [ + "policy" + ], + "additionalProperties": false + }, + "Enforcement_Rule_DTOS_Tethering": { + "description": "Specifies options for device type, operating system, and tethering detection", + "type": "object", + "properties": { + "detectDtos": { + "description": "Specifies the detection of the subscriber's device and the operating system", + "type": "boolean", + "default": false + }, + "detectTethering": { + "description": "Specifies if you want to enable detection of tethering", + "type": "boolean", + "default": false + }, + "reportDestinationHsl": { + "$ref": "#/definitions/Enforcement_Rule_Report_Destination_HSL" + } + }, + "required": [], + "additionalProperties": false + }, + "Enforcement_Rule_Report_Destination_HSL": { + "description": "Specifies report destination and format", + "type": "object", + "properties": { + "highSpeedLogPublisher": { + "$ref": "#/definitions/Pointer_Log_Publisher" + }, + "formatScript": { + "$ref": "#/definitions/Pointer_Enforcement_Format_Script" + } + }, + "required": [], + "additionalProperties": false + }, + "Enforcement_Rule_Forwarding_ICAP": { + "description": "Specifies that the flow forwards to the ICAP virtual server", + "type": "object", + "properties": { + "icapType": { + "description": "Specifies the ICAP adaptation type", + "type": "string", + "enum": [ + "request", + "response", + "both" + ] + }, + "icapService": { + "description": "ICAP service to route to", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Service" + } + ] + } + }, + "required": [ + "icapType", + "icapService" + ] + }, + "Enforcement_Rule_Forwarding_Endpoint": { + "description": "Specifies that the flow steers to a different destination", + "type": "object", + "properties": { + "endpoint": { + "$ref": "#/definitions/Pointer_Enforcement_Forwarding_Endpoint" + } + }, + "required": [ + "endpoint" + ] + }, + "Enforcement_Rule_Forwarding_Route_To_Network": { + "description": "Specifies that the system forwards the flow to the default destination", + "type": "object", + "properties": {}, + "required": [] + }, + "Enforcement_Rule_Forwarding_HTTP": { + "description": "Specifies that traffic affected by this rule should be redirected to the specified URL", + "type": "object", + "properties": { + "redirectUrl": { + "description": "Specifies that traffic affected by this rule should be redirected to the specified URL", + "type": "string" + } + }, + "required": [ + "redirectUrl" + ] + }, + "Enforcement_Rule_Forwarding": { + "description": "Manages the forwarding action and its attributes", + "type": "object", + "properties": { + "type": { + "description": "Specifies the type of forwarding action", + "type": "string", + "enum": [ + "icap", + "endpoint", + "route-to-network", + "http" + ] + }, + "fallbackAction": { + "description": "Specifies if the connection can remain unchanged or should be dropped if the forwarding action fails for any reason", + "type": "string", + "enum": [ + "continue", + "drop" + ], + "default": "drop" + } + }, + "allOf": [ + { + "if": { + "properties": { + "type": { + "const": "icap" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Rule_Forwarding_ICAP" + } + }, + { + "if": { + "properties": { + "type": { + "const": "endpoint" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Rule_Forwarding_Endpoint" + } + }, + { + "if": { + "properties": { + "type": { + "const": "route-to-network" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Rule_Forwarding_Route_To_Network" + } + }, + { + "if": { + "properties": { + "type": { + "const": "http" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Rule_Forwarding_HTTP" + } + } + ], + "required": [ + "type" + ] + }, + "Enforcement_Rule_Insert_Content": { + "description": "Specifies the action to insert content into the webpage", + "type": "object", + "properties": { + "duration": { + "description": "Specifies the periodicity of the insert action in seconds", + "type": "integer", + "minimum": 1, + "maximum": 4294967295 + }, + "frequency": { + "description": "Specifies the number of content insertion actions per transaction", + "type": "string", + "enum": [ + "always", + "once", + "once-every" + ], + "default": "always" + }, + "position": { + "description": "Specifies position with respect to the configured tagName", + "type": "string", + "enum": [ + "append", + "prepend" + ], + "default": "append" + }, + "tagName": { + "description": "Specifies the tag name to which the content is either appended or prepended", + "type": "string" + }, + "valueContent": { + "description": "Specifies the value content to be inserted into the webpage", + "type": "string" + }, + "valueType": { + "description": "Specifies the type of content format used in the valueContent option", + "type": "string", + "enum": [ + "string", + "tcl-snippet" + ], + "default": "string" + } + }, + "dependencies": { + "duration": { + "properties": { + "frequency": { + "const": "once-every" + } + } + }, + "tagName": { + "required": [ + "valueContent" + ] + }, + "valueContent": { + "required": [ + "tagName" + ] + }, + "frequency": { + "if": { + "properties": { + "frequency": { + "const": "once-every" + } + } + }, + "then": { + "required": [ + "duration" + ] + } + } + }, + "required": [], + "additionalProperties": false + }, + "Enforcement_Rule_Modify_HTTP_Header": { + "description": "Specifies the action to modify the HTTP header when the traffic flow matches the rule matching criteria", + "type": "object", + "properties": { + "headerName": { + "description": "Specifies the HTTP header name used by the operation option to modify the HTTP header", + "type": "string" + }, + "operation": { + "description": "Specifies the operation used to modify the HTTP header", + "type": "string", + "enum": [ + "insert", + "remove" + ] + }, + "valueContent": { + "description": "Specifies the HTTP header value content used by the insert operation to modify the HTTP header", + "type": "string" + }, + "valueType": { + "description": "Specifies the type of content format used in the valueContent option", + "type": "string", + "enum": [ + "string", + "tcl-snippet" + ], + "default": "string" + } + }, + "dependencies": { + "valueContent": { + "properties": { + "operation": { + "const": "insert" + } + } + }, + "valueType": { + "properties": { + "operation": { + "const": "insert" + } + } + } + }, + "if": { + "properties": { + "operation": { + "const": "insert" + } + } + }, + "then": { + "required": [ + "valueContent" + ] + }, + "required": [ + "headerName", + "operation" + ], + "additionalProperties": false + }, + "Enforcement_Rule_Quota": { + "description": "Specify quota management options", + "type": "object", + "properties": { + "ratingGroup": { + "$ref": "#/definitions/Pointer_Enforcement_Rating_Group" + }, + "reportingLevel": { + "description": "Specifies the quota reporting level", + "type": "string", + "enum": [ + "rating-group", + "service-id" + ], + "default": "rating-group" + } + }, + "dependencies": { + "ratingGroup": { + "properties": { + "reportingLevel": { + "const": "rating-group" + } + } + } + }, + "required": [], + "additionalProperties": false + }, + "Enforcement_Rule_Ran_Congestion": { + "description": "Detect congestion in the Radio Access Network", + "type": "object", + "properties": { + "threshold": { + "description": "Specifies lower threshold bandwidth (in kbps) for a session to be marked as congested", + "type": "integer", + "minimum": 0, + "maximum": 2147483647, + "default": 1000 + }, + "reportDestinationHsl": { + "$ref": "#/definitions/Enforcement_Rule_Report_Destination_HSL" + } + }, + "required": [], + "additionalProperties": false + }, + "Enforcement_Rule_Usage_Reporting": { + "description": "Send reporting data concerning traffic affected by this rule to either an external analytics system or to a PCRF over a Gx interface", + "type": "object", + "properties": { + "destination": { + "description": "Specifies where to send the usage monitoring data", + "type": "string", + "enum": [ + "gx", + "sd", + "hsl", + "radius-accounting" + ] + }, + "granularity": { + "description": "Specifies the type of reporting that will be generated when the policy applies", + "type": "string", + "enum": [ + "flow", + "session", + "transaction" + ], + "default": "session" + }, + "interval": { + "description": "Specifies the time interval when the report will be generated, in seconds. A value of 0 indicates this feature is disabled.", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "volume": { + "$ref": "#/definitions/Enforcement_Rule_Usage_Reporting_Volume" + }, + "transaction": { + "$ref": "#/definitions/Enforcement_Rule_Usage_Reporting_Transaction" + } + }, + "allOf": [ + { + "if": { + "properties": { + "destination": { + "const": "gx" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Rule_Usage_Gx" + } + }, + { + "if": { + "properties": { + "destination": { + "const": "sd" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Rule_Usage_Sd" + } + }, + { + "if": { + "properties": { + "destination": { + "const": "hsl" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Rule_Usage_Hsl" + } + }, + { + "if": { + "properties": { + "destination": { + "const": "radius-accounting" + } + } + }, + "then": { + "$ref": "#/definitions/Enforcement_Rule_Usage_Radius" + } + }, + { + "if": { + "properties": { + "destination": { + "enum": [ + "gx", + "sd", + "radius-accounting" + ] + } + } + }, + "then": { + "properties": { + "granularity": { + "const": "session" + } + } + } + }, + { + "if": { + "properties": { + "destination": { + "enum": [ + "gx", + "sd" + ] + } + } + }, + "then": { + "properties": { + "interval": { + "const": 0 + } + } + } + }, + { + "if": { + "properties": { + "destination": { + "enum": [ + "hsl", + "radius-accounting" + ] + }, + "granularity": { + "enum": [ + "flow", + "session" + ] + } + } + }, + "then": { + "anyOf": [ + { + "properties": { + "interval": { + "minimum": 1 + } + }, + "required": [ + "interval" + ] + }, + { + "required": [ + "volume" + ] + } + ] + } + }, + { + "if": { + "properties": { + "destination": { + "const": "hsl" + }, + "granularity": { + "const": "transaction" + } + } + }, + "then": { + "properties": { + "interval": { + "const": 0 + } + } + } + } + ], + "dependencies": { + "transaction": { + "properties": { + "granularity": { + "const": "transaction" + } + } + } + }, + "required": [ + "destination" + ] + }, + "Enforcement_Rule_Usage_Reporting_Volume": { + "description": "Configures volume threshold settings", + "type": "object", + "properties": { + "downlink": { + "description": "Send reporting data if the number of octets to the client exceeds the threshold. A value of 0 indicates this feature is disabled.", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "total": { + "description": "Send reporting data if the total number of octets both to and from the client exceeds the threshold. A value of 0 indicates this feature is disabled.", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "uplink": { + "description": "Send reporting data if the number of octets from the client exceeds the threshold. A value of 0 indicates this feature is disabled.", + "type": "integer", + "minimum": 0, + "default": 0 + } + }, + "required": [], + "additionalProperties": false + }, + "Enforcement_Rule_Usage_Reporting_Transaction": { + "description": "Specifies policy enforcement configuration on transaction report for each HTTP transaction", + "type": "object", + "properties": { + "hostname": { + "description": "Specifies the maximum HTTP hostname string length option to include in the HTTP transaction report", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 0 + }, + "uri": { + "description": "Specifies the maximum HTTP URI string length option to include in the HTTP transaction report", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 256 + }, + "userAgent": { + "description": "Specifies the maximum HTTP user agent string length to include in the HTTP transaction report", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 0 + } + }, + "required": [], + "additionalProperties": false + }, + "Enforcement_Rule_Usage_Gx": { + "description": "Sends usage monitoring data to a PCRF over a Gx interface", + "type": "object", + "properties": { + "applicationReportingEnabled": { + "description": "Report APPLICATION_START and APPLICATION_END Event-Triggers when the application start/stop is detected", + "type": "boolean", + "default": false + }, + "monitoringKey": { + "description": "Specifies a string to use for usage monitoring indicating the portion of traffic that is accounted for in this dynamic policy and charging control (PCC) rule", + "type": "string" + } + }, + "required": [] + }, + "Enforcement_Rule_Usage_Sd": { + "description": "Sends usage monitoring data to a PCRF over a Sd interface", + "type": "object", + "properties": { + "applicationReportingEnabled": { + "description": "Report APPLICATION_START and APPLICATION_END Event-Triggers when the application start/stop is detected", + "type": "boolean", + "default": false + }, + "monitoringKey": { + "description": "Specifies a string to use for usage monitoring indicating the portion of traffic that is accounted for in this dynamic policy and charging control (PCC) rule", + "type": "string" + } + }, + "required": [ + "monitoringKey" + ] + }, + "Enforcement_Rule_Usage_Hsl": { + "description": "Sends reporting data to remote HSL servers", + "type": "object", + "properties": { + "publisher": { + "$ref": "#/definitions/Pointer_Log_Publisher" + }, + "formatScript": { + "$ref": "#/definitions/Pointer_Enforcement_Format_Script" + }, + "sessionReportingFields": { + "description": "Specifies the session fields and their order based on which messages should be published", + "type": "array", + "items": { + "type": "string", + "enum": [ + "3gpp-parameters", + "application-id", + "called-station-id", + "calling-station-id", + "concurrent-flows", + "downlink-volume", + "duration-seconds", + "last-record-sent", + "new-flows", + "observation-time-seconds", + "record-reason", + "record-type", + "report-id", + "report-version", + "subscriber-id", + "subscriber-id-type", + "successful-transactions", + "terminated-flows", + "timestamp-msec", + "total-transactions", + "uplink-volume" + ] + } + }, + "flowReportingFields": { + "description": "Specifies the flow fields and their order based on which messages should be published", + "type": "array", + "items": { + "type": "string", + "enum": [ + "application-id", + "destination-ip", + "destination-transport-port", + "downlink-volume", + "flow-end-milli-seconds", + "flow-end-seconds", + "flow-start-milli-seconds", + "flow-start-seconds", + "observation-time-seconds", + "protocol-identifier", + "record-type", + "report-id", + "report-version", + "route-domain", + "source-ip", + "source-transport-port", + "subscriber-id", + "subscriber-id-type", + "timestamp-msec", + "total-transactions", + "uplink-volume", + "url-category-id", + "vlan-id" + ] + } + }, + "transactionReportingFields": { + "description": "Specifies the transaction fields and their order based on which messages should be published", + "type": "array", + "items": { + "type": "string", + "enum": [ + "application-id", + "destination-ip", + "destination-transport-port", + "downlink-volume", + "http-hostname", + "http-hostname-truncated", + "http-response-code", + "http-url", + "http-url-truncated", + "http-user-agent", + "http-user-agent-truncated", + "protocol-identifier", + "record-type", + "report-id", + "report-version", + "route-domain", + "skipped-transactions", + "source-ip", + "source-transport-port", + "subscriber-id", + "subscriber-id-type", + "transaction-classification-result", + "transaction-end-milli-seconds", + "transaction-end-seconds", + "transaction-number", + "transaction-start-milli-seconds", + "transaction-start-seconds", + "uplink-volume", + "url-category-id", + "vlan-id" + ] + } + } + }, + "required": [ + "publisher" + ] + }, + "Enforcement_Rule_Usage_Radius": { + "description": "Specifies a RADIUS internal virtual server as a reporting destination", + "type": "object", + "properties": { + "radiusAAAService": { + "$ref": "#/definitions/Pointer_Service" + } + }, + "required": [ + "radiusAAAService" + ] + }, + "Enforcement_Rule_Classification_Filter": { + "description": "Defines the category or application (Layer 7) conditions that the traffic must meet (or not meet) for this enforcement policy rule to apply", + "type": "object", + "properties": { + "application": { + "$ref": "#/definitions/Pointer_Classification_Application" + }, + "category": { + "$ref": "#/definitions/Pointer_Classification_Category" + }, + "invertMatch": { + "description": "Specifies that a traffic flow should not match the condition", + "type": "boolean", + "default": false + }, + "name": { + "description": "The name of the classification filter.", + "type": "string" + } + }, + "required": [ + "name" + ], + "oneOf": [ + { + "required": [ + "application" + ] + }, + { + "required": [ + "category" + ] + } + ], + "additionalProperties": false + }, + "Enforcement_Rule_URL_Categorization_Filter": { + "description": "Defines the category of URL, which provides information about the content type requested by the subscriber", + "type": "object", + "properties": { + "category": { + "description": "Specifies which type of URL category you want the rule to affect", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Classification_Category" + } + ] + }, + "invertMatch": { + "description": "Specifies that a traffic flow should not match the condition", + "type": "boolean", + "default": false + }, + "name": { + "description": "The name of the URL categorization filter.", + "type": "string" + } + }, + "required": [ + "name", + "category" + ], + "additionalProperties": false + }, + "Enforcement_Rule_Flow_Filter": { + "description": "Defines the flow conditions (Layer 4) that the traffic must meet (or not meet) for this enforcement policy rule to apply", + "type": "object", + "properties": { + "name": { + "description": "The name of the flow filter.", + "type": "string" + }, + "invertMatch": { + "description": "Specifies that a traffic flow should not match the condition", + "type": "boolean", + "default": false + }, + "dscpMarking": { + "description": "Matches incoming traffic based on a value in the DSCP field in the IP header", + "oneOf": [ + { + "type": "integer", + "minimum": 0, + "maximum": 63 + }, + { + "type": "string", + "const": "disabled" + } + ], + "default": "disabled" + }, + "destinationAddress": { + "description": "Matches traffic going to a destination address or network", + "type": "string", + "default": "0.0.0.0/0" + }, + "destinationPort": { + "description": "Matches traffic headed to a destination port", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 0 + }, + "sourceVlan": { + "description": "Matches incoming traffic from a VLAN", + "allOf": [ + { + "$ref": "#/definitions/Pointer_VLAN" + } + ] + }, + "sourceAddress": { + "description": "Matches traffic coming from a source address or network", + "type": "string", + "default": "0.0.0.0/32" + }, + "sourcePort": { + "description": "Matches traffic coming from a source port", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 0 + }, + "protocol": { + "description": "Specifies the protocol of the traffic to which the rule applies", + "type": "string", + "enum": [ + "any", + "tcp", + "udp" + ], + "default": "any" + }, + "ipAddressType": { + "description": "Specifies the IP address type that this rule applies to", + "type": "string", + "enum": [ + "any", + "ipv4", + "ipv6" + ], + "default": "any" + } + }, + "required": [ + "name" + ], + "additionalProperties": false + }, + "Enforcement_Diameter_Endpoint_Profile": { + "title": "Enforcement_Diameter_Endpoint_Profile", + "description": "Create a listener to specify how to handle traffic for policy enforcement", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "pem" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Enforcement_Diameter_Endpoint_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "parentProfile": { + "description": "Specifies the name of the object to inherit the settings from", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Enforcement_Diameter_Endpoint_Profile" + } + ], + "default": { + "bigip": "/Common/diameter-endpoint" + } + }, + "destinationHost": { + "description": "Specifies the destination host name of the PCRF or external policy server, for example, pcrfdest.net.com", + "type": "string" + }, + "destinationRealm": { + "description": "Specifies the realm name or network of the PCRF, for example, net.com", + "type": "string" + }, + "fatalGraceTime": { + "description": "Specifies the time period in seconds that a diameter (PCRF) connection can be disconnected before the system clears all subscriber session information associated with that diameter endpoint. If the connection is re-established within the fatal grace time period, session information is not cleared. A value of 0 means if the PCRF is disconnected, session information is cleared immediately.", + "type": "integer", + "minimum": 0, + "default": 500 + }, + "messageMaxRetransmits": { + "description": "Specifies the maximum number of times that messages can be retransmitted from the BIG-IP system to the PCRF", + "type": "integer", + "minimum": 0, + "default": 2 + }, + "messageRetransmitDelay": { + "description": "Specifies the number of milliseconds to wait before retransmitting unanswered messages in case of failure from the BIG-IP system to the PCRF over the Gx interface", + "type": "integer", + "minimum": 0, + "default": 1500 + }, + "originHost": { + "description": "Specifies the host name of the PCRF or external policy server, for example, pcrf.xnet.com", + "type": "string" + }, + "originRealm": { + "description": "Specifies the realm name or network in which the PCRF resides, for example, xnet.com", + "type": "string" + }, + "protocolProfileGx": { + "description": "Specifies the protocol profile to be used when you enable subscriber discovery. The PEM protocol profile defines mapping of Diameter Gx AVPs to subscriber ID and other PEM subscriber session attributes. The default BIG-IP reference values vary between versions. BIGIP versions 14.1 and above begin with 'sys_diam' (e.g. _sys_diam_proto_default).", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Enforcement_Profile_Gx" + } + ] + }, + "productName": { + "description": "Specifies the value of the string used in the product name attribute value pair (AVP), in capabilities exchange message in the diameter when communicating with the PCRF", + "type": "string", + "default": "BIG-IP" + }, + "supportedApps": { + "description": "Specifies the diameter endpoint you would like to provision. You can select Gx, Gy or SD. Gx and SD are mutually exclusive.", + "type": "array", + "items": { + "type": "string", + "enum": [ + "Gx", + "Gy", + "Sd" + ] + }, + "minItems": 1, + "uniqueItems": true + } + }, + "required": [ + "class", + "supportedApps" + ], + "additionalProperties": false + }, + "Enforcement_iRule": { + "title": "Enforcement_iRule", + "description": "Specifies or configures an iRule for use in Enforcement Policies", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Enforcement_iRule" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "expand": { + "title": "Expand", + "description": "If true (default), expand backquoted variables in iRule", + "type": "boolean", + "default": true + }, + "iRule": { + "$ref": "#/definitions/IRule_Core" + } + }, + "additionalProperties": false, + "required": [ + "class", + "iRule" + ] + }, + "Enforcement_Radius_AAA_Profile": { + "title": "Enforcement_Radius_AAA_Profile", + "description": "Configures a radius AAA profile", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "pem" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Enforcement_Radius_AAA_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "parentProfile": { + "description": "Specifies the name of the object to inherit the settings from", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Enforcement_Radius_AAA_Profile" + } + ], + "default": { + "bigip": "/Common/radiusaaa" + } + }, + "retransmissionTimeout": { + "description": "The number of seconds to wait before resending authentication or accounting transaction messages to the RADIUS server", + "type": "integer", + "minimum": 0, + "maximum": 60, + "default": 5 + }, + "sharedSecret": { + "description": "Specifies the shared secret of the RADIUS server used for authentication or accounting", + "type": "object", + "properties": { + "allowReuse": { + "description": "If true, other declaration objects may reuse this value", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Secret" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "object" + } + }, + { + "f5PostProcess": { + "tag": "secret" + } + } + ] + }, + "password": { + "description": "The password of the RADIUS AAA profile for RADIUS server authentication", + "type": "object", + "properties": { + "allowReuse": { + "description": "If true, other declaration objects may reuse this value", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Secret" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "object" + } + }, + { + "f5PostProcess": { + "tag": "secret" + } + } + ] + }, + "transactionTimeout": { + "description": "The number of seconds to wait before resending authentication or accounting transaction messages to the RADIUS server", + "type": "integer", + "minimum": 5, + "maximum": 300, + "default": 30 + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "Enforcement_Profile": { + "title": "Enforcement_Profile", + "description": "Configures a subscriber policy manager profile", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "pem" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Enforcement_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "parentProfile": { + "description": "Specifies the name of the object to inherit the settings from", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Enforcement_Profile" + } + ], + "default": { + "bigip": "/Common/spm" + } + }, + "policiesGlobalHighPrecedence": { + "description": "Adds, deletes, or replaces a set of the policies", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Enforcement_Policy" + } + }, + "policiesGlobalLowPrecedence": { + "description": "Adds, deletes, or replaces a set of the policies", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Enforcement_Policy" + } + }, + "policiesUnknownSubscribers": { + "description": "Adds, deletes, or replaces a set of the policies", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Enforcement_Policy" + } + }, + "connectionOptimizationEnabled": { + "description": "Specifies whether connection optimization is enabled or not", + "type": "boolean", + "default": true + }, + "connectionOptimizationService": { + "$ref": "#/definitions/Pointer_Service" + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "Enforcement_Subscriber_Management_Profile": { + "title": "Enforcement_Subscriber_Management_Profile", + "description": "Configures a subscriber management profile", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "pem" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Enforcement_Subscriber_Management_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "parentProfile": { + "description": "Specifies the name of the object to inherit the settings from", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Enforcement_Subscriber_Management_Profile" + } + ], + "default": { + "bigip": "/Common/subscriber-mgmt" + } + }, + "dhcpLeaseQuery": { + "$ref": "#/definitions/Enforcement_Subscriber_Management_Profile_DHCP" + }, + "serverSideSessionsEnabled": { + "description": "Specifies the session is created based on server side IP when the server side traffic comes and is enabled", + "type": "boolean", + "default": true + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "Enforcement_Subscriber_Management_Profile_DHCP": { + "description": "Configures DHCP lease query settings for a subscriber management profile", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "pem" + ] + }, + "properties": { + "enabled": { + "description": "Specifies the subscriber management settings use DHCP lease query to communicate with DHCP servers to obtain DHCP lease information for the unknown IP address and creates a new policy enforcement session using the lease information received", + "type": "boolean", + "default": true + }, + "service": { + "$ref": "#/definitions/Pointer_Service" + } + }, + "required": [ + "service" + ], + "additionalProperties": false + }, + "Enforcement_Listener": { + "title": "Enforcement_Listener", + "description": "Configures an enforcement data plane listener", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "pem" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Enforcement_Listener" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "enforcementProfile": { + "$ref": "#/definitions/Pointer_Enforcement_Profile" + }, + "subscriberManagementProfile": { + "$ref": "#/definitions/Pointer_Enforcement_Subscriber_Management_Profile" + }, + "services": { + "description": "A set of virtual servers", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Service" + }, + "minItems": 1 + } + }, + "required": [ + "class", + "enforcementProfile", + "services" + ], + "additionalProperties": false + }, + "Enforcement_Interception_Endpoint": { + "title": "Enforcement_Interception_Endpoint", + "description": "Configures an interception endpoint to clone all traffic", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "pem" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Enforcement_Interception_Endpoint" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "persistence": { + "description": "Specifies the persistence that is based on either the source or destination IP addresses only", + "type": "string", + "enum": [ + "destination-ip", + "source-ip", + "disabled" + ], + "default": "disabled" + }, + "pool": { + "$ref": "#/definitions/Pointer_Pool" + } + }, + "required": [ + "class", + "pool" + ], + "additionalProperties": false + }, + "Enforcement_Format_Script": { + "title": "Enforcement_Format_Script", + "description": "Specifies a script using TCL syntax that defines a custom format for HSL reporting applied in an enforcement policy rule. The format and fields available differ depending on whether you are using session-based or flow-based reporting in the rule.", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "pem" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Enforcement_Format_Script" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "definition": { + "description": "TCL script text", + "type": "string" + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "Enforcement_Forwarding_Endpoint": { + "title": "Enforcement_Forwarding_Endpoint", + "description": "Configures an forwarding endpoint to specify PEM policy forwarding actions", + "type": "object", + "f5PostProcess": { + "tag": "modules", + "data": [ + "pem" + ] + }, + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Enforcement_Forwarding_Endpoint" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "pool": { + "$ref": "#/definitions/Pointer_Pool" + }, + "SNATPool": { + "$ref": "#/definitions/Pointer_SNAT_Pool" + }, + "sourcePortAction": { + "description": "Specifies whether the system preserves the source port of the connection", + "type": "string", + "enum": [ + "change", + "preserve", + "preserve-strict" + ], + "default": "preserve" + }, + "addressTranslationEnabled": { + "description": "Specifies, when enabled, the system translates the original destination address of the virtual server. When disabled, specifies the system uses the address without translation.", + "type": "boolean", + "default": false + }, + "portTranslationEnabled": { + "description": "Specifies, when enabled, the system translates the original destination port. When disabled, specifies the system uses the original destination port without translation.", + "type": "boolean", + "default": false + }, + "defaultPersistenceType": { + "description": "Specifies a persistence method for the pool member selection. If you have multiple pool members and want specific traffic to go to the same pool member, select the appropriate IP address type.", + "type": "string", + "enum": [ + "destination-ip", + "disabled", + "hash", + "source-ip" + ], + "default": "disabled" + }, + "fallbackPersistenceType": { + "description": "Specifies the fallback persistence method that is applied when default persistence fails. If you have multiple pool members and want specific traffic to go to the same pool member, select the appropriate IP address type.", + "type": "string", + "enum": [ + "destination-ip", + "disabled", + "source-ip" + ], + "default": "disabled" + }, + "persistenceHashSettings": { + "allOf": [ + { + "$ref": "#/definitions/Enforcement_Forwarding_Endpoint_Hash_Settings" + } + ], + "default": {} + } + }, + "required": [ + "class", + "pool" + ], + "additionalProperties": false + }, + "Enforcement_Forwarding_Endpoint_Hash_Settings": { + "description": "Specifies the settings for the hash persistence method", + "type": "object", + "properties": { + "length": { + "description": "Specifies the length of the source string used to calculate the hash value", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 1024 + }, + "offset": { + "description": "Specifies the offset, in bytes, from start of the source string to calculate the hash value", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 0 + }, + "tclScript": { + "description": "The results from this TCL script are used to calculate the hash value. If no script is specified, the URI is used instead.", + "type": "string" + } + }, + "required": [], + "additionalProperties": false + }, + "Enforcement_Service_Chain_Endpoint": { + "title": "Enforcement_Service_Chain_Endpoint", + "description": "Configures service chain endpoint definitions for the Policy Enforcement Manager (PEM)", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Enforcement_Service_Chain_Endpoint" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "serviceEndpoints": { + "description": "Specifies a list of forwarding endpoints that define where to send traffic on the way to its final destination. This way, the system can route traffic to other servers that can provide value-added services. Traffic goes to the endpoints in the order in which they are listed.", + "type": "array", + "items": { + "$ref": "#/definitions/Enforcement_Service_Chain_Endpoint_Service_Endpoint" + } + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "Enforcement_Service_Chain_Endpoint_Service_Endpoint": { + "description": "Configures an individual service chain endpoint", + "type": "object", + "properties": { + "name": { + "description": "Specify the name of the service endpoint where the traffic is going to", + "type": "string" + }, + "forwardingEndpoint": { + "$ref": "#/definitions/Pointer_Enforcement_Forwarding_Endpoint" + }, + "sourceVLAN": { + "$ref": "#/definitions/Pointer_VLAN" + }, + "serviceOption": { + "description": "Specifies the service option in case the service endpoint is not accessible through the network, for forwarding endpoint. For ICAP service endpoint, the service endpoint works as a fallback action for non-HTTP traffic. Select \"optional\" if you want to skip the service endpoint. Select \"mandatory\" if you want all traffic flows dropped.", + "type": "string", + "enum": [ + "mandatory", + "optional" + ], + "default": "mandatory" + }, + "internalService": { + "description": "Specifies the internal ICAP virtual server", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Service" + } + ] + }, + "internalServiceICAPType": { + "description": "Specifies the ICAP adaptation type. Select \"request\" to send only HTTP requests to ICAP server. Select \"response\" to send only HTTP responses to ICAP server. Select \"both\" to have both requests and responses.", + "type": "string", + "enum": [ + "request", + "response", + "both", + "none" + ] + }, + "steeringPolicy": { + "$ref": "#/definitions/Pointer_Enforcement_Policy" + } + }, + "dependencies": { + "internalServiceICAPType": [ + "internalService" + ] + }, + "required": [ + "sourceVLAN" + ], + "additionalProperties": false + }, + "Pointer_Address_List": { + "description": "Reference to a firewall address list or net address list", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to firewall address list or net address list declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Firewall_Address_List", + "Net_Address_List" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP firewall address list or net address list", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security firewall address-list", + "query net address-list" + ] + } + } + ] + }, + "Pointer_Address_Discovery": { + "description": "Reference to a Address Discovery", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to Address Discovery declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Address_Discovery" + ] + } + }, + "required": [ + "class" + ] + } + } + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1 + }, + "Pointer_ALG_Log_Profile": { + "description": "Reference to a application layer gateway log profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to application layer gateway log profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "ALG_Log_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP application layer gateway log profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm alg-log-profile" + ] + } + } + ] + }, + "Pointer_API_Protection_Profile": { + "description": "Reference to a API_Protection_Profile", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP API_Protection_Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query api-protection profile apiprotection" + ] + } + } + ] + }, + "Pointer_Bandwidth_Control_Policy": { + "description": "Reference to a bandwidth control policy", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to bandwidth control policy declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Bandwidth_Control_Policy" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP bandwidth control policy", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query net bwc policy" + ] + } + } + ] + }, + "Pointer_Idle_Timeout_Policy": { + "description": "Reference to a idle timeout policy", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to idle timeout policy declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Idle_Timeout_Policy" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP idle timeout policy", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query net timer-policy" + ] + } + } + ] + }, + "Pointer_Denylist_Category": { + "description": "Reference to a denylist category", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP denylist category", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security ip-intelligence blacklist-category" + ] + } + } + ] + }, + "Pointer_Bot_Defense_Profile": { + "description": "Reference to a bot defense profile", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP bot defense profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security bot-defense profile" + ] + } + } + ] + }, + "Pointer_Bot_Signature": { + "description": "Reference to a bot signature", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP bot signature", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security dos bot-signature", + "query security bot-defense signature" + ] + } + } + ] + }, + "Pointer_Bot_Signature_Category": { + "description": "Reference to a bot signature category", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP bot signature category", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security dos bot-signature-category", + "query security bot-defense signature-category" + ] + } + } + ] + }, + "Pointer_Cipher_Group": { + "description": "Reference to a cipher group", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to cipher group declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Cipher_Group" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP cipher group", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm cipher group" + ] + } + } + ] + }, + "Pointer_Cipher_Rule": { + "description": "Reference to a cipher rule", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to cipher rule declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Cipher_Rule" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP cipher rule", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm cipher rule" + ] + } + } + ] + }, + "Pointer_Classification_Application": { + "description": "Reference to a application classification", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP application classification", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm classification application" + ] + } + } + ] + }, + "Pointer_Classification_Category": { + "description": "Reference to a category classification", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP category classification", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm classification category" + ] + } + } + ] + }, + "Pointer_Classification_Preset": { + "description": "Reference to a classification preset", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP classification preset", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm classification ce" + ] + } + } + ] + }, + "Pointer_Classification_Profile": { + "description": "Reference to a classification profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to classification profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Classification_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP classification profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile classification" + ] + } + } + ] + }, + "Pointer_DNS_Cache": { + "description": "Reference to a DNS cache", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to DNS cache declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "DNS_Cache" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP DNS cache", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm dns cache resolver", + "query ltm dns cache transparent", + "query ltm dns cache validating-resolver" + ] + } + } + ] + }, + "Pointer_Data_Group_File": { + "description": "Reference to a Data Group File", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP Data Group File", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys file data-group" + ] + } + } + ] + }, + "Pointer_Data_Group": { + "description": "Reference to a Data Group", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to Data Group declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Data_Group" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP Data Group", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm data-group internal", + "query ltm data-group external" + ] + } + } + ] + }, + "Pointer_DNS_Listener": { + "description": "Reference to a DNS Listener", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to DNS Listener declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "DNS_Listener" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP DNS Listener", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query gtm listener" + ] + } + } + ] + }, + "Pointer_DNS_Logging_Profile": { + "description": "Reference to a DNS logging profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to DNS logging profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "DNS_Logging_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP DNS logging profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile dns-logging" + ] + } + } + ] + }, + "Pointer_DNS_Nameserver": { + "description": "Reference to a DNS nameserver", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to DNS nameserver declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "DNS_Nameserver" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP DNS nameserver", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm dns nameserver" + ] + } + } + ] + }, + "Pointer_DNS_Profile": { + "description": "Reference to a DNS profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to DNS profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "DNS_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP DNS profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile dns" + ] + } + } + ] + }, + "Pointer_DNS_Security_Profile": { + "description": "Reference to a DNS security profile", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP DNS security profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security dns profile" + ] + } + } + ] + }, + "Pointer_DNS_TSIG_Key": { + "description": "Reference to a DNS TSIG key", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to DNS TSIG key declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "DNS_TSIG_Key" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP DNS TSIG key", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm dns tsig-key" + ] + } + } + ] + }, + "Pointer_DNS_Zone": { + "description": "Reference to a DNS zone", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to DNS zone declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "DNS_Zone" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP DNS zone", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm dns zone" + ] + } + } + ] + }, + "Pointer_DOS_Profile": { + "description": "Reference to a DOS Profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to DOS Profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "DOS_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP DOS Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security dos profile" + ] + } + } + ] + }, + "Pointer_Endpoint_Policy": { + "oneOf": [ + { + "description": "AS3 pointer to endpoint policy declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Endpoint_Policy" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + { + "description": "Reference to a endpoint policy", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to endpoint policy declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Endpoint_Policy" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP endpoint policy", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm policy" + ] + } + } + ] + } + ] + }, + "Pointer_Enforcement_Format_Script": { + "description": "Reference to a format script", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to format script declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Enforcement_Format_Script" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP format script", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query pem reporting format-script" + ] + } + } + ] + }, + "Pointer_Enforcement_Forwarding_Endpoint": { + "description": "Reference to a forwarding endpoint", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to forwarding endpoint declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Enforcement_Forwarding_Endpoint" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP forwarding endpoint", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query pem forwarding-endpoint" + ] + } + } + ] + }, + "Pointer_Enforcement_Interception_Endpoint": { + "description": "Reference to a interception endpoint", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to interception endpoint declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Enforcement_Interception_Endpoint" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP interception endpoint", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query pem interception-endpoint" + ] + } + } + ] + }, + "Pointer_Enforcement_iRule": { + "description": "Reference to a enforcement iRule", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to enforcement iRule declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Enforcement_iRule" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP PEM iRule", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query pem irule" + ] + } + } + ] + }, + "Pointer_Enforcement_Policy": { + "description": "Reference to a enforcement policy", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to enforcement policy declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Enforcement_Policy" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP PEM policy", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query pem policy" + ] + } + } + ] + }, + "Pointer_Enforcement_Diameter_Endpoint_Profile": { + "description": "Reference to a enforcement profile diameter endpoint", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to enforcement profile diameter endpoint declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Enforcement_Diameter_Endpoint_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP enforcement profile diameter endpoint", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query pem profile diameter-endpoint" + ] + } + } + ] + }, + "Pointer_Enforcement_Profile_Gx": { + "description": "Reference to a enforcement profile gx", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP enforcement profile gx", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query pem protocol profile gx" + ] + } + } + ] + }, + "Pointer_Enforcement_Radius_AAA_Profile": { + "description": "Reference to a enforcement profile radius aaa", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to enforcement profile radius aaa declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Enforcement_Radius_AAA_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP enforcement profile radius aaa", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query pem profile radius-aaa" + ] + } + } + ] + }, + "Pointer_Enforcement_Profile": { + "description": "Reference to a enforcement profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to enforcement profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Enforcement_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP PEM spm policy", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query pem profile spm" + ] + } + } + ] + }, + "Pointer_Enforcement_Rating_Group": { + "description": "Reference to a quota rating group", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP quota rating group", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query pem quota-mgmt rating-group" + ] + } + } + ] + }, + "Pointer_Enforcement_Service_Chain_Endpoint": { + "description": "Reference to a service chain endpoint", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to service chain endpoint declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Enforcement_Service_Chain_Endpoint" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP service chain endpoint", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query pem service-chain-endpoint" + ] + } + } + ] + }, + "Pointer_Enforcement_Subscriber_Management_Profile": { + "description": "Reference to a enforcement subscriber management profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to enforcement subscriber management profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Enforcement_Subscriber_Management_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP PEM subscriber-mgmt policy", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query pem profile subscriber-mgmt" + ] + } + } + ] + }, + "Pointer_Enforcement_Protocol_Profile_Radius": { + "description": "Reference to a radius protocol profile", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP radius protocol profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query pem protocol profile radius" + ] + } + } + ] + }, + "Pointer_Existing_TLS_Server_Profile": { + "description": "Reference to a TLS Server profile", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP TLS Server profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile client-ssl" + ] + } + } + ] + }, + "Pointer_Existing_TLS_Client_Profile": { + "description": "Reference to a TLS Client profile", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP TLS Client profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile server-ssl" + ] + } + } + ] + }, + "Pointer_Firewall_Address_List": { + "description": "Reference to a firewall address list", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to firewall address list declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Firewall_Address_List" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP firewall address list", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security firewall address-list" + ] + } + } + ] + }, + "Pointer_Firewall_Policy": { + "description": "Reference to a firewall (AFM) policy", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to firewall (AFM) policy declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Firewall_Policy" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP firewall (AFM) policy", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security firewall policy" + ] + } + } + ] + }, + "Pointer_Firewall_Port_List": { + "description": "Reference to a firewall port list", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to firewall port list declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Firewall_Port_List" + ] + } + }, + "required": [ + "class" + ] + } + } + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1 + }, + "Pointer_Firewall_Rule_List": { + "description": "Reference to a firewall rule list", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to firewall rule list declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Firewall_Rule_List" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP firewall rule list", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security firewall rule-list" + ] + } + } + ] + }, + "Pointer_FPS_Profile": { + "description": "Reference to a FPS Profile", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP FPS Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security anti-fraud profile" + ] + } + } + ] + }, + "Pointer_FTP_Profile": { + "description": "Reference to a FTP protocol profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to FTP protocol profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "FTP_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP FTP protocol profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile ftp" + ] + } + } + ] + }, + "Pointer_GSLB_Data_Center": { + "description": "Reference to a GSLB data center", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to GSLB data center declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "GSLB_Data_Center" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP GSLB data center", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query gtm datacenter" + ] + } + } + ] + }, + "Pointer_GSLB_Domain_A": { + "description": "Reference to a GSLB domain", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to GSLB domain declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "GSLB_Domain" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP GSLB domain", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query gtm wideip a" + ] + } + } + ] + }, + "Pointer_GSLB_Domain_AAAA": { + "description": "Reference to a GSLB domain", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to GSLB domain declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "GSLB_Domain" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP GSLB domain", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query gtm wideip aaaa" + ] + } + } + ] + }, + "Pointer_GSLB_Domain_CNAME": { + "description": "Reference to a GSLB domain", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to GSLB domain declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "GSLB_Domain" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP GSLB domain", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query gtm wideip cname" + ] + } + } + ] + }, + "Pointer_GSLB_Domain_MX": { + "description": "Reference to a GSLB domain", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to GSLB domain declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "GSLB_Domain" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP GSLB domain", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query gtm wideip mx" + ] + } + } + ] + }, + "Pointer_GSLB_Monitor": { + "description": "Reference to a GSLB monitor", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to GSLB monitor declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "GSLB_Monitor" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP GSLB monitor", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query gtm monitor bigip", + "query gtm monitor bigip-link", + "query gtm monitor external", + "query gtm monitor firepass", + "query gtm monitor ftp", + "query gtm monitor gateway-icmp", + "query gtm monitor gtp", + "query gtm monitor http", + "query gtm monitor https", + "query gtm monitor http2", + "query gtm monitor imap", + "query gtm monitor ldap", + "query gtm monitor mssql", + "query gtm monitor mysql", + "query gtm monitor nntp", + "query gtm monitor none", + "query gtm monitor oracle", + "query gtm monitor pop3", + "query gtm monitor postgresql", + "query gtm monitor radius", + "query gtm monitor radius-accounting", + "query gtm monitor real-server", + "query gtm monitor scripted", + "query gtm monitor sip", + "query gtm monitor smtp", + "query gtm monitor snmp", + "query gtm monitor snmp-link", + "query gtm monitor soap", + "query gtm monitor tcp", + "query gtm monitor tcp-half-open", + "query gtm monitor udp", + "query gtm monitor wap", + "query gtm monitor wmi" + ] + } + } + ] + }, + "Pointer_GSLB_Pool": { + "description": "Reference to a GSLB pool", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to GSLB pool declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "GSLB_Pool" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP GSLB pool", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query gtm pool a", + "query gtm pool aaaa", + "query gtm pool cname", + "query gtm pool mx" + ] + } + } + ] + }, + "Pointer_GSLB_Prober_Pool": { + "description": "Reference to a GSLB pool", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to GSLB pool declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "GSLB_Prober_Pool" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP GSLB pool", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query gtm prober-pool" + ] + } + } + ] + }, + "Pointer_GSLB_Server": { + "description": "Reference to a GSLB server", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to GSLB server declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "GSLB_Server" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP GSLB server", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query gtm server" + ] + } + } + ] + }, + "Pointer_GSLB_Server_Device": { + "description": "Reference to a GSLB server device", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to GSLB server device declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "GSLB_Server_Device" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP GSLB server device", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query gtm server devices" + ] + } + } + ] + }, + "Pointer_GSLB_Topology_Region": { + "description": "Reference to a GSLB Topology Region", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to GSLB Topology Region declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "GSLB_Topology_Region" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP GSLB Topology Region", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query gtm region" + ] + } + } + ] + }, + "Pointer_GSLB_Virtual_Server": { + "description": "Reference to a GSLB virtual server", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to GSLB virtual server declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "GSLB_Virtual_Server" + ] + } + }, + "required": [ + "class" + ] + } + } + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1 + }, + "Pointer_HTML_Profile": { + "description": "Reference to a HTML_Profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to HTML_Profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "HTML_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP HTML_Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile html" + ] + } + } + ] + }, + "Pointer_HTML_Rule": { + "description": "Reference to a HTML_Rule", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to HTML_Rule declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "HTML_Rule" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP HTML_Rule", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm html-rule comment-raise-event", + "query ltm html-rule comment-remove", + "query ltm html-rule tag-append-html", + "query ltm html-rule tag-prepend-html", + "query ltm html-rule tag-raise-event", + "query ltm html-rule tag-remove", + "query ltm html-rule tag-remove-attribute" + ] + } + } + ] + }, + "Pointer_HTTP2_Profile": { + "description": "Reference to a HTTP/2 Profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to HTTP/2 Profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "HTTP2_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP HTTP/2 Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile http2" + ] + } + } + ] + }, + "Pointer_ILX_Profile": { + "description": "Reference to a iRules LX Profile", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP iRules LX Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile ilx" + ] + } + } + ] + }, + "Pointer_Integrated_Bot_Defense_Profile": { + "description": "Reference to a Integrated Bot Defense Profile", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP Integrated Bot Defense Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query saas bd profile" + ] + } + } + ] + }, + "Pointer_IP_Intelligence_Policy": { + "description": "Reference to a IP Intelligence Policy", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP IP Intelligence Policy", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security ip-intelligence policy" + ] + } + } + ] + }, + "Pointer_NAT_Source_Translation": { + "description": "Reference to a NAT Source Translation", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to NAT Source Translation declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "NAT_Source_Translation" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP NAT Source Translation", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security nat source-translation" + ] + } + } + ] + }, + "Pointer_Net_Address_List": { + "description": "Reference to a net address list", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to net address list declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Net_Address_List" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP net address list", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query net address-list" + ] + } + } + ] + }, + "Pointer_Net_Port_List": { + "description": "Reference to a net port list", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to net port list declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Net_Port_List" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP net port list", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query net port-list" + ] + } + } + ] + }, + "Pointer_Persist_Profile": { + "description": "Reference to a Persist Profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to Persist Profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Persist" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP Persist Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm persistence cookie", + "query ltm persistence dest-addr", + "query ltm persistence hash", + "query ltm persistence host", + "query ltm persistence msrdp", + "query ltm persistence sip", + "query ltm persistence source-addr", + "query ltm persistence ssl", + "query ltm persistence universal" + ] + } + } + ] + }, + "Pointer_RTSP_Profile": { + "description": "Reference to a Real Time Streaming Protocol Profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to Real Time Streaming Protocol Profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "RTSP_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP Real Time Streaming Protocol Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile rtsp" + ] + } + } + ] + }, + "Pointer_Access_Profile": { + "description": "Reference to a Access Profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to Access Profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Access_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP Access Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query apm profile access" + ] + } + } + ] + }, + "Pointer_Per_Request_Access_Policy": { + "description": "Reference to a Per Request Access Policy", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to Per Request Access Policy declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Per_Request_Access_Policy" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP Per Request Access Policy", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query apm policy access-policy" + ] + } + } + ] + }, + "Pointer_Connectivity_Profile": { + "description": "Reference to a Connectivity Profile", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP Connectivity Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query apm profile connectivity" + ] + } + } + ] + }, + "Pointer_IP_Other_Profile": { + "description": "Reference to a ipother profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to ipother profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "IP_Other_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP ipother profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile ipother" + ] + } + } + ] + }, + "Pointer_Radius_Profile": { + "description": "Reference to a radius profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to radius profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Radius_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP radius profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile radius" + ] + } + } + ] + }, + "Pointer_Persist": { + "description": "Reference to a persistence profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to persistence profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Persist" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP persistence profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm persistence" + ] + } + } + ] + }, + "Pointer_Analytics_Profile": { + "description": "Reference to a Analytics_Profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to Analytics_Profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Analytics_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP Analytics_Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile analytics" + ] + } + } + ] + }, + "Pointer_Analytics_TCP_Profile": { + "description": "Reference to a Analytics_TCP_Profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to Analytics_TCP_Profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Analytics_TCP_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP Analytics_TCP_Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile tcp-analytics" + ] + } + } + ] + }, + "Pointer_FIX_Profile": { + "description": "Reference to a FIX profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to FIX profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "FIX_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP FIX profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile fix" + ] + } + } + ] + }, + "Pointer_ICAP_Profile": { + "description": "Reference to a ICAP Profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to ICAP Profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "ICAP_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP ICAP Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile icap" + ] + } + } + ] + }, + "Pointer_Multiplex_Profile": { + "description": "Reference to a Multiplex profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to Multiplex profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Multiplex_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP Multiplex profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile one-connect" + ] + } + } + ] + }, + "Pointer_NTLM_Profile": { + "description": "Reference to a NT LAN Manager profile", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP NT LAN Manager profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile ntlm" + ] + } + } + ] + }, + "Pointer_PPTP_Profile": { + "description": "Reference to a PPTP_Profile", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP PPTP_Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile pptp" + ] + } + } + ] + }, + "Pointer_Rewrite_Profile": { + "description": "Reference to a Rewrite Profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to Rewrite Profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Rewrite_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP Rewrite Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile rewrite" + ] + } + } + ] + }, + "Pointer_Protocol_Inspection_Profile": { + "description": "Reference to a Protocol Inspection Profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to Protocol Inspection Profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Protocol_Inspection_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP Protocol Inspection Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security protocol-inspection profile" + ] + } + } + ] + }, + "Pointer_Statistics_Profile": { + "description": "Reference to a Statistics Profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to Statistics Profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Statistics_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP Statistics Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile statistics" + ] + } + } + ] + }, + "Pointer_TCP_Profile": { + "description": "Reference to a TCP profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to TCP profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "TCP_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP TCP profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile tcp" + ] + } + } + ] + }, + "Pointer_TLS_Client": { + "description": "Reference to a TLS Client", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to TLS Client declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "TLS_Client" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP TLS Client", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile server-ssl" + ] + } + } + ] + }, + "Pointer_Port_List": { + "description": "Reference to a firewall port list or net port list", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to firewall port list or net port list declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Firewall_Port_List", + "Net_Port_List" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP firewall port list or net port list", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security firewall port-list", + "query net port-list" + ] + } + } + ] + }, + "Pointer_Request_Adapt_Profile": { + "description": "Reference to a Request Adapt Profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to Request Adapt Profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Adapt_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP Request Adapt Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile request-adapt" + ] + } + } + ] + }, + "Pointer_Response_Adapt_Profile": { + "description": "Reference to a Response Adapt Profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to Response Adapt Profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Adapt_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP Response Adapt Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile response-adapt" + ] + } + } + ] + }, + "Pointer_Route_Domain": { + "description": "Reference to a route domain", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP route domain", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query net route-domain" + ] + } + } + ] + }, + "Pointer_SCTP_Profile": { + "description": "Reference to a SCTP Profile", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP SCTP Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile sctp" + ] + } + } + ] + }, + "Pointer_Security_Log_Profile": { + "description": "Reference to a Security Log Profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to Security Log Profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Security_Log_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP Security Log Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security log profile" + ] + } + } + ] + }, + "Pointer_Service": { + "description": "Reference to a service", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to service declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Service_Forwarding", + "Service_HTTPS", + "Service_HTTP", + "Service_TCP", + "Service_UDP", + "Service_L4", + "Service_Generic" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP virtual server", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm virtual" + ] + } + } + ] + }, + "Pointer_SNAT_Pool": { + "description": "Reference to a snat pool", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to snat pool declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "SNAT_Pool" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP snat pool", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm snatpool" + ] + } + } + ] + }, + "Pointer_SNAT_Translation": { + "description": "Reference to a snat translation", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to snat translation declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "SNAT_Translation" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP snat translation", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm snat-translation" + ] + } + } + ] + }, + "Pointer_SOCKS_Profile": { + "description": "Reference to a SOCKS profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to SOCKS profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "SOCKS_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP SOCKS profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile socks" + ] + } + } + ] + }, + "Pointer_SSL_CRL_File": { + "description": "Reference to a SSL CRL file", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP SSL CRL file", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys file ssl-crl" + ] + } + } + ] + }, + "Pointer_Stream_Profile": { + "description": "Reference to a stream profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to stream profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Stream_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP stream profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile stream" + ] + } + } + ] + }, + "Pointer_TFTP_Profile": { + "description": "Reference to a TFTP profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to TFTP profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "TFTP_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP TFTP profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile tftp" + ] + } + } + ] + }, + "Pointer_Traffic_Log_Profile": { + "description": "Reference to a traffic log profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to traffic log profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Traffic_Log_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP Request Logging Profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile request-log" + ] + } + } + ] + }, + "Pointer_Tunnel": { + "description": "Reference to a network tunnel", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP network tunnel", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query net tunnels endpoint", + "query net tunnels etherip", + "query net tunnels fec", + "query net tunnels fec-stat", + "query net tunnels geneve", + "query net tunnels gre", + "query net tunnels ipip", + "query net tunnels ipsec", + "query net tunnels lw4o6", + "query net tunnels map", + "query net tunnels ppp", + "query net tunnels tcp-forward", + "query net tunnels tunnel", + "query net tunnels v6rd", + "query net tunnels vxlan", + "query net tunnels wccp", + "query net vlan" + ] + } + } + ] + }, + "Pointer_Service_Address": { + "description": "Reference to a Service Address", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to Service Address declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Service_Address" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP Service Address", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm virtual-address" + ] + } + } + ] + }, + "Pointer_SSH_Proxy_Profile": { + "description": "Reference to a SSH proxy profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to SSH proxy profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "SSH_Proxy_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP SSH proxy profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security ssh profile" + ] + } + } + ] + }, + "Pointer_SIP_Profile": { + "description": "Reference to a SIP profile", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP SIP profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile sip" + ] + } + } + ] + }, + "Pointer_UDP_Profile": { + "description": "Reference to a UDP profile", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to UDP profile declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "UDP_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP UDP profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile udp" + ] + } + } + ] + }, + "Pointer_VDI_Profile": { + "description": "Reference to a VDI profile", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP VDI profile", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query apm profile vdi" + ] + } + } + ] + }, + "Pointer_VLAN": { + "description": "Reference to a VLAN", + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP VLAN", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query net vlan" + ] + } + } + ] + }, + "Pointer_WAF_Policy": { + "description": "Reference to a WAF policy", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to WAF policy declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "WAF_Policy" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP WAF policy", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query asm policy" + ] + } + } + ] + }, + "Analytics_Profile": { + "title": "Analytics Profile", + "type": "object", + "description": "HTTP Analytics profile with configurable options", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Analytics_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "captureFilter": { + "allOf": [ + { + "$ref": "#/definitions/Capture_Filter" + } + ], + "default": {} + }, + "collectGeo": { + "title": "Collect Countries", + "description": "Specifies that the system collects statistics of the names of the countries from which that traffic was sent", + "type": "boolean", + "default": false + }, + "collectClientSideStatistics": { + "title": "Collect Client-Side Statistics", + "description": "Specifies that the system collects statistics regarding the HTTP request and response times", + "type": "boolean", + "default": false + }, + "collectUrl": { + "title": "Collect URL", + "description": "Specifies that the system collects statistics of requested URLs", + "type": "boolean", + "default": false + }, + "collectIp": { + "title": "Collect Client IP Addresses", + "description": "Specifies that the system collects statistics of the IP addresses of where the traffic came from", + "type": "boolean", + "default": false + }, + "collectSubnet": { + "title": "Collect Client Subnet", + "description": "Specifies that the system collects statistics of client subnets", + "type": "boolean", + "default": false + }, + "collectUserAgent": { + "title": "Collect User Agent", + "description": "Specifies that the system collects statistics about browsers used to send traffic", + "type": "boolean", + "default": false + }, + "collectOsAndBrowser": { + "title": "Collect Operating System and Browser", + "description": "Specifies that the system collect statistics about the OSs and Browsers used to send requests", + "type": "boolean", + "default": true + }, + "collectResponseCode": { + "title": "Collect Response Code", + "description": "Specifies that the system collects statistics about the distribution of HTTP response codes returned by the servers", + "type": "boolean", + "default": true + }, + "collectMethod": { + "title": "Collect Method", + "description": "Specifies that the system collects statistics about the distribution of HTTP methods found in requests", + "type": "boolean", + "default": true + }, + "collectMaxTpsAndThroughput": { + "title": "Collect Max TPS and Throughput", + "description": "Specifies that the system collects statistics for the maximum number of transactions per second, and the maximum amount of traffic moving through the system, both request and response throughput values", + "type": "boolean", + "default": false + }, + "collectPageLoadTime": { + "title": "Collect Page Load Time", + "description": "Specifies that the system collects statistics of the round-trip latency between client end-users and the servers", + "type": "boolean", + "default": false + }, + "collectUserSession": { + "title": "Collect User Sessions", + "description": "Specifies that the system collects statistics of the number of unique user sessions in the application traffic, as determined by the value of the configured HTTP cookies found in the requests", + "type": "boolean", + "default": false + }, + "collectedStatsInternalLogging": { + "title": "Collected Statistics Internal Logging", + "description": "Specifies that statistics logs are stored in the system", + "type": "boolean", + "default": true + }, + "collectedStatsExternalLogging": { + "title": "Collected Statistics External Logging", + "description": "Specifies that statistics logs are stored on a remote server", + "type": "boolean", + "default": false + }, + "capturedTrafficInternalLogging": { + "title": "Captured Traffic Internal Logging", + "description": "Specifies that the system captures a portion of the application traffic and sends it to a remote server", + "type": "boolean", + "default": false + }, + "capturedTrafficExternalLogging": { + "title": "Captured Traffic External Logging", + "description": "Specifies that the system captures a portion of the application traffic which can then be viewed on the System >> Logs >> Captured Transactions screen", + "type": "boolean", + "default": false + }, + "sessionCookieSecurity": { + "title": "Session Cookie Security", + "description": "Specify whether to secure session cookies", + "type": "string", + "enum": [ + "ssl-only", + "always-secure", + "never-secure" + ], + "default": "ssl-only" + }, + "sessionTimeoutMinutes": { + "title": "Session Timeout in Minutes", + "description": "The number of minutes of user non-activity ot allow before the system considers the session to be over", + "type": "integer", + "minimum": 5, + "maximum": 60, + "default": 5, + "multipleOf": 5 + }, + "externalLoggingPublisher": { + "$ref": "#/definitions/Pointer_Log_Publisher" + }, + "notificationBySyslog": { + "title": "Notification by syslog", + "description": "Specifies that the system sends notifications to the syslog", + "type": "boolean", + "default": false + }, + "notificationBySnmp": { + "title": "Notification by SNMP", + "description": "Specifies that the system sends notifications as SNMP traps", + "type": "boolean", + "default": false + }, + "notificationByEmail": { + "title": "Notification by Email", + "description": "Specifies that the system sends notifications by e-mail", + "type": "boolean", + "default": false + }, + "notificationEmailAddresses": { + "title": "E-mail Notification Recipients", + "description": "The e-mail addresses of a recipient to whom the system should send email notifications", + "type": "array", + "items": { + "title": "Email address", + "type": "string", + "format": "email" + }, + "uniqueItems": true + }, + "publishIruleStatistics": { + "title": "Publish iRule Statistics", + "description": "Specifies that the system collects and displays statistics according to the expressions written in an iRule", + "type": "boolean", + "default": false + }, + "urlsForStatCollection": { + "title": "URLs for Statistics Collection", + "description": "Specifies the requested URLs for collecting statistics", + "type": "array", + "items": { + "title": "URL", + "type": "string", + "f5PostProcess": { + "tag": "expand" + } + }, + "uniqueItems": true + }, + "countriesForStatCollection": { + "title": "Countries for Statistics Collection", + "description": "Specifies the countries for collecting statistics", + "type": "array", + "items": { + "$ref": "#/definitions/Enum_Country_Analytics" + } + }, + "subnetsForStatCollection": { + "title": "Subnets for Statistics Collection", + "description": "Specifies the requested subnets for collecting statistics", + "type": "array", + "items": { + "title": "Subnet", + "type": "string", + "format": "f5ip" + }, + "uniqueItems": true + } + }, + "dependencies": { + "urlsForStatCollection": { + "properties": { + "collectUrl": { + "const": true + } + } + }, + "countriesForStatCollection": { + "properties": { + "collectGeo": { + "const": true + } + } + }, + "subnetsForStatCollection": { + "properties": { + "collectSubnet": { + "const": true + } + } + } + }, + "required": [ + "class" + ], + "additionalProperties": false, + "f5PostProcess": { + "tag": "modules", + "data": [ + "avr" + ] + } + }, + "Analytics_TCP_Profile": { + "title": "Analytics TCP Profile", + "type": "object", + "description": "TCP Analytics profile with configurable options", + "properties": { + "class": { + "type": "string", + "const": "Analytics_TCP_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "collectCity": { + "title": "Collect City", + "description": "Specifies that the system saves the name of the city with which traffic was exchanged", + "type": "boolean", + "default": false + }, + "collectContinent": { + "title": "Collect Continent", + "description": "Specifies that the system saves the name of the continent with which traffic was exchanged", + "type": "boolean", + "default": true + }, + "collectCountry": { + "title": "Collect Country", + "description": "Specifies that the system saves the name of the country with which traffic was exchanged", + "type": "boolean", + "default": true + }, + "collectedByClientSide": { + "title": "Collected By Client Side", + "description": "Specifies that system collects statistics on the client side", + "type": "boolean", + "default": true + }, + "collectedByServerSide": { + "title": "Collected By Server Side", + "description": "Specifies that system collects statistics on the server side", + "type": "boolean", + "default": true + }, + "collectedStatsExternalLogging": { + "title": "Collected Statistics External Logging", + "description": "Specifies that statistics logs are stored on a remote server", + "type": "boolean", + "default": false + }, + "collectedStatsInternalLogging": { + "title": "Collected Statistics Internal Logging", + "description": "Specifies that statistics logs are stored in the system", + "type": "boolean", + "default": true + }, + "collectNexthop": { + "title": "Collect Next Hop Ethernet Address", + "description": "Specifies that the system saves the address to which the traffic is being routed", + "type": "boolean", + "default": false + }, + "collectPostCode": { + "title": "Collect Post Code", + "description": "Specifies that the system saves the name of the postcode with which traffic was exchanged", + "type": "boolean", + "default": false + }, + "collectRegion": { + "title": "Collect Region", + "description": "Specifies that the system saves the name of the region with which traffic was exchanged", + "type": "boolean", + "default": true + }, + "collectRemoteHostIp": { + "title": "Collect Remote Host IP", + "description": "Specifies that the system collects IP addresses with which traffic was exchanged", + "type": "boolean", + "default": false + }, + "collectRemoteHostSubnet": { + "title": "Collect Remote Host Subnet", + "description": "Specifies that the system saves the address of the subnet with which traffic was exchanged", + "type": "boolean", + "default": true + }, + "externalLoggingPublisher": { + "$ref": "#/definitions/Pointer_Log_Publisher" + } + }, + "required": [ + "class" + ], + "additionalProperties": false, + "f5PostProcess": { + "tag": "modules", + "data": [ + "avr" + ] + } + }, + "Basic_Auth": { + "title": "Basic Authentication", + "type": "object", + "description": "Describes the basic authentication to access a resource", + "properties": { + "method": { + "type": "string", + "description": "Specifies the authentication method", + "enum": [ + "basic" + ] + }, + "username": { + "description": "Specifies the user name for authentication", + "type": "string" + }, + "passphrase": { + "description": "Specifies the password for authentication", + "properties": { + "allowReuse": { + "type": "boolean", + "description": "If true, other declaration objects may reuse this value", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Property_Passphrase" + }, + { + "f5PostProcess": { + "data": "object", + "tag": "fetch" + } + } + ] + } + }, + "required": [ + "method", + "username", + "passphrase" + ], + "additionalProperties": false + }, + "Bearer_Token": { + "title": "Bearer Token Authorization", + "description": "Describes using a bearer token to access a resource", + "type": "object", + "properties": { + "method": { + "description": "Specifies the authentication method", + "type": "string", + "const": "bearer-token" + }, + "token": { + "description": "Specifies the bearer token", + "oneOf": [ + { + "type": "string", + "description": "plain text bearer token", + "minLength": 1 + }, + { + "type": "object", + "allOf": [ + { + "required": [ + "ciphertext" + ] + }, + { + "$ref": "#/definitions/Secret" + } + ] + } + ], + "f5PostProcess": { + "tag": "longSecret" + } + } + }, + "required": [ + "method", + "token" + ], + "additionalProperties": false + }, + "CA_Bundle": { + "title": "CA Bundle", + "description": "Bundle of one or more PKI Certificate-Authority certificates", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "CA_Bundle" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "bundle": { + "description": "Reference to a CA bundle or string of PEM encoded certificates", + "allOf": [ + { + "$ref": "#/definitions/Pointer_F5_String_Or_BIGIP" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "pki-cert" + } + }, + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys file ssl-cert" + ] + } + } + ] + } + }, + "additionalProperties": false, + "required": [ + "class", + "bundle" + ] + }, + "Capture_Filter": { + "title": "Capture Filter", + "description": "Criteria determining when the system captures a portion of the application traffic", + "type": "object", + "properties": { + "requestCapturedParts": { + "title": "Request Captured Parts", + "description": "Specifies which parts of the request data the system captures", + "type": "string", + "enum": [ + "all", + "body", + "headers", + "none" + ], + "default": "none" + }, + "responseCapturedParts": { + "title": "Response Captured Parts", + "description": "Specifies which parts of the response data the system captures", + "type": "string", + "enum": [ + "all", + "body", + "headers", + "none" + ], + "default": "none" + }, + "dosActivity": { + "title": "DoS Activity", + "description": "Specifies whether the system captures traffic data mitigated by the DoS Layer 7 Enforcer, or traffic regardless of DoS activity", + "type": "string", + "enum": [ + "any", + "mitigated-by-dosl7" + ], + "default": "any" + }, + "capturedProtocols": { + "title": "Captured Protocols", + "description": "Specifies whether the system captures traffic data that is sent using any protocol, or a specific type of protocol", + "type": "string", + "enum": [ + "all", + "http", + "https" + ], + "default": "all" + }, + "capturedReadyForJsInjection": { + "title": "Qualified for JavaScript Injection", + "description": "Specifies whether the system captures all traffic data from all transactions or only from transactions that qualify for JavaScript injection", + "type": "string", + "enum": [ + "disabled", + "enabled" + ], + "default": "disabled" + }, + "virtualServers": { + "title": "Virtual Servers", + "description": "Specifies whether the system captures traffic data sent from/to all virtual servers, or only from/to specific virtual servers. If none are specified then all will be collected", + "type": "array", + "items": { + "title": "Virtual Server", + "type": "string" + }, + "uniqueItems": true, + "default": [] + }, + "nodeAddresses": { + "title": "Node Addresses", + "description": "Specifies whether the system captures traffic data sent from/to all nodes, or only from/to specific nodes. If none are specified then all will be collected", + "type": "array", + "items": { + "type": "string" + }, + "uniqueItems": true, + "default": [] + }, + "responseCodes": { + "title": "Response Status Codes", + "description": "Specifies whether the system captures traffic data based on the HTTP response status codes that the requests return. If none are specified then all will be collected", + "type": "array", + "items": { + "title": "Response Status Code", + "type": "integer", + "minimum": 100, + "maximum": 999 + }, + "maxItems": 10, + "uniqueItems": true, + "default": [] + }, + "methods": { + "title": "HTTP Methods", + "description": "Specifies whether the system captures traffic data based on the HTTP method that was requested. If none are specified then all will be collected", + "type": "array", + "items": { + "title": "HTTP Method", + "type": "string" + }, + "maxItems": 10, + "uniqueItems": true, + "default": [] + }, + "urlFilterType": { + "title": "URL Filter Type", + "description": "Specifies how the URL path prefixes are interpreted", + "type": "string", + "enum": [ + "all", + "black-list", + "white-list" + ], + "default": "all" + }, + "urlPathPrefixes": { + "title": "URL Path Prefixes", + "description": "Specifies URLs the filter type is to be applied to. If none are specified then all will be collected", + "type": "array", + "items": { + "title": "URL", + "type": "string", + "f5PostProcess": { + "tag": "expand" + } + }, + "maxItems": 10, + "uniqueItems": true, + "default": [] + }, + "userAgentSubstrings": { + "title": "User Agent Substrings", + "description": "Specifies whether the system captures traffic sent from all browsers, or only traffic sent from a specific browser", + "type": "array", + "items": { + "title": "User Agent Substring", + "type": "string", + "f5PostProcess": { + "tag": "expand" + } + }, + "maxItems": 10, + "uniqueItems": true, + "default": [] + }, + "clientIps": { + "title": "Client IP Addresses", + "description": "Specifies the client IP addresses to collect stats for. If none are specified, then all will be collected", + "type": "array", + "items": { + "title": "Client IP Address", + "type": "string", + "format": "f5ip" + }, + "maxItems": 10, + "uniqueItems": true, + "default": [] + }, + "requestContentFilterSearchPart": { + "title": "Request Content Filter Search Part", + "description": "Specifies the part of the request that should be filtered by the search string", + "type": "string", + "enum": [ + "all", + "headers", + "body", + "none", + "uri" + ], + "default": "none" + }, + "requestContentFilterSearchString": { + "title": "Request Content Filter Search String", + "description": "Specifies the string the request should be searched for", + "type": "string" + }, + "responseContentFilterSearchPart": { + "title": "Response Content Filter Search Part", + "description": "Specifies the part of the response that should be filtered by the search string", + "type": "string", + "enum": [ + "all", + "body", + "headers", + "none" + ], + "default": "none" + }, + "responseContentFilterSearchString": { + "title": "Response Content Filter Search String", + "description": "Specifies the string the response should be searched for", + "type": "string" + } + }, + "dependencies": { + "requestContentFilterSearchString": { + "properties": { + "requestContentFilterSearchPart": { + "not": { + "const": "none" + } + } + } + }, + "responseContentFilterSearchString": { + "properties": { + "responseContentFilterSearchPart": { + "not": { + "const": "none" + } + } + } + } + } + }, + "Certificate": { + "title": "Certificate", + "description": "Configures a Certificate", + "type": "object", + "properties": { + "class": { + "type": "string", + "const": "Certificate" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "certificate": { + "title": "Certificate", + "description": "X.509 public-key certificate", + "allOf": [ + { + "$ref": "#/definitions/Pointer_F5_String_Or_BIGIP" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "pki-cert" + } + }, + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys file ssl-cert" + ] + } + } + ] + }, + "privateKey": { + "title": "Private Key", + "description": "Private key matching certificate's public key (optional)", + "allOf": [ + { + "$ref": "#/definitions/Pointer_F5_String_Or_BIGIP" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "pki-key" + } + }, + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys file ssl-key" + ] + } + } + ] + }, + "chainCA": { + "title": "CA chain", + "description": "Bundle of one or more CA certificates in trust-chain from root CA to certificate (optional)", + "type": [ + "object", + "string" + ], + "anyOf": [ + { + "$ref": "#/definitions/Pointer_F5_String_Or_BIGIP" + }, + { + "$ref": "#/definitions/Pointer_CA_Bundle" + } + ], + "allOf": [ + { + "f5PostProcess": { + "tag": "fetch", + "data": "pki-bundle" + } + }, + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys file ssl-cert" + ] + } + } + ] + }, + "passphrase": { + "title": "Passphrase", + "description": "If supplied, used to decrypt privateKey at runtime (optional)", + "properties": { + "allowReuse": { + "description": "If true, other declaration objects may reuse this value", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Property_Passphrase" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "object" + } + } + ], + "type": "object" + }, + "pkcs12": { + "title": "PKCS#12 certificate+key", + "description": "The pkcs12 value which may be a url to fetch the binary file from or base64 encoded string", + "allOf": [ + { + "$ref": "#/definitions/Pointer_F5_String_Or_BIGIP" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "pkcs12" + } + }, + { + "f5PostProcess": { + "tag": "certExtract" + } + } + ] + }, + "pkcs12Options": { + "title": "PKCS#12 certificate+key Options", + "description": "Options for importing PKCS12 file", + "type": "object", + "properties": { + "keyImportFormat": { + "title": "PKCS#12 Private Key Format", + "description": "Determines the format in which the private key is saved. Default is PKCS#8.", + "type": "string", + "enum": [ + "pkcs8", + "openssl-legacy" + ], + "default": "pkcs8" + }, + "ignoreChanges": { + "title": "Ignore changes", + "description": "Key has to be decrypted and re-encrypted as part of extraction, resulting in a diff. Set to true to exclude the pkcs12 object for subsequent deployments.", + "type": "boolean", + "default": false + }, + "internalOnly": { + "title": "BIG-IP AS3 internal use only", + "description": "BIG-IP AS3 uses this property internally. Any values supplied here will be ignored", + "type": "array", + "items": { + "type": [ + "string", + "number", + "boolean", + "object", + "array" + ] + }, + "readOnly": true + } + } + }, + "staplerOCSP": { + "title": "OCSP Stapler", + "description": "BIG-IP AS3 pointer to OCSP Stapler declaration (optional)", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Certificate_Validator_OCSP" + } + ] + }, + "issuerCertificate": { + "type": "object", + "description": "Specifies the name of the issuer certificate for this certificate", + "allOf": [ + { + "$ref": "#/definitions/Pointer_SSL_Certificate" + } + ] + } + }, + "required": [ + "class" + ], + "additionalProperties": false, + "dependencies": { + "staplerOCSP": { + "required": [ + "issuerCertificate" + ] + } + }, + "if": { + "required": [ + "pkcs12" + ] + }, + "then": { + "dependencies": { + "certificate": { + "not": {} + }, + "privateKey": { + "not": {} + } + } + }, + "else": { + "required": [ + "certificate" + ], + "not": { + "required": [ + "pkcs12" + ] + } + } + }, + "Certificate_Validator_OCSP": { + "title": "Certificate_Validator_OCSP", + "description": "OCSP validator for certificates", + "type": "object", + "properties": { + "class": { + "const": "Certificate_Validator_OCSP", + "title": "Class", + "type": "string" + }, + "dnsResolver": { + "allOf": [ + { + "$ref": "#/definitions/Pointer_DNS_Resolver" + } + ], + "description": "BIG-IP AS3 pointer to DNS resolver used to resolve hostnames in client requests", + "title": "DNS resolver" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "responderUrl": { + "description": "Specifies the absolute URL that overrides the OCSP responder URL obtained from the certificate's AIA extension(s). This should be a HTTP based URL.", + "minLength": 3, + "title": "Responder URL", + "type": "string" + }, + "signingCertificate": { + "allOf": [ + { + "$ref": "#/definitions/Pointer_SSL_Certificate" + } + ], + "description": "Specifies the certificate object to use for OCSP responders that require the request to be signed", + "title": "Request Signing Certificate Object" + }, + "signingHashAlgorithm": { + "default": "sha256", + "description": "Specifies a hash algorithm used to sign an OCSP request", + "enum": [ + "sha1", + "sha256" + ], + "title": "Request Signing Hash Algorithm", + "type": "string" + }, + "timeout": { + "default": 8, + "description": "Specifies the time interval (in seconds) that the BIG-IP waits for before ending the connection to the OCSP responder. The default value is 8", + "maximum": 300, + "minimum": 1, + "title": "Timeout", + "type": "integer" + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "Constants": { + "title": "Constants", + "description": "Named values for (re-)use by declaration objects", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Constants" + } + }, + "propertyNames": { + "maxLength": 64, + "pattern": "^[A-Za-z][0-9A-Za-z_]*$" + }, + "additionalProperties": { + "if": { + "required": [ + "protected", + "ciphertext" + ], + "type": "object" + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/JWE" + } + ], + "properties": { + "allowReuse": { + "default": true, + "description": "If true (default), cryptogram may be reused by different declaration objects, WHICH MAY POSE A SECURITY RISK!", + "title": "Allow reuse", + "type": "boolean" + } + } + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object" + ] + }, + "required": [ + "class" + ] + }, + "Controls": { + "title": "Controls", + "type": "object", + "description": "Optional controls configuration", + "properties": { + "archiveId": { + "description": "Read-only property present when you GET a declaration from configuration system. Archived versions of declaration are identified by a combination of 'id' and 'archiveId'", + "readOnly": true, + "title": "Archive ID", + "type": [ + "number", + "string" + ] + }, + "archiveTimestamp": { + "description": "Read-only property present when you GET a declaration from configuration system. Indicates when this version (see archiveId) of declaration was archived", + "format": "date-time", + "readOnly": true, + "title": "Archive timestamp", + "type": "string" + }, + "class": { + "title": "Class", + "type": "string", + "const": "Controls", + "default": "Controls" + }, + "dryRun": { + "default": false, + "description": "Boolean that indicates if this declaration will be run as a dry-run. If true, the declaration will NOT make any changes to the system, but will respond with whether or not it would.", + "title": "Dry-Run Option", + "type": "boolean" + }, + "fortune": { + "description": "If true, BIG-IP AS3 will activate Zoltar mode and read you your fortune", + "title": "Fortune", + "type": "boolean" + }, + "logLevel": { + "title": "Log level", + "description": "Controls the amount of detail in logs produced while configuring this Tenant (default is whole-declaration Controls/logLevel value)", + "type": "string", + "enum": [ + "emergency", + "alert", + "critical", + "error", + "warning", + "notice", + "info", + "debug" + ], + "default": "error" + }, + "trace": { + "default": false, + "description": "If true, BIG-IP AS3 creates a detailed trace of the configuration process for this Tenant for subsequent analysis (default is whole-declaration Controls/trace value). Warning: trace files may contain sensitive configuration data", + "title": "Trace", + "type": "boolean" + }, + "traceResponse": { + "title": "Trace Response", + "description": "If true, the response will contain the trace files", + "type": "boolean", + "default": false + }, + "userAgent": { + "title": "User Agent", + "description": "User Agent information to include in TEEM report", + "type": "string" + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "DNS_Logging_Profile": { + "title": "DNS Logging Profile", + "type": "object", + "description": "Configures a Domain Name System (DNS) logging profile", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "DNS_Logging_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "includeCompleteAnswer": { + "description": "Specifies whether the system logs the complete answer from the query", + "type": "boolean", + "default": true + }, + "includeQueryId": { + "description": "Specifies whether the system logs the ID of the query", + "type": "boolean", + "default": false + }, + "includeSource": { + "description": "Specifies whether the system logs the source (the BIG-IP system that receives the packet)", + "type": "boolean", + "default": true + }, + "includeTimestamp": { + "description": "Specifies whether the system logs the timestamp of when the query was created", + "type": "boolean", + "default": true + }, + "includeView": { + "description": "Specifies whether the system includes the view in the log", + "type": "boolean", + "default": true + }, + "logPublisher": { + "$ref": "#/definitions/Pointer_Log_Publisher" + }, + "logQueriesEnabled": { + "description": "Specifies whether the system logs queries", + "type": "boolean", + "default": true + }, + "logResponsesEnabled": { + "description": "Specifies whether the systems logs responses", + "type": "boolean", + "default": false + } + }, + "required": [ + "class", + "logPublisher" + ], + "additionalProperties": false + }, + "Enum_Country_Analytics": { + "title": "Enum values for Analytics_Profile", + "description": "Enum values for Analytics_Profile", + "type": "string", + "enum": [ + "Afghanistan", + "Aland Islands", + "Albania", + "Algeria", + "American Samoa", + "Andorra", + "Angola", + "Anguilla", + "Anonymous Proxy", + "Antarctica", + "Antigua and Barbuda", + "Argentina", + "Armenia", + "Aruba", + "Asia/Pacific Region", + "Australia", + "Austria", + "Azerbaijan", + "Bahamas", + "Bahrain", + "Bangladesh", + "Barbados", + "Belarus", + "Belgium", + "Belize", + "Benin", + "Bermuda", + "Bhutan", + "Bolivia", + "Bonaire, Saint Eustatius and Saba", + "Bosnia and Herzegovina", + "Botswana", + "Bouvet Island", + "Brazil", + "British Indian Ocean Territory", + "Brunei Darussalam", + "Bulgaria", + "Burkina Faso", + "Burundi", + "Cambodia", + "Cameroon", + "Canada", + "Cape Verde", + "Cayman Islands", + "Central African Republic", + "Chad", + "Chile", + "China", + "Christmas Island", + "Cocos (Keeling) Islands", + "Colombia", + "Comoros", + "Congo", + "Congo, The Democratic Republic of the", + "Cook Islands", + "Costa Rica", + "Cote D'Ivoire", + "Croatia", + "Cuba", + "Cyprus", + "Czech Republic", + "Denmark", + "Djibouti", + "Dominica", + "Dominican Republic", + "Ecuador", + "Egypt", + "El Salvador", + "Equatorial Guinea", + "Eritrea", + "Estonia", + "Ethiopia", + "Europe", + "Falkland Islands (Malvinas)", + "Faroe Islands", + "Fiji", + "Finland", + "France", + "France, Metropolitan", + "French Guiana", + "French Polynesia", + "French Southern Territories", + "Gabon", + "Gambia", + "Georgia", + "Germany", + "Ghana", + "Gibraltar", + "Greece", + "Greenland", + "Grenada", + "Guadeloupe", + "Guam", + "Guatemala", + "Guernsey", + "Guinea", + "Guinea-Bissau", + "Guyana", + "Haiti", + "Heard Island and McDonald Islands", + "Holy See (Vatican City State)", + "Honduras", + "Hong Kong", + "Hungary", + "Iceland", + "India", + "Indonesia", + "Iran, Islamic Republic of", + "Iraq", + "Ireland", + "Isle of Man", + "Israel", + "Italy", + "Jamaica", + "Japan", + "Jersey", + "Jordan", + "Kazakhstan", + "Kenya", + "Kiribati", + "Korea, Democratic People's Republic of", + "Korea, Republic of", + "Kuwait", + "Kyrgyzstan", + "Lao People's Democratic Republic", + "Latvia", + "Lebanon", + "Lesotho", + "Liberia", + "Libyan Arab Jamahiriya", + "Liechtenstein", + "Lithuania", + "Luxembourg", + "Macau", + "Macedonia", + "Madagascar", + "Malawi", + "Malaysia", + "Maldives", + "Mali", + "Malta", + "Marshall Islands", + "Martinique", + "Mauritania", + "Mauritius", + "Mayotte", + "Mexico", + "Micronesia, Federated States of", + "Moldova, Republic of", + "Monaco", + "Mongolia", + "Montenegro", + "Montserrat", + "Morocco", + "Mozambique", + "Myanmar", + "Namibia", + "Nauru", + "Nepal", + "Netherlands", + "Netherlands Antilles", + "New Caledonia", + "New Zealand", + "Nicaragua", + "Niger", + "Nigeria", + "Niue", + "Norfolk Island", + "Northern Mariana Islands", + "Norway", + "Oman", + "Other", + "Pakistan", + "Palau", + "Palestinian Territory", + "Panama", + "Papua New Guinea", + "Paraguay", + "Peru", + "Philippines", + "Pitcairn Islands", + "Poland", + "Portugal", + "Puerto Rico", + "Qatar", + "Reunion", + "Romania", + "Russian Federation", + "Rwanda", + "Saint Barthelemy", + "Saint Helena", + "Saint Kitts and Nevis", + "Saint Lucia", + "Saint Martin", + "Saint Pierre and Miquelon", + "Saint Vincent and the Grenadines", + "Samoa", + "San Marino", + "Sao Tome and Principe", + "Satellite Provider", + "Saudi Arabia", + "Senegal", + "Serbia", + "Seychelles", + "Sierra Leone", + "Singapore", + "Slovakia", + "Slovenia", + "Solomon Islands", + "Somalia", + "South Africa", + "South Georgia and the South Sandwich Islands", + "Spain", + "Sri Lanka", + "Sudan", + "Suriname", + "Svalbard and Jan Mayen", + "Swaziland", + "Sweden", + "Switzerland", + "Syrian Arab Republic", + "Taiwan", + "Tajikistan", + "Tanzania, United Republic of", + "Thailand", + "Timor-Leste", + "Togo", + "Tokelau", + "Tonga", + "Trinidad and Tobago", + "Tunisia", + "Turkey", + "Turkmenistan", + "Turks and Caicos Islands", + "Tuvalu", + "Uganda", + "Ukraine", + "United Arab Emirates", + "United Kingdom", + "United States", + "United States Minor Outlying Islands", + "Unknown", + "Uruguay", + "Uzbekistan", + "Vanuatu", + "Venezuela", + "Vietnam", + "Virgin Islands, British", + "Virgin Islands, U.S.", + "Wallis and Futuna", + "Western Sahara", + "Yemen", + "Zambia", + "Zimbabwe" + ] + }, + "F5_String": { + "title": "Common definition for ways to define a value that needs to be resolved", + "description": "The value can be either a string, text property, base64 property, url property, etc.", + "oneOf": [ + { + "type": "string" + }, + { + "type": "object", + "properties": { + "text": { + "$ref": "#/definitions/Property_Text" + }, + "base64": { + "$ref": "#/definitions/Property_Base64" + }, + "url": { + "$ref": "#/definitions/Resource_URL" + }, + "copyFrom": { + "$ref": "#/definitions/Pointer_Copy_From" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1 + } + ] + }, + "HTTP_Acceleration_Profile": { + "title": "HTTP acceleration profile", + "type": "object", + "description": "HTTP acceleration profile with configurable options", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "HTTP_Acceleration_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "agingRate": { + "description": "Rate at which a cache entry ages", + "type": "integer", + "minimum": 0, + "maximum": 10, + "default": 9 + }, + "cacheSize": { + "description": "The maximum size (in megabytes) for the cache.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 100 + }, + "ignoreHeaders": { + "description": "Which cache disabling headers will be ignored by the system", + "type": "string", + "enum": [ + "none", + "max-age", + "all" + ], + "default": "all" + }, + "insertAgeHeaderEnabled": { + "description": "Age and date headers are inserted into the response when enabled", + "type": "boolean", + "default": true + }, + "maximumAge": { + "description": "How long the system will consider the cached content will be valid", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 3600 + }, + "maximumEntries": { + "description": "The maximum number of entries that can reside in the cache", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 10000 + }, + "maximumObjectSize": { + "description": "The largest object that the system will cache", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 50000 + }, + "metadataMaxSize": { + "default": 25, + "description": "The maximum size of the metadata cache", + "maximum": 4294967295, + "minimum": 0, + "type": "integer" + }, + "minimumObjectSize": { + "description": "The smallest object that the system will cache", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 500 + }, + "parentProfile": { + "allOf": [ + { + "$ref": "#/definitions/Pointer_HTTP_Acceleration_Profile" + } + ], + "default": { + "bigip": "/Common/webacceleration" + }, + "description": "The profile that this profile inherits values from" + }, + "uriExcludeList": { + "description": "A list of URIs that will be excluded from the cache", + "type": "array", + "items": { + "type": "string", + "minLength": 1 + }, + "uniqueItems": true + }, + "uriIncludeList": { + "description": "A list of URIs that will be cacheable", + "type": "array", + "items": { + "type": "string", + "minLength": 1 + }, + "uniqueItems": true + }, + "uriIncludeOverrideList": { + "description": "A list of URIs that should be cached even though they may normally not be due to existing constraints", + "type": "array", + "items": { + "type": "string", + "minLength": 1 + }, + "uniqueItems": true + }, + "uriPinnedList": { + "description": "A list of URIs that are kept in the cache regardless of maxAge or expiry settings", + "type": "array", + "items": { + "type": "string", + "minLength": 1 + }, + "uniqueItems": true + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "HTTP_Compress": { + "title": "HTTP Compression profile", + "type": "object", + "description": "HTTP Compression profile with configurable options", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "HTTP_Compress" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "allowHTTP10": { + "description": "Specifies whether to forward HTTP 1.0 requests/responses (default false)", + "type": "boolean", + "default": false + }, + "bufferSize": { + "title": "Buffer size", + "description": "Maximum number of response octets to buffer before deciding whether to apply compression (default 4096)", + "type": "integer", + "minimum": 256, + "maximum": 4294967295, + "default": 4096 + }, + "contentTypeExcludes": { + "title": "Content-Type exclude list", + "description": "List of response Content-Type values which BIG-IP AS3 should not compress. Values are regular expressions that match Content-Type strings", + "type": "array", + "items": { + "type": "string", + "pattern": "^[^\\x00-\\x1f\\x22\\x7f-\\xff]+$" + }, + "uniqueItems": true + }, + "contentTypeIncludes": { + "title": "Content-Type include list", + "description": "List of response Content-Type values which BIG-IP AS3 should compress. Values are regular expressions that match Content-Type strings", + "type": "array", + "items": { + "type": "string", + "pattern": "^[^\\x00-\\x1f\\x22\\x7f-\\xff]+$" + }, + "uniqueItems": true, + "default": [ + "text/", + "application/(xml|x-javascript)" + ] + }, + "cpuSaver": { + "default": true, + "description": "If true (default), system will reduce compression rate when CPU utilization exceeds cpuSaverHigh threshold and increase it when CPU utilization falls below cpuSaverLow threshold", + "title": "CPU saver", + "type": "boolean" + }, + "cpuSaverHigh": { + "default": 90, + "description": "CPU utilization percentage (default 90) above which BIG-IP AS3 should moderate compression", + "maximum": 99, + "minimum": 15, + "title": "CPU-saver %high", + "type": "integer" + }, + "cpuSaverLow": { + "default": 75, + "description": "CPU utilization percentage (default 75) below which the system returns compression to normal", + "maximum": 95, + "minimum": 10, + "title": "CPU-saver %low", + "type": "integer" + }, + "gzipLevel": { + "title": "GZIP level", + "description": "Compression level (default 1); higher values produce greater compression but use more CPU cycles", + "type": "integer", + "minimum": 1, + "maximum": 9, + "default": 1 + }, + "gzipMemory": { + "title": "GZIP memory level", + "description": "Compression memory allocation in kilobytes (default 8), should be a power of two", + "type": "integer", + "minimum": 1, + "maximum": 256, + "default": 8 + }, + "gzipWindowSize": { + "title": "GZIP window size", + "description": "Compression window size in kilobytes (default 16), should be a power of two", + "type": "integer", + "minimum": 1, + "maximum": 128, + "default": 16 + }, + "keepAcceptEncoding": { + "title": "Keep Accept-Encoding header", + "description": "Specifies that the system does not remove the Accept-Encoding header from an HTTP request (default false)", + "type": "boolean", + "default": false + }, + "minimumSize": { + "default": 1024, + "description": "BIG-IP AS3 will not compress responses of fewer octets than this (default 1024)", + "maximum": 131072, + "minimum": 128, + "title": "Minimum size to compress", + "type": "integer" + }, + "preferMethod": { + "default": "gzip", + "description": "Select preferred compression method (default gzip, strongly recommended)", + "enum": [ + "gzip", + "deflate" + ], + "title": "Prefer method", + "type": "string" + }, + "selective": { + "default": false, + "description": "If true, BIG-IP AS3 will only compress a response when an iRule attached to the virtual server requests it (default is false, meaning BIG-IP AS3 will compress responses which meet the criteria in this profile)", + "title": "Selective mode", + "type": "boolean" + }, + "uriExcludes": { + "title": "URI exclude list", + "description": "List of request URI's for which BIG-IP AS3 should not compress responses. Values are regular expressions that match request URI strings", + "type": "array", + "items": { + "type": "string", + "pattern": "^[^\\x00-\\x1f\\x7f-\\xff]+$" + }, + "uniqueItems": true + }, + "uriIncludes": { + "title": "URI include list", + "description": "List of request URI's for which BIG-IP AS3 should compress responses. Values are regular expressions that match URI strings", + "type": "array", + "items": { + "type": "string", + "pattern": "^[^\\x00-\\x1f\\x7f-\\xff]+$" + }, + "uniqueItems": true + }, + "varyHeader": { + "default": true, + "description": "If true (default), a Vary header will appear in compressed responses", + "title": "Vary header", + "type": "boolean" + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "HTTP_Profile": { + "title": "HTTP profile", + "type": "object", + "description": "HTTP profile with configurable options", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "HTTP_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "allowBlankSpaceAfterHeaderName": { + "default": false, + "description": "Specifies whether to allow blank space in an HTTP header between the header name and the separator colon in an HTTP request or response. Requires TMOS version 16.1 or newer.", + "title": "Allow Blank Space After Header Name", + "type": "boolean" + }, + "allowedResponseHeaders": { + "description": "By default BIG-IP AS3 passes HTTP headers in responses from pool members to clients unaltered. You may list names of allowed response headers here and BIG-IP AS3 removes any you do not list from responses.", + "items": { + "maxLength": 128, + "minLength": 1, + "pattern": "^[^\\x00-\\x20\\x22:\\x5c\\x7f-\\xff]+$", + "title": "Allowed header", + "type": "string" + }, + "title": "Allow response headers", + "type": "array", + "uniqueItems": true + }, + "cookiePassphrase": { + "title": "Cookie encryption passphrase", + "description": "Used to create secret key for cookie encryption (when missing, BIG-IP AS3 uses a system-generated key)", + "properties": { + "allowReuse": { + "description": "If true, other declaration objects may reuse this value", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "$ref": "#/definitions/Property_Passphrase" + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "object" + } + } + ], + "type": "object" + }, + "encryptCookies": { + "title": "Encrypt cookies", + "description": "List cookies to encrypt en-route to the client and decrypt en-route to a pool member", + "type": "array", + "items": { + "title": "Cookie name", + "type": "string", + "pattern": "^[^\\x00-\\x20\\x22=\\x5c\\x7f-\\xff]+$" + }, + "uniqueItems": true + }, + "enforceRFCCompliance": { + "default": false, + "description": "BIG-IP LTM performs basic RFC compliance checks as described in the latest RFC for the HTTP protocol. If a client request fails these checks, then the connection is reset. Requires TMOS version 15.0 or newer.", + "title": "Enforce RFC Compliance", + "type": "boolean" + }, + "fallbackRedirect": { + "title": "Fallback Redirect", + "description": "Domain name (or IP address) of service (if any) to which BIG-IP AS3 should redirect a request when no pool member is responsive or selected pool member returns a fallbackStatusCode", + "type": "string", + "minLength": 1, + "anyOf": [ + { + "format": "uri" + }, + { + "format": "f5ip" + } + ] + }, + "fallbackStatusCodes": { + "description": "When a pool member responds to a request with one of these HTTP status codes (for example, 500), redirect the client to the fallbackRedirect", + "items": { + "maximum": 999, + "minimum": 100, + "title": "Status code", + "type": "integer" + }, + "title": "Fallback status codes", + "type": "array", + "uniqueItems": true + }, + "hstsIncludeSubdomains": { + "default": true, + "description": "If true then HSTS headers (see hstsInsert) will tell clients to apply HSTS settings to the hostnames of this service and all their possible subdomains. Warning: an incorrect value here can make multiple websites unreachable, not just this service", + "title": "Include subdomains in HSTS", + "type": "boolean" + }, + "hstsInsert": { + "default": false, + "description": "If true, insert HSTS (HTTP Strict Transport Security) headers into responses sent to clients (default false). Warning: misconfiguration of HSTS can make a website unreachable", + "title": "Insert HSTS headers", + "type": "boolean" + }, + "hstsPeriod": { + "default": 7862400, + "description": "If hstsInsert is true, this value tells each client how long (in seconds; default 7862400 equals 91 days) to wait before refreshing HSTS settings for this service. Warning: once a client receives erroneous HSTS settings it will ignore any attempt to correct them until this period has expired", + "maximum": 4294967295, + "minimum": 0, + "title": "Period of HSTS", + "type": "integer" + }, + "hstsPreload": { + "default": false, + "description": "If true, include the domain for the web site associated with this HTTP profile in the browser's preload list. This forces the client to send packets over SSL/TLS.", + "title": "Include domain in preload list", + "type": "boolean" + }, + "requestChunking": { + "title": "Request chunking", + "description": "Controls handling of HTTP payload chunking in requests from clients (default is 'preserve'). Note: 'selective' and 'preserve' will be translated to 'sustain' when TMOS version is 15.0 or newer", + "type": "string", + "enum": [ + "selective", + "preserve", + "rechunk" + ], + "default": "preserve" + }, + "responseChunking": { + "title": "Response chunking", + "description": "Controls handling of HTTP payload chunking in responses from pool members (default 'selective' adapts to most situations). Note: 'selective' and 'preserve' will be translated to 'sustain' when TMOS version is 15.0 or newer", + "type": "string", + "enum": [ + "selective", + "preserve", + "unchunk", + "rechunk" + ], + "default": "selective" + }, + "rewriteRedirects": { + "title": "Rewrite redirects", + "description": "In selected Location-header values (default none) of redirect responses from pool members, change protocol HTTP to HTTPS before passing redirects to clients", + "type": "string", + "enum": [ + "none", + "all", + "matching", + "addresses" + ], + "default": "none" + }, + "insertHeader": { + "title": "Insert header", + "description": "You may insert one header into each request before BIG-IP AS3 sends it to a pool member. The header value may be a simple string or the result of an iRules TCL expression (for example, [IP::client_addr]). This is the most efficient way to insert a single header; to insert multiple headers use an iRule or an Endpoint policy", + "type": "object", + "properties": { + "name": { + "title": "Header name", + "description": "Name of the HTTP header to insert", + "type": "string", + "pattern": "^[^\\x00-\\x20\\x22:\\x5c\\x7f-\\xff]+$", + "minLength": 1, + "maxLength": 128 + }, + "value": { + "title": "Header value", + "description": "Value of the HTTP header to insert", + "type": "string", + "pattern": "^[^\\x00-\\x1f\\x7f-\\xff]*$" + } + }, + "additionalProperties": false + }, + "knownMethods": { + "title": "Known methods", + "description": "List of HTTP request methods BIG-IP AS3 should recognize as normal. Any method not in this list will provoke the 'unknownMethodAction' action", + "type": "array", + "items": { + "title": "HTTP method", + "type": "string", + "pattern": "^[A-Z0-9]+$", + "minLength": 1, + "maxLength": 32 + }, + "uniqueItems": true, + "default": [ + "CONNECT", + "DELETE", + "GET", + "HEAD", + "LOCK", + "OPTIONS", + "POST", + "PROPFIND", + "PUT", + "TRACE", + "UNLOCK" + ] + }, + "maxRequests": { + "title": "Maximum requests per connection", + "description": "When BIG-IP AS3 has processed more than this number of requests through a connection, the system closes it. Default 0 means permit unlimited requests", + "type": "integer", + "minimum": 0, + "maximum": 2147483647, + "default": 0 + }, + "multiplexTransformations": { + "title": "Multiplex transformations", + "description": "If true (default), BIG-IP AS3 adjusts request headers to work properly when the virtual server uses a Multiplex profile", + "type": "boolean", + "default": true + }, + "otherXFF": { + "title": "Other XFF headers", + "description": "Names of request headers to treat as equivalent to X-Forwarded-For (see trustXFF)", + "type": "array", + "items": { + "title": "Header name", + "type": "string", + "minLength": 1, + "maxLength": 128, + "pattern": "^[^\\x00-\\x20\\x22:\\x5c\\x7f-\\xff]+$" + }, + "uniqueItems": true + }, + "pipelineAction": { + "default": "allow", + "description": "Default 'allow' means clients may pipeline HTTP/1.1 requests to pool members which support pipelining. Otherwise, 'reject' prevents pipelining, and 'pass-through' causes the connection to switch to pass-through mode when the system detects pipelining", + "enum": [ + "allow", + "reject", + "pass-through" + ], + "title": "Pipeline action", + "type": "string" + }, + "profileWebSocket": { + "description": "Deprecated. Specifies the WebSocket profile that will be used on Services alongside this HTTP profile. When the 'profileWebSocket' property is used on a Service, it will supersede this property.", + "allOf": [ + { + "$ref": "#/definitions/Pointer_WebSocket_Profile" + } + ] + }, + "proxyConnectEnabled": { + "default": false, + "description": "Determines if a proxy connection profile will be created", + "title": "Proxy connection enabled", + "type": "boolean" + }, + "proxyType": { + "default": "reverse", + "description": "Default value 'reverse' is usually appropriate. You may use 'transparent' when virtual server will handle a mix of HTTP and non-HTTP traffic. You may use 'explicit' when clients will ask ADC to proxy connections to arbitrary remote services", + "enum": [ + "reverse", + "transparent", + "explicit" + ], + "title": "Proxy type", + "type": "string" + }, + "whiteOutHeader": { + "title": "White-out header", + "description": "You may name one request header you want whited-out of each request before BIG-IP AS3 sends it to a pool member. To remove more than a single named header, use an iRule or an Endpoint policy. (Whiting-out a header leaves its name but replaces its value in the request with space characters (ASCII 0x20) to avoid changing the length of the headers.)", + "type": "string", + "pattern": "^[^\\x00-\\x20\\x22:\\x5c\\x7f-\\xff]+$", + "minLength": 1, + "maxLength": 128 + }, + "xForwardedFor": { + "title": "Insert X-Forwarded-For", + "description": "If true, insert an X-Forwarded-For header carrying the client IP address into each HTTP request sent to a pool member (default true)", + "type": "boolean", + "default": true + }, + "serverHeaderValue": { + "title": "Server header value", + "description": "Server header value to place in responses generated by the ADC itself (not obtained from a pool member)", + "type": "string", + "default": "BigIP" + }, + "trustXFF": { + "default": false, + "description": "If true, WAF (ASM) and AVR may trust X-Forwarded-For headers found in incoming requests and report statistics using client IP addresses appearing in them (default false). Use this feature only when you control upstream gateway(s)", + "title": "Trust X-Forwarded-For", + "type": "boolean" + }, + "unknownMethodAction": { + "default": "allow", + "description": "Default 'allow' means clients may make HTTP requests using unknown methods. Otherwise, 'reject' means to discard any unknown-method request and reject the client connection, and 'pass-through' causes the connection to switch to pass-through mode upon the first unknown-method request", + "enum": [ + "allow", + "reject", + "pass-through" + ], + "title": "Unknown method action", + "type": "string" + }, + "viaHost": { + "anyOf": [ + { + "format": "hostname" + }, + { + "format": "f5ip" + } + ], + "description": "Hostname to place in Via header when viaRequest or viaResponse is 'append'", + "minLength": 1, + "title": "Via hostname", + "type": "string" + }, + "viaRequest": { + "default": "remove", + "description": "Controls treatment of Via: headers in requests from clients. When set to 'append' BIG-IP AS3 requires viaHost", + "enum": [ + "append", + "preserve", + "remove" + ], + "title": "Via request control", + "type": "string" + }, + "viaResponse": { + "default": "remove", + "description": "Controls treatment of Via: headers in responses from pool members. When set to 'append' BIG-IP AS3 requires viaHost", + "enum": [ + "append", + "preserve", + "remove" + ], + "title": "Via response control", + "type": "string" + }, + "webSocketMasking": { + "default": "unmask", + "description": "Deprecated. WebSocket stream data is always masked from client to ADC and from ADC to server. Default value 'unmask' makes stream data passing through visible to ADC security policy and/or iRules attached to the service. 'selective' unmasks stream data only when a security policy is attached. 'preserve' passes data through masked (unreadable by security policy). 'remask' causes different masking keys to be used on client and server sides. When specified the property 'profileWebSocket' supersedes this property.", + "enum": [ + "preserve", + "remask", + "selective", + "unmask" + ], + "title": "WebSocket masking", + "type": "string" + }, + "webSocketsEnabled": { + "default": false, + "description": "Deprecated. When true, allow clients to initiate WebSocket connections (default false). When specified the property 'profileWebSocket' supersedes this property.", + "title": "WebSockets Enabled", + "type": "boolean" + } + }, + "required": [ + "class" + ], + "dependencies": { + "cookiePassphrase": { + "required": [ + "encryptCookies" + ] + }, + "fallbackStatusCodes": { + "required": [ + "fallbackRedirect" + ] + }, + "proxyType": { + "else": { + "if": { + "properties": { + "proxyType": { + "not": { + "const": "explicit" + } + } + } + }, + "then": { + "not": { + "anyOf": [ + { + "required": [ + "resolver" + ] + }, + { + "required": [ + "doNotProxyHosts" + ] + }, + { + "required": [ + "tunnelName" + ] + }, + { + "required": [ + "defaultConnectAction" + ] + }, + { + "required": [ + "routeDomain" + ] + }, + { + "required": [ + "connectErrorMessage" + ] + }, + { + "required": [ + "dnsErrorMessage" + ] + }, + { + "required": [ + "badRequestMessage" + ] + }, + { + "required": [ + "badResponseMessage" + ] + }, + { + "required": [ + "ipv6" + ] + } + ] + } + } + }, + "if": { + "properties": { + "proxyType": { + "not": { + "const": "transparent" + } + } + } + }, + "then": { + "not": { + "anyOf": [ + { + "required": [ + "excessClientHeaders" + ] + }, + { + "required": [ + "excessServerHeaders" + ] + }, + { + "required": [ + "oversizeClientHeaders" + ] + }, + { + "required": [ + "oversizeServerHeaders" + ] + } + ] + } + } + }, + "viaRequest": { + "if": { + "properties": { + "viaRequest": { + "const": "append" + } + } + }, + "then": { + "required": [ + "viaHost" + ] + } + }, + "viaResponse": { + "if": { + "properties": { + "viaResponse": { + "const": "append" + } + } + }, + "then": { + "required": [ + "viaHost" + ] + } + } + }, + "if": { + "properties": { + "proxyType": { + "const": "reverse" + } + } + }, + "then": { + "$ref": "#/definitions/HTTP_Profile_Reverse" + }, + "else": { + "if": { + "properties": { + "proxyType": { + "const": "transparent" + } + } + }, + "then": { + "$ref": "#/definitions/HTTP_Profile_Transparent" + }, + "else": { + "if": { + "properties": { + "proxyType": { + "const": "explicit" + } + } + }, + "then": { + "$ref": "#/definitions/HTTP_Profile_Explicit" + } + } + } + }, + "HTTP_Profile_Explicit": { + "title": "HTTP Profile Explicit", + "type": "object", + "description": "Extra HTTP profile configurable options when proxyType is 'explicit'", + "properties": { + "maxHeaderCount": { + "title": "Maximum header count", + "description": "When the number of headers in an incoming HTTP request exceeds this value, discard the request and reset the client connection", + "type": "integer", + "minimum": 1, + "maximum": 1024, + "default": 64 + }, + "maxHeaderSize": { + "title": "Maximum header size", + "description": "When the total size in octets of the headers of an incoming HTTP request exceeds this value, discard the request and reset the client connection", + "type": "integer", + "minimum": 9, + "maximum": 262144, + "default": 32768 + }, + "truncatedRedirects": { + "title": "Truncated redirects", + "description": "If false (default) elide malformed redirects from pool members, otherwise pass them to client", + "type": "boolean", + "default": false + }, + "resolver": { + "title": "DNS resolver", + "description": "BIG-IP AS3 pointer to DNS resolver used to resolve hostnames in client requests", + "type": "object", + "properties": { + "bigip": { + "title": "BIG-IP resolver", + "description": "Pathname of existing BIG-IP net DNS resolver", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "required": [ + "bigip" + ], + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query net dns-resolver" + ] + } + }, + "doNotProxyHosts": { + "title": "Do-not-proxy hosts", + "description": "When a client makes a (proxy-type) request to some host on this list, that request will simply be load-balanced to a pool member (without DNS resolution). This is ineffective for HTTPS requests", + "type": "array", + "items": { + "title": "host", + "type": "string", + "anyOf": [ + { + "format": "hostname" + }, + { + "format": "f5ip" + } + ] + }, + "default": [ + "none" + ], + "uniqueItems": true + }, + "tunnelName": { + "title": "Tunnel name", + "description": "Name of tunnel used for outbound CONNECT requests (default 'http-tunnel')", + "type": "string", + "minLength": 1, + "maxLength": 63, + "default": "http-tunnel", + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query net tunnels tunnel" + ] + } + }, + "defaultConnectAction": { + "title": "Default CONNECT action", + "description": "By default (value 'deny') the system refuses CONNECT requests from clients except when there is a virtual server listening to the tunnelName tunnel to accept and process them (typically to authorize and/or intercept outbound TLS connections). Value 'allow' will let clients CONNECT to arbitrary remote services", + "type": "string", + "enum": [ + "deny", + "allow" + ], + "default": "deny" + }, + "routeDomain": { + "title": "Exit route domain", + "description": "Proxy requests will leave the ADC from a Self IP in this route domain (default 0)", + "oneOf": [ + { + "type": "integer", + "minimum": 0, + "maximum": 65535 + }, + { + "type": "string" + } + ], + "default": 0, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query net route-domain" + ] + } + }, + "connectErrorMessage": { + "title": "Connect-error message", + "description": "Message returned to client when the system cannot establish a proxy connection. May include iRules TCL expressions", + "type": "string", + "maxLength": 65279, + "default": "Connection Error

Unable to connect to host in proxy request

" + }, + "dnsErrorMessage": { + "title": "DNS-error message", + "description": "Message returned to the client when the system cannot resolve the hostname in the request. May include iRules TCL expressions", + "type": "string", + "maxLength": 65279, + "default": "DNS Resolution Error

Cannot resolve hostname in proxy request

" + }, + "badRequestMessage": { + "title": "Bad-request message", + "description": "Message returned to client when proxy request is erroneous. May include iRules TCL expressions", + "type": "string", + "maxLength": 65279, + "default": "Bad Request

Invalid proxy request

" + }, + "badResponseMessage": { + "title": "Bad-response message", + "description": "Message returned to client when response to proxy request is erroneous. May include iRules TCL expressions", + "type": "string", + "maxLength": 65279, + "default": "Bad Response

Proxy request provoked invalid response

" + }, + "ipv6": { + "title": "IPv6 first priority", + "description": "Specifies the relative order of IPv4 and IPv6 DNS resolutions for URIs. If false (default), then the system performs IPv4 lookup before IPv6.", + "type": "boolean", + "default": false + } + } + }, + "HTTP_Profile_Reverse": { + "title": "HTTP Profile Reverse", + "type": "object", + "description": "Extra HTTP profile configurable options when proxyType is 'reverse'", + "properties": { + "maxHeaderCount": { + "title": "Maximum header count", + "description": "When the number of headers in an incoming HTTP request exceeds this value, discard the request and reset the client connection", + "type": "integer", + "minimum": 1, + "maximum": 1024, + "default": 64 + }, + "maxHeaderSize": { + "title": "Maximum header size", + "description": "When the total size in octets of the headers of an incoming HTTP request exceeds this value, discard the request and reset the client connection", + "type": "integer", + "minimum": 9, + "maximum": 262144, + "default": 32768 + }, + "truncatedRedirects": { + "title": "Truncated redirects", + "description": "If false (default) elide malformed redirects from pool members, otherwise pass them to client", + "type": "boolean", + "default": false + } + } + }, + "HTTP_Profile_Transparent": { + "title": "HTTP Profile Transparent", + "type": "object", + "description": "Extra HTTP profile configurable options when proxyType is 'transparent'", + "properties": { + "maxHeaderCount": { + "title": "Maximum header count", + "description": "When the number of headers in a request or response exceeds this value (default 32), take the excessX...Headers action", + "type": "integer", + "minimum": 1, + "maximum": 1024, + "default": 32 + }, + "maxHeaderSize": { + "title": "Maximum header size", + "description": "When the total size in octets of the headers of request or response exceeds this value (default 16384), take the oversizeX...Headers action", + "type": "integer", + "minimum": 9, + "maximum": 262144, + "default": 16384 + }, + "excessClientHeaders": { + "title": "Excess client headers action", + "description": "When a client request violates maxHeaderCount, either switch to pass-through mode (default) or reject the connection", + "type": "string", + "enum": [ + "pass-through", + "reject" + ], + "default": "pass-through" + }, + "excessServerHeaders": { + "title": "Excess server headers action", + "description": "When a pool member response violates maxHeaderCount, either switch to pass-through mode (default) or reject the connection", + "type": "string", + "enum": [ + "pass-through", + "reject" + ], + "default": "pass-through" + }, + "oversizeClientHeaders": { + "title": "Oversize client headers action", + "description": "When a client request violates maxHeaderSize, either switch to pass-through mode (default) or reject the connection", + "type": "string", + "enum": [ + "pass-through", + "reject" + ], + "default": "pass-through" + }, + "oversizeServerHeaders": { + "title": "Oversize server headers action", + "description": "When a pool member response violates maxHeaderSize, either switch to pass-through mode (default) or reject the connection", + "type": "string", + "enum": [ + "pass-through", + "reject" + ], + "default": "pass-through" + }, + "truncatedRedirects": { + "title": "Truncated redirects", + "description": "If true (default) pass malformed redirects to client", + "type": "boolean", + "default": true + } + } + }, + "HTTP2_Profile": { + "title": "HTTP2 profile", + "type": "object", + "description": "Profile to enable HTTP2", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "HTTP2_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "activationMode": { + "title": "Activation Mode", + "description": "This setting specifies the condition that will cause the BIG-IP system to handle an incoming connection as an HTTP/2 connection.", + "type": "string", + "enum": [ + "alpn", + "always" + ], + "default": "alpn" + }, + "concurrentStreamsPerConnection": { + "title": "Concurrent streams per connection", + "description": "The number of concurrent connections to allow on a single HTTP/2 connection.", + "type": "integer", + "minimum": 1, + "maximum": 256, + "default": 10 + }, + "connectionIdleTimeout": { + "title": "Connection idle timeout", + "description": "The number of seconds that a HTTP/2 connection is left open idly before it is closed.", + "type": "integer", + "minimum": 1, + "maximum": 4294967295, + "default": 300 + }, + "enforceTlsRequirements": { + "title": "Enforce TLS requirements", + "description": "Enable or disable enforcement of TLS requirements.", + "type": "boolean", + "default": true + }, + "frameSize": { + "title": "Frame size", + "type": "integer", + "default": 2048, + "description": "The size of the data frames, in bytes, that the HTTP/2 protocol sends to the client.", + "maximum": 16384, + "minimum": 1024 + }, + "headerTableSize": { + "title": "Header table size", + "type": "integer", + "default": 4096, + "description": "The size of the header table, in KB, for the HTTP headers that the HTTP/2 protocol compresses to save bandwidth.", + "maximum": 65535, + "minimum": 0 + }, + "includeContentLength": { + "title": "Include content length", + "type": "boolean", + "default": false, + "description": "Enable to include content-length in HTTP/2 headers." + }, + "insertHeader": { + "title": "Insert header", + "description": "This setting specifies whether the BIG-IP system should add an HTTP header to the HTTP request to show that the request was received over HTTP/2.", + "type": "boolean", + "default": false + }, + "insertHeaderName": { + "title": "Insert header name", + "description": "This setting specifies the name of the header that the BIG-IP system will add to the HTTP request when the Insert Header is enabled.", + "type": "string", + "default": "X-HTTP2" + }, + "receiveWindow": { + "title": "Receive window", + "type": "integer", + "default": 32, + "description": "The flow-control size for upload streams, in KB.", + "maximum": 128, + "minimum": 16 + }, + "writeSize": { + "title": "Write size", + "type": "integer", + "default": 16384, + "description": "The total size of combined data frames, in bytes, that the HTTP/2 protocol sends in a single write function.", + "maximum": 32768, + "minimum": 2048 + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "IRule": { + "title": "iRule", + "type": "object", + "description": "iRule definition with configurable options", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "iRule" + }, + "expand": { + "title": "Expand", + "description": "If true (default), expand backquoted variables in iRule", + "type": "boolean", + "default": true + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "iRule": { + "$ref": "#/definitions/IRule_Core" + } + }, + "required": [ + "class", + "iRule" + ], + "additionalProperties": false + }, + "IRule_Core": { + "title": "iRule Core definition", + "description": "Reference to an iRule or text of an iRule", + "allOf": [ + { + "$ref": "#/definitions/F5_String" + }, + { + "f5PostProcess": { + "tag": "expand", + "data": { + "when": "1/expand" + } + } + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "string" + } + } + ] + }, + "JWE": { + "title": "JWE cryptogram", + "description": "A value in a cryptogram which is a Flattened JWE JSON Serialization object. If 'miniJWE' is true then enc=(none|f5sv) only (in JOSE header)", + "type": "object", + "properties": { + "ciphertext": { + "title": "Ciphertext", + "description": "Put base64url(data_value) here", + "type": "string", + "minLength": 2, + "allOf": [ + { + "$ref": "#/definitions/Resource_Base64" + } + ] + }, + "ignoreChanges": { + "title": "Ignore changes", + "description": "If false (default), the system updates the ciphertext in every BIG-IP AS3 declaration deployment. If true, BIG-IP AS3 creates the ciphertext on first deployment, and leaves it untouched afterwards", + "type": "boolean", + "default": false + }, + "miniJWE": { + "title": "Mini JWE", + "description": "If true (default), object is an f5 mini-JWE", + "type": "boolean", + "default": true + }, + "protected": { + "title": "JOSE header", + "description": "JOSE header: alg=dir, enc=(none|f5sv); default enc=none (encoded default is 'protected'='eyJhbGciOiJkaXIiLCJlbmMiOiJub25lIn0', use with secret simply base64 url-encoded into 'ciphertext'). If you see 'protected'='eyJhbGciOiJkaXIiLCJlbmMiOiJmNXN2In0', 'ciphertext' contains base64url-encoded SecureVault cryptogram", + "type": "string", + "minLength": 2, + "allOf": [ + { + "$ref": "#/definitions/Resource_Base64" + } + ], + "default": "eyJhbGciOiJkaXIiLCJlbmMiOiJub25lIn0" + } + }, + "required": [ + "protected" + ] + }, + "L4_Profile": { + "title": "L4 Profile", + "description": "Configures a Fast Layer 4 profile", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "L4_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "clientTimeout": { + "title": "Client timeout", + "description": "Number of seconds allowed for a client to transmit enough data to select a server when you have late binding enabled. Value -1 means indefinite (not recommended)", + "type": "integer", + "maximum": 86400, + "minimum": -1, + "default": 30 + }, + "idleTimeout": { + "title": "Idle timeout", + "description": "Number of seconds (default 300; may not be 0) connection may remain idle before it becomes eligible for deletion. Value -1 (not recommended) means infinite", + "type": "integer", + "default": 300, + "anyOf": [ + { + "maximum": 86400, + "minimum": 1 + }, + { + "const": -1 + } + ] + }, + "keepAliveInterval": { + "title": "Keep-alive interval", + "description": "Number of seconds between keep-alive probes. A value of 0 seconds disables the feature.", + "type": "integer", + "default": 0, + "maximum": 4294967295, + "minimum": 0 + }, + "looseClose": { + "title": "Loose close", + "description": "When true, system closes a loosely-initiated connection when the system receives the first FIN packet from either the client or the server (default false).", + "type": "boolean", + "default": false + }, + "looseInitialization": { + "title": "Loose initialization", + "description": "When true, system initializes a connection when it receives any TCP packet, rather than requiring a SYN packet for connection initiation (default false).", + "type": "boolean", + "default": false + }, + "maxSegmentSize": { + "title": "MSS", + "description": "Sets MSS advertised to peer. Value 0 (default) will set MSS automatically in proportion to interface MTU. Default 0 is usually the best choice", + "type": "integer", + "default": 0, + "anyOf": [ + { + "maximum": 9162, + "minimum": 256 + }, + { + "const": 0 + } + ] + }, + "resetOnTimeout": { + "title": "Reset on timeout", + "description": "If true (default), connections which time out will be reset (that is, the system sends an RST packet to the peer) before the system expunges them", + "type": "boolean", + "default": true + }, + "synCookieAllowlist": { + "title": "Syn Cookie Allowlist", + "description": "Specifies whether or not to use a SYN Cookie Allowlist when doing software SYN Cookies. This means not doing a SYN Cookie for the same src IP address if it has been done already in the previous tm.flowstate.timeout (30) seconds. The default value is disabled.", + "type": "boolean", + "default": false + }, + "synCookieEnable": { + "title": "SYN cookie enable", + "description": "Enables syn-cookies capability on this virtual server. If true (default), the system may use SYN cookies to avert connection-table overflow (for example, from DoS attacks)", + "type": "boolean", + "default": true + }, + "tcpCloseTimeout": { + "title": "TCP Close timeout", + "description": "Specifies an TCP close timeout in seconds. Value -1 means indefinite (not recommended)", + "type": "integer", + "default": 5, + "maximum": 86400, + "minimum": -1 + }, + "tcpHandshakeTimeout": { + "title": "TCP Handshake timeout", + "description": "Specifies a TCP handshake timeout in seconds. The default value is 5 seconds. Value -1 means indefinite (not recommended)", + "type": "integer", + "maximum": 86400, + "default": 5, + "minimum": -1 + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "Log_Destination": { + "title": "Log Destination", + "description": "Configures a log destination", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Log_Destination" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "type": { + "description": "The type of the log destination", + "type": "string", + "enum": [ + "management-port", + "remote-high-speed-log", + "remote-syslog", + "splunk" + ] + } + }, + "required": [ + "class", + "type" + ], + "allOf": [ + { + "if": { + "properties": { + "type": { + "const": "management-port" + } + } + }, + "then": { + "$ref": "#/definitions/Log_Destination_Management_Port" + } + }, + { + "if": { + "properties": { + "type": { + "const": "remote-syslog" + } + } + }, + "then": { + "$ref": "#/definitions/Log_Destination_Remote_Syslog" + } + }, + { + "if": { + "properties": { + "type": { + "const": "remote-high-speed-log" + } + } + }, + "then": { + "$ref": "#/definitions/Log_Destination_Remote_High_Speed_Log" + } + }, + { + "if": { + "properties": { + "type": { + "const": "splunk" + } + } + }, + "then": { + "$ref": "#/definitions/Log_Destination_Splunk" + } + } + ] + }, + "Log_Destination_Management_Port": { + "title": "Log Destination Management Port", + "description": "Sends received messages to a specified IP address and port through the management interface", + "type": "object", + "properties": { + "address": { + "description": "Specifies the IP address that will receive messages from the specified local Log Destination", + "type": "string", + "format": "f5ip" + }, + "port": { + "description": "Specifies the port of the IP address that will receive messages from the specified local Log Destination", + "type": "integer", + "minimum": 0, + "maximum": 65535 + }, + "protocol": { + "description": "Specifies the protocol for the system to use to send logs to the specified location", + "type": "string", + "enum": [ + "tcp", + "udp" + ], + "default": "tcp" + } + }, + "required": [ + "address", + "port" + ] + }, + "Log_Destination_Remote_High_Speed_Log": { + "title": "Log Destination Remote High Speed Log", + "description": "Sends received messages to a specified pool", + "type": "object", + "properties": { + "distribution": { + "description": "Specifies the distribution method used to send messages to pool members", + "type": "string", + "enum": [ + "adaptive", + "balanced", + "replicated" + ], + "default": "adaptive" + }, + "protocol": { + "description": "Specifies the protocol for the system to use to send logs to the pool", + "type": "string", + "enum": [ + "tcp", + "udp" + ], + "default": "tcp" + }, + "pool": { + "$ref": "#/definitions/Pointer_Pool" + } + }, + "required": [ + "pool" + ] + }, + "Log_Destination_Remote_Syslog": { + "title": "Log Destination Remote Syslog", + "description": "Configures Remote Syslog destinations to format log messages into Syslog format and forward them to a Remote High-Speed Log destination", + "type": "object", + "properties": { + "format": { + "description": "Specifies the method to use to format the logs", + "type": "string", + "enum": [ + "legacy-bigip", + "rfc3164", + "rfc5424" + ], + "default": "rfc3164" + }, + "defaultFacility": { + "description": "Specifies the facility given to log messages received that do not already have a facility listed", + "type": "string", + "enum": [ + "local0", + "local1", + "local2", + "local3", + "local4", + "local5", + "local6", + "local7" + ], + "default": "local0" + }, + "defaultSeverity": { + "description": "Specifies the severity given to log messages received that do not already have a severity listed", + "type": "string", + "enum": [ + "alert", + "crit", + "debug", + "emerg", + "err", + "info", + "notice", + "warn" + ], + "default": "info" + }, + "remoteHighSpeedLog": { + "description": "Specifies a remote high-speed log destination, which the system uses to forward the logs to a pool of remote log servers", + "allOf": [ + { + "$ref": "#/definitions/Pointer_BIGIP_Or_Use" + }, + { + "type": "object", + "properties": { + "use": { + "description": "BIG-IP AS3 pointer to remote high speed log declaration", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Log_Destination" + }, + "type": { + "const": "remote-high-speed-log" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP remote high speed log", + "format": "f5bigip" + } + }, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys log-config destination remote-high-speed-log" + ] + } + } + ], + "minProperties": 1, + "maxProperties": 1 + } + }, + "required": [ + "remoteHighSpeedLog" + ] + }, + "Log_Destination_Splunk": { + "title": "Log Destination Splunk", + "description": "Configures Splunk formatting destinations to format incoming log messages into Splunk format", + "type": "object", + "properties": { + "forwardTo": { + "description": "Specifies the log destination to which logs are forwarded", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Log_Destination" + } + ] + } + }, + "required": [ + "forwardTo" + ] + }, + "Log_Publisher": { + "title": "Log_Publisher", + "description": "Configures lists of destinations for the common logging interface", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Log_Publisher" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "destinations": { + "description": "specify log destinations for this log publisher to use", + "type": "array", + "items": { + "$ref": "#/definitions/Pointer_Log_Destination" + } + } + }, + "required": [ + "class", + "destinations" + ] + }, + "Pointer_BIGIP": { + "title": "Pointer BIG-IP", + "description": "Reference for a BIG-IP object", + "type": "object", + "properties": { + "bigip": { + "description": "Path to BIG-IP object", + "type": "string" + } + }, + "required": [ + "bigip" + ], + "additionalProperties": false + }, + "Pointer_BIGIP_Or_Use": { + "title": "Pointer BIG-IP or Use", + "description": "Reference for a BIG-IP or Use object", + "if": { + "type": "object", + "required": [ + "bigip" + ] + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/Pointer_BIGIP" + } + ] + }, + "else": { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Use" + } + ] + } + }, + "Pointer_CA_Bundle": { + "title": "Pointer CA Bundle", + "description": "Reference to a Ca Bundle", + "additionalProperties": false, + "maxProperties": 1, + "minProperties": 1, + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP Ca Bundle", + "format": "f5bigip", + "type": "string" + }, + "use": { + "description": "BIG-IP AS3 pointer to Ca Bundle declaration", + "minLength": 1, + "type": "string", + "f5PostProcess": { + "data": { + "properties": { + "class": { + "enum": [ + "CA_Bundle" + ] + } + }, + "required": [ + "class" + ] + }, + "tag": "pointer" + } + } + }, + "type": "object", + "allOf": [ + { + "f5PostProcess": { + "data": [ + "query sys file ssl-cert" + ], + "tag": "bigComponent" + } + } + ] + }, + "Pointer_Certificate_Validator_OCSP": { + "title": "Pointer Certificate Validator OCSP", + "description": "Reference to a OCSP Cert Validator", + "additionalProperties": false, + "allOf": [ + { + "f5PostProcess": { + "data": [ + "query sys crypto cert-validator ocsp" + ], + "tag": "bigComponent" + } + } + ], + "maxProperties": 1, + "minProperties": 1, + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP OCSP Cert Validator", + "format": "f5bigip", + "type": "string" + }, + "use": { + "description": "BIG-IP AS3 pointer to OCSP Cert Validator declaration", + "f5PostProcess": { + "data": { + "properties": { + "class": { + "enum": [ + "Certificate_Validator_OCSP" + ] + } + }, + "required": [ + "class" + ] + }, + "tag": "pointer" + }, + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "Pointer_Copy_From": { + "title": "Copy from pointer", + "description": "pointer to declaration object/property from which to copy value", + "type": "string" + }, + "Pointer_DNS_Resolver": { + "title": "Pointer DNS Resolver", + "description": "Reference to a DNS resolver", + "type": "object", + "allOf": [ + { + "f5PostProcess": { + "data": [ + "query net dns-resolver" + ], + "tag": "bigComponent" + } + } + ], + "maxProperties": 1, + "minProperties": 1, + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP DNS resolver", + "format": "f5bigip", + "type": "string" + } + }, + "additionalProperties": false + }, + "Pointer_F5_String_Or_BIGIP": { + "title": "Pointer F5 String or BIG-IP", + "description": "Reference for a property or BIG-IP object", + "if": { + "type": "object", + "required": [ + "bigip" + ] + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/Pointer_BIGIP" + } + ] + }, + "else": { + "allOf": [ + { + "$ref": "#/definitions/F5_String" + } + ] + } + }, + "Pointer_HTTP_Acceleration_Profile": { + "title": "Pointer HTTP Acceleration Profile", + "additionalProperties": false, + "allOf": [ + { + "f5PostProcess": { + "data": [ + "query ltm profile web-acceleration" + ], + "tag": "bigComponent" + } + } + ], + "description": "Reference to a HTTP Acceleration Profile", + "maxProperties": 1, + "minProperties": 1, + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP HTTP Acceleration Profile", + "format": "f5bigip", + "type": "string" + }, + "use": { + "description": "AS3 pointer to HTTP Acceleration Profile declaration", + "f5PostProcess": { + "data": { + "properties": { + "class": { + "enum": [ + "HTTP_Acceleration_Profile" + ] + } + }, + "required": [ + "class" + ] + }, + "tag": "pointer" + }, + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "Pointer_HTTP_Profile": { + "title": "Pointer HTTP Profile", + "allOf": [ + { + "$ref": "#/definitions/Pointer_BIGIP_Or_Use" + }, + { + "type": "object", + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP HTTP Profile", + "format": "f5bigip" + }, + "use": { + "description": "AS3 pointer to HTTP Profile declaration", + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "HTTP_Profile" + ] + } + }, + "required": [ + "class" + ] + } + }, + "minLength": 1 + } + }, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm profile http" + ] + } + } + ], + "description": "Reference to a HTTP Profile", + "maxProperties": 1, + "minProperties": 1 + }, + "Pointer_L4_Profile": { + "title": "Pointer L4 Profile", + "description": "Reference to a fast L4 profile", + "maxProperties": 1, + "minProperties": 1, + "allOf": [ + { + "$ref": "#/definitions/Pointer_BIGIP_Or_Use" + }, + { + "type": "object", + "properties": { + "use": { + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "L4_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "format": "f5bigip" + } + }, + "f5PostProcess": { + "data": [ + "query ltm profile fastl4" + ], + "tag": "bigComponent" + } + } + ] + }, + "Pointer_Log_Destination": { + "title": "Pointer Log Destination", + "description": "Reference to a log destination", + "allOf": [ + { + "$ref": "#/definitions/Pointer_BIGIP_Or_Use" + }, + { + "type": "object", + "properties": { + "use": { + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Log_Destination" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "format": "f5bigip" + } + }, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys log-config destination alertd", + "query sys log-config destination arcsight", + "query sys log-config destination ipfix", + "query sys log-config destination local-database", + "query sys log-config destination local-syslog", + "query sys log-config destination management-port", + "query sys log-config destination remote-high-speed-log", + "query sys log-config destination remote-syslog", + "query sys log-config destination splunk" + ] + } + } + ] + }, + "Pointer_Log_Publisher": { + "title": "Pointer Log Publisher", + "description": "Reference to a log publisher", + "allOf": [ + { + "$ref": "#/definitions/Pointer_BIGIP_Or_Use" + }, + { + "type": "object", + "properties": { + "use": { + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Log_Publisher" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "format": "f5bigip" + } + }, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys log-config publisher" + ] + } + } + ] + }, + "Pointer_Pool": { + "title": "Pointer Pool", + "description": "Reference to a pool", + "allOf": [ + { + "$ref": "#/definitions/Pointer_BIGIP_Or_Use" + }, + { + "type": "object", + "properties": { + "use": { + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Pool" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP pool", + "format": "f5bigip" + } + }, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query ltm pool" + ] + } + } + ], + "minProperties": 1, + "maxProperties": 1 + }, + "Pointer_SSL_Certificate": { + "title": "Pointer SSL Certificate", + "description": "Reference to a SSL certificate", + "type": "object", + "allOf": [ + { + "f5PostProcess": { + "data": [ + "query sys file ssl-cert" + ], + "tag": "bigComponent" + } + } + ], + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP SSL certificate", + "format": "f5bigip", + "type": "string" + }, + "use": { + "description": "BIG-IP AS3 pointer to SSL certificate declaration", + "f5PostProcess": { + "data": { + "properties": { + "class": { + "enum": [ + "Certificate" + ] + } + }, + "required": [ + "class" + ] + }, + "tag": "pointer" + }, + "minLength": 1, + "type": "string" + } + }, + "maxProperties": 1, + "minProperties": 1, + "additionalProperties": false + }, + "Pointer_String": { + "title": "Pointer String", + "description": "Reference that is a string", + "type": "string" + }, + "Pointer_Use": { + "title": "Pointer Use", + "description": "Reference for use property", + "type": "object", + "properties": { + "use": { + "description": "Path to object in declaration", + "type": "string" + } + }, + "required": [ + "use" + ], + "additionalProperties": false + }, + "Pointer_WebSocket_Profile": { + "title": "Pointer WebSocket Profile", + "additionalProperties": false, + "allOf": [ + { + "f5PostProcess": { + "data": [ + "query ltm profile websocket" + ], + "tag": "bigComponent" + } + } + ], + "description": "Reference to a WebSocket Profile", + "maxProperties": 1, + "minProperties": 1, + "properties": { + "bigip": { + "description": "Pathname of existing BIG-IP WebSocket Profile", + "format": "f5bigip", + "type": "string" + }, + "use": { + "description": "AS3 pointer to WebSocket Profile declaration", + "f5PostProcess": { + "data": { + "properties": { + "class": { + "enum": [ + "WebSocket_Profile" + ] + } + }, + "required": [ + "class" + ] + }, + "tag": "pointer" + }, + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "Property_Base64": { + "title": "Property Base64", + "description": "A Base64-encoded value (base64 property)", + "allOf": [ + { + "$ref": "#/definitions/Resource_Base64" + } + ] + }, + "Property_Passphrase": { + "title": "Property Passphrase", + "description": "A passphrase (passphrase property)", + "allOf": [ + { + "$ref": "#/definitions/Secret" + } + ], + "f5PostProcess": { + "tag": "secret" + } + }, + "Property_Text": { + "title": "Property Text", + "description": "A text value (text property)", + "allOf": [ + { + "$ref": "#/definitions/Resource_Text" + } + ] + }, + "Resource_Base64": { + "title": "Resource Base64", + "description": "A Base64-encoded value", + "type": "string", + "pattern": "^([0-9A-Za-z/+_-]*|[0-9A-Za-z/+_-]+={1,2})$" + }, + "Resource_Text": { + "title": "Resource Text", + "description": "UTF-8 text (in JSON string)", + "type": "string" + }, + "Resource_URL": { + "title": "Resource URL", + "description": "The URL for a required resource", + "oneOf": [ + { + "type": "string", + "f5PostProcess": { + "tag": "expand" + }, + "format": "uri" + }, + { + "type": "object", + "properties": { + "authentication": { + "description": "Authentication to the remote source", + "oneOf": [ + { + "$ref": "#/definitions/Basic_Auth" + }, + { + "$ref": "#/definitions/Bearer_Token" + } + ] + }, + "ignoreChanges": { + "type": "boolean", + "description": "If false (default), the URL will be fetched in each BIG-IP AS3 declaration deployment. If true, the resource will be created on the first deployment, but not on additional deployments", + "default": false + }, + "skipCertificateCheck": { + "type": "boolean", + "description": "Skip verification of SSL certificates (default false)", + "default": false + }, + "url": { + "type": "string", + "description": "URL from which to retrieve value", + "f5PostProcess": { + "tag": "expand" + }, + "format": "uri" + } + }, + "required": [ + "url" + ], + "additionalProperties": false + } + ] + }, + "Secret": { + "title": "Secret value", + "description": "A value: (a) in a cryptogram in this object; (b) in a cryptogram elsewhere in this declaration; or (c) available from a URL", + "oneOf": [ + { + "type": "object", + "properties": { + "allowReuse": { + "title": "Allow reuse", + "description": "If true, other declaration objects may reuse this value", + "type": "boolean" + }, + "reuseFrom": { + "title": "Reuse from", + "description": "BIG-IP AS3 pointer to another JWE cryptogram in this declaration to copy", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "type": "object", + "required": [ + "ciphertext" + ] + } + } + }, + "url": { + "title": "URL", + "description": "URL from which secret should be fetched", + "allOf": [ + { + "$ref": "#/definitions/Secret_Resource_URL" + } + ] + } + }, + "oneOf": [ + { + "required": [ + "ciphertext" + ] + }, + { + "required": [ + "reuseFrom" + ] + }, + { + "required": [ + "url" + ] + } + ], + "if": { + "required": [ + "ciphertext" + ] + }, + "then": { + "$ref": "#/definitions/JWE" + } + } + ] + }, + "Secret_Resource_URL": { + "title": "Secret Resource URL", + "description": "Describes the URL to remote resource and optional parameters", + "oneOf": [ + { + "type": "string", + "format": "uri", + "f5PostProcess": { + "tag": "expand" + } + }, + { + "type": "object", + "properties": { + "url": { + "description": "URL from which to retrieve value", + "type": "string", + "format": "uri", + "f5PostProcess": { + "tag": "expand" + } + }, + "skipCertificateCheck": { + "description": "Skip verification of SSL certificates (default false)", + "type": "boolean", + "default": false + } + }, + "required": [ + "url" + ] + } + ] + }, + "UDP_Profile": { + "title": "UDP Profile", + "description": "Configures a User Datagram Protocol (UDP) profile", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "UDP_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "allowNoPayload": { + "title": "Allow empty payload", + "description": "When true, forward UDP datagrams with empty payloads (default false)", + "type": "boolean", + "default": false + }, + "bufferMaxBytes": { + "title": "Buffer maximum-bytes", + "description": "Limit to number of octets which the system may buffer for a UDP flow (default 655350)", + "type": "integer", + "minimum": 65535, + "maximum": 16777215, + "default": 655350 + }, + "bufferMaxPackets": { + "title": "Buffer maximum-packets", + "description": "Limit to number of packets which the system may buffer for a UDP flow (default 0)", + "type": "integer", + "minimum": 0, + "maximum": 255, + "default": 0 + }, + "datagramLoadBalancing": { + "title": "Datagram load-balancing", + "description": "When true, process UDP datagrams independently, without recognizing flows (default false)", + "type": "boolean", + "default": false + }, + "idleTimeout": { + "title": "Idle timeout", + "description": "Number of seconds (default 60) flow may remain idle before it becomes eligible for deletion. Value 0 allows system to recover per-flow resources whenever convenient (always safe with UDP). Value -1 means indefinite (not recommended)", + "type": "integer", + "minimum": -1, + "maximum": 86400, + "default": 60 + }, + "ipDfMode": { + "title": "IP DF mode", + "description": "Controls DF (Don't Fragment) flag in outgoing datagrams. Value 'pmtu' (default) sets DF based on IP PMTU value. Value 'preserve' copies DF from received datagram. Value 'set' forces DF true in all outgoing datagrams. Value 'clear' forces DF false in all outgoing datagrams", + "type": "string", + "enum": [ + "clear", + "pmtu", + "preserve", + "set" + ], + "default": "pmtu" + }, + "ipTosToClient": { + "title": "IP TOS/DSCP to client", + "description": "Specifies the IP TOS/DSCP value in packets sent to clients (default 0). Numeric values in this property are decimal representations of eight-bit numbers, of which the leftmost six bits are the DSCP code per rfc2474 (and the rightmost two bits reserved). You may have to calculate the value of this property by multiplying a DSCP code, such as CS5+EF = 46, by four, to obtain the 'ipTosToClient' value, such as 184. Value 'pass-through' sets DSCP from the initial server-side value. Value 'mimic' copies DSCP from the most-recently received server-side packet (allowing DSCP to vary during the life of a connection)", + "oneOf": [ + { + "type": "integer", + "minimum": 0, + "maximum": 252, + "multipleOf": 4 + }, + { + "type": "string", + "enum": [ + "pass-through", + "mimic" + ] + } + ], + "default": 0 + }, + "linkQosToClient": { + "title": "Link QOS to client", + "description": "Specifies the Layer-2 QOS value in packets sent to clients (default 0). Ethernet-type networks recognize numeric codes from 0 to 7. Value 'pass-through' sets QOS from the initial server-side value", + "oneOf": [ + { + "type": "integer", + "minimum": 0, + "maximum": 7 + }, + { + "type": "string", + "const": "pass-through" + } + ], + "default": 0 + }, + "proxyMSS": { + "title": "Proxy MSS", + "description": "When true, MSS advertised on the server side will match that negotiated with the client, if permitted by MTU and other constraints (default false)", + "type": "boolean", + "default": false + }, + "ttlIPv4": { + "title": "TTL for IPv4", + "description": "TTL the system sets in outgoing IPv4 datagrams", + "type": "integer", + "minimum": 1, + "maximum": 255, + "default": 255 + }, + "ttlIPv6": { + "title": "TTL for IPv6", + "description": "TTL the system sets in outgoing IPv6 datagrams", + "type": "integer", + "minimum": 1, + "maximum": 255, + "default": 64 + }, + "ttlMode": { + "title": "TTL mode", + "description": "Controls IP TTL in outgoing datagrams. Value 'set' forces TTL to value of property 'ttlIPv4' or 'ttlIPv6' as appropriate. Value 'proxy' forces TTL to the default value for IPv4 or IPv6 as appropriate. Value 'preserve' copies TTL from received datagram. Value 'decrement' sets TTL to one less than received datagram's TTL", + "type": "string", + "enum": [ + "decrement", + "preserve", + "proxy", + "set" + ], + "default": "proxy" + }, + "useChecksum": { + "title": "Use checksum", + "description": "When true, system will validate UDP checksums for IPv4 datagrams (default false). Checksums are always validated for IPv6", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false, + "required": [ + "class" + ] + } + } +} \ No newline at end of file diff --git a/schema/latest/as3-schema.json b/schema/latest/as3-schema.json index 878f417a..0148cb6d 100644 --- a/schema/latest/as3-schema.json +++ b/schema/latest/as3-schema.json @@ -53,6 +53,7 @@ "type": "string", "$comment": "IMPORTANT: In enum array, please put current schema version first, oldest-supported version last. Keep enum array sorted most-recent-first.", "enum": [ + "3.46.0", "3.45.0", "3.44.0", "3.43.0", @@ -740,7 +741,6 @@ "Service_Address", "SNAT_Pool", "SNAT_Translation", - "iRule", "WAF_Policy", "Persist", "Pool", @@ -760,7 +760,6 @@ "Multiplex_Profile", "SOCKS_Profile", "TCP_Profile", - "L4_Profile", "Classification_Profile", "Radius_Profile", "IP_Other_Profile", @@ -799,13 +798,13 @@ "GSLB_Topology_Region", "ALG_Log_Profile", "Security_Log_Profile", - "Log_Destination", "Traffic_Log_Profile", "Endpoint_Policy", "Endpoint_Strategy", "Bandwidth_Control_Policy", "Idle_Timeout_Policy", "Net_Address_List", + "Net_Port_List", "Enforcement_Policy", "Enforcement_Diameter_Endpoint_Profile", "Enforcement_iRule", @@ -827,6 +826,9 @@ "HTTP_Compress", "HTTP_Profile", "HTTP2_Profile", + "iRule", + "L4_Profile", + "Log_Destination", "Log_Publisher", "UDP_Profile" ] @@ -965,18 +967,6 @@ "$ref": "#/definitions/SNAT_Translation" } }, - { - "if": { - "properties": { - "class": { - "const": "iRule" - } - } - }, - "then": { - "$ref": "#/definitions/iRule" - } - }, { "if": { "properties": { @@ -1205,18 +1195,6 @@ "$ref": "#/definitions/TCP_Profile" } }, - { - "if": { - "properties": { - "class": { - "const": "L4_Profile" - } - } - }, - "then": { - "$ref": "#/definitions/L4_Profile" - } - }, { "if": { "properties": { @@ -1673,18 +1651,6 @@ "$ref": "#/definitions/Security_Log_Profile" } }, - { - "if": { - "properties": { - "class": { - "const": "Log_Destination" - } - } - }, - "then": { - "$ref": "#/definitions/Log_Destination" - } - }, { "if": { "properties": { @@ -1757,6 +1723,18 @@ "$ref": "#/definitions/Net_Address_List" } }, + { + "if": { + "properties": { + "class": { + "const": "Net_Port_List" + } + } + }, + "then": { + "$ref": "#/definitions/Net_Port_List" + } + }, { "if": { "properties": { @@ -2009,6 +1987,42 @@ "$ref": "#/definitions/HTTP2_Profile" } }, + { + "if": { + "properties": { + "class": { + "const": "iRule" + } + } + }, + "then": { + "$ref": "#/definitions/IRule" + } + }, + { + "if": { + "properties": { + "class": { + "const": "L4_Profile" + } + } + }, + "then": { + "$ref": "#/definitions/L4_Profile" + } + }, + { + "if": { + "properties": { + "class": { + "const": "Log_Destination" + } + } + }, + "then": { + "$ref": "#/definitions/Log_Destination" + } + }, { "if": { "properties": { @@ -2255,8 +2269,28 @@ }, "virtualPort": { "title": "Virtual server TCP port", - "description": "Default 80 is well-known HTTP port", - "type": "integer", + "description": "Default 80 is well-known HTTP port. Accepts either an integer or a reference to a Firewall_Port_List that contains the ports on which to listen. Firewall_Port_List is only supported on BIG-IP 14.1 and later. If a Firewall_Port_List is provided, BIG-IP AS3 will create a traffic-matching-criteria for the virtual.", + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Port_List" + }, + { + "f5PostProcess": { + "tag": "minVersion", + "data": { + "version": "14.1", + "strict": true + } + } + } + ] + } + ], "default": 80 } }, @@ -2314,8 +2348,28 @@ }, "virtualPort": { "title": "Virtual server TCP port", - "description": "Default 443 is well-known HTTPS port", - "type": "integer", + "description": "Default 443 is well-known HTTPS port. Accepts either an integer or a reference to a Firewall_Port_List that contains the ports on which to listen. Firewall_Port_List is only supported on BIG-IP 14.1 and later. If a Firewall_Port_List is provided, BIG-IP AS3 will create a traffic-matching-criteria for the virtual.", + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Port_List" + }, + { + "f5PostProcess": { + "tag": "minVersion", + "data": { + "version": "14.1", + "strict": true + } + } + } + ] + } + ], "default": 443 }, "redirect80": { @@ -2792,8 +2846,28 @@ }, "virtualPort": { "title": "virtual server TCP port", - "description": "virtual server TCP port", - "type": "integer", + "description": "Accepts either an integer or a reference to a Firewall_Port_List that contains the ports on which to listen. Firewall_Port_List is only supported on BIG-IP 14.1 and later. If a Firewall_Port_List is provided, BIG-IP AS3 will create a traffic-matching-criteria for the virtual.", + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Port_List" + }, + { + "f5PostProcess": { + "tag": "minVersion", + "data": { + "version": "14.1", + "strict": true + } + } + } + ] + } + ], "minimum": 0, "maximum": 65535 }, @@ -3177,8 +3251,28 @@ }, "virtualPort": { "title": "Virtual server UDP port", - "description": "Virtual server UDP port", - "type": "integer", + "description": "Accepts either an integer or a reference to a Firewall_Port_List that contains the ports on which to listen. Firewall_Port_List is only supported on BIG-IP 14.1 and later. If a Firewall_Port_List is provided, BIG-IP AS3 will create a traffic-matching-criteria for the virtual.", + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Port_List" + }, + { + "f5PostProcess": { + "tag": "minVersion", + "data": { + "version": "14.1", + "strict": true + } + } + } + ] + } + ], "minimum": 0, "maximum": 65535 }, @@ -3360,8 +3454,28 @@ }, "virtualPort": { "title": "virtual server SCTP port", - "description": "virtual server port", - "type": "integer", + "description": "Accepts either an integer or a reference to a Firewall_Port_List that contains the ports on which to listen. Firewall_Port_List is only supported on BIG-IP 14.1 and later. If a Firewall_Port_List is provided, BIG-IP AS3 will create a traffic-matching-criteria for the virtual.", + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Port_List" + }, + { + "f5PostProcess": { + "tag": "minVersion", + "data": { + "version": "14.1", + "strict": true + } + } + } + ] + } + ], "minimum": 0, "maximum": 65535 }, @@ -3466,8 +3580,28 @@ "properties": { "virtualPort": { "title": "virtual server TCP port", - "description": "virtual server port", - "type": "integer", + "description": "Accepts either an integer or a reference to a Firewall_Port_List that contains the ports on which to listen. Firewall_Port_List is only supported on BIG-IP 14.1 and later. If a Firewall_Port_List is provided, BIG-IP AS3 will create a traffic-matching-criteria for the virtual.", + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Port_List" + }, + { + "f5PostProcess": { + "tag": "minVersion", + "data": { + "version": "14.1", + "strict": true + } + } + } + ] + } + ], "minimum": 0, "maximum": 65535 }, @@ -3800,47 +3934,67 @@ }, "virtualAddresses": { "title": "Virtual addresses", - "description": "Virtual server will listen to each IP address in list. To accept connections only from certain subnet(s), replace IP address with array [IP-address, accept-from-subnet]. IP address can also be replaced by a reference to a Service_Address.", - "type": "array", - "f5PostProcess": { - "tag": "virtualAddress" - }, - "items": { - "if": { - "type": "string" - }, - "then": { - "format": "f5ip" - }, - "else": { - "if": { - "type": "array" + "description": "Accepts either an array or a reference to an Address_List which contains destination addresses to which this virtual will listen. To accept connections only from certain subnet(s), replace IP address in the provided array with array [IP-address, accept-from-subnet]. IP address in the provided array can also be replaced by a reference to a Service_Address. A reference to an Address_List is only supported on BIG-IP 14.1 and later. If an Address_List is provided, BIG-IP AS3 will create a traffic-matching-criteria for the virtual.", + "oneOf": [ + { + "type": "array", + "f5PostProcess": { + "tag": "virtualAddress" }, - "then": { - "type": "array", - "items": { - "title": "Virtual address", + "items": { + "if": { + "type": "string" + }, + "then": { + "format": "f5ip" + }, + "else": { "if": { - "type": "string" + "type": "array" }, "then": { - "format": "f5ip" + "type": "array", + "items": { + "title": "Virtual address", + "if": { + "type": "string" + }, + "then": { + "format": "f5ip" + }, + "else": { + "$ref": "#/definitions/Pointer_Service_Address" + } + }, + "minItems": 2, + "maxItems": 2, + "uniqueItems": true }, "else": { "$ref": "#/definitions/Pointer_Service_Address" } - }, - "minItems": 2, - "maxItems": 2, - "uniqueItems": true + } }, - "else": { - "$ref": "#/definitions/Pointer_Service_Address" - } + "minItems": 1, + "uniqueItems": true + }, + { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Address_List" + }, + { + "f5PostProcess": { + "tag": "minVersion", + "data": { + "version": "14.1", + "strict": true + } + } + } + ] } - }, - "minItems": 1, - "uniqueItems": true + ] }, "serviceDownImmediateAction": { "title": "Service Down Immediate Action", @@ -3861,9 +4015,29 @@ }, "sourceAddress": { "title": "Source address", - "description": "Accept connections only from these subnet(s). Only allowed if virtualType is internal, otherwise use virtualAddresses.", - "type": "string", - "format": "f5ip" + "description": "Accepts either a string or a reference to an Address_List which contains source addresses from which this virtual will listen. A reference to an Address_List is only supported on BIG-IP 14.1 and later. If an Address_List is provided, BIG-IP AS3 will create a traffic-matching-criteria for the virtual.", + "oneOf": [ + { + "type": "string", + "format": "f5ip" + }, + { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Address_List" + }, + { + "f5PostProcess": { + "tag": "minVersion", + "data": { + "version": "14.1", + "strict": true + } + } + } + ] + } + ] }, "enable": { "title": "Enable", @@ -4515,12 +4689,7 @@ "then": { "required": [ "virtualAddresses" - ], - "not": { - "required": [ - "sourceAddress" - ] - } + ] } }, { @@ -4803,64 +4972,9 @@ "address" ] }, - "iRule": { - "title": "iRule", - "description": "An iRule", - "type": "object", - "properties": { - "class": { - "title": "Class", - "type": "string", - "const": "iRule" - }, - "label": { - "$ref": "#/definitions/Label" - }, - "remark": { - "$ref": "#/definitions/Remark" - }, - "expand": { - "title": "Expand", - "description": "If true (default), expand backquoted variables in iRule", - "type": "boolean", - "default": true - }, - "iRule": { - "$ref": "#/definitions/iRule_Core" - } - }, - "additionalProperties": false, - "required": [ - "class", - "iRule" - ] - }, - "iRule_Core": { - "title": "iRule Core definition", - "description": "Reference to an iRule or text of an iRule", - "allOf": [ - { - "$ref": "#/definitions/F5string" - }, - { - "f5PostProcess": { - "tag": "expand", - "data": { - "when": "1/expand" - } - } - }, - { - "f5PostProcess": { - "tag": "fetch", - "data": "string" - } - } - ] - }, "WAF_Policy": { "title": "WAF_Policy", - "description": "A Web Application Firewall Policy", + "description": "A Web Application Firewall Policy. Supports both traditional and advanced WAF policies. Advanced WAF policies require TMOS version 16.0 or newer.", "type": "object", "f5PostProcess": { "tag": "modules", @@ -4938,7 +5052,7 @@ }, "enforcementMode": { "title": "Enforcement Mode", - "description": "Overrides the enforcement mode setting of the WAF policy", + "description": "Overrides the enforcement mode setting of the WAF policy. Ignored on Advanced WAF policies", "type": "string", "enum": [ "blocking", @@ -4947,7 +5061,7 @@ }, "serverTechnologies": { "title": "Server Technologies", - "description": "Define server technologies for the WAF Policy, such as Java Servlets or Apache Struts", + "description": "Define server technologies for the WAF Policy, such as Java Servlets or Apache Struts. Ignored on Advanced WAF policies", "type": "array", "items": { "title": "Server Technology", @@ -4957,7 +5071,7 @@ }, "disabledSignatures": { "title": "Disabled attack signatures", - "description": "Disable various attack signatures by ID.", + "description": "Disable various attack signatures by ID. Ignored on Advanced WAF policies", "type": "array", "items": { "title": "Attack Signature ID", @@ -4966,6 +5080,17 @@ "maximum": 399999999 }, "uniqueItems": true + }, + "expand": { + "title": "Expand", + "description": "Performs AS3 string expansion on specified values within the WAF Policy. WAF Policies that are not in JSON format will be ignored", + "type": "array", + "items": { + "title": "JSON pointer", + "description": "A JSON pointer to a value within the WAF Policy that requires AS3 string expansion. Pointing to a parent property results in AS3 traversing the sub-properties and expanding any strings that it may find", + "type": "string" + }, + "uniqueItems": true } }, "additionalProperties": false, @@ -5704,6 +5829,9 @@ "tag": "node" } }, + "metadata": { + "$ref": "#/definitions/Metadata" + }, "reselectTries": { "title": "Reselect tries", "description": "Maximum number of attempts to find a responsive member for a connection", @@ -6136,6 +6264,9 @@ "minimum": 0, "maximum": 63 }, + "metadata": { + "$ref": "#/definitions/Metadata" + }, "adminState": { "title": "Administration State", "description": "Setting adminState to enable will create the node in an operational state. Set to disable to disallow new connections but allow existing connections to drain. Set to offline to force immediate termination of all connections.", @@ -10455,9 +10586,16 @@ }, "routeDomain": { "description": "The route domain that will be used for outbound connect requests", - "type": "integer", - "minimum": 0, - "maximum": 65534, + "oneOf": [ + { + "type": "integer", + "minimum": 0, + "maximum": 65534 + }, + { + "type": "string" + } + ], "default": 0 }, "tunnelName": { @@ -11182,120 +11320,6 @@ "synCookieAllowlist": "synCookieWhitelist" } }, - "L4_Profile": { - "title": "L4_Profile", - "description": "Configures a Fast Layer 4 profile", - "type": "object", - "properties": { - "class": { - "title": "Class", - "type": "string", - "const": "L4_Profile" - }, - "label": { - "$ref": "#/definitions/Label" - }, - "remark": { - "$ref": "#/definitions/Remark" - }, - "clientTimeout": { - "title": "Client timeout", - "description": "Number of seconds allowed for a client to transmit enough data to select a server when you have late binding enabled. Value -1 means indefinite (not recommended)", - "type": "integer", - "minimum": -1, - "maximum": 86400, - "default": 30 - }, - "idleTimeout": { - "title": "Idle timeout", - "description": "Number of seconds (default 300; may not be 0) connection may remain idle before it becomes eligible for deletion. Value -1 (not recommended) means infinite", - "type": "integer", - "anyOf": [ - { - "minimum": 1, - "maximum": 86400 - }, - { - "const": -1 - } - ], - "default": 300 - }, - "keepAliveInterval": { - "title": "Keep-alive interval", - "description": "Number of seconds between keep-alive probes. A value of 0 seconds disables the feature.", - "type": "integer", - "minimum": 0, - "maximum": 4294967295, - "default": 0 - }, - "looseClose": { - "title": "Loose close", - "description": "When true, system closes a loosely-initiated connection when the system receives the first FIN packet from either the client or the server (default false).", - "type": "boolean", - "default": false - }, - "looseInitialization": { - "title": "Loose initialization", - "description": "When true, system initializes a connection when it receives any TCP packet, rather than requiring a SYN packet for connection initiation (default false).", - "type": "boolean", - "default": false - }, - "maxSegmentSize": { - "title": "MSS", - "description": "Sets MSS advertised to peer. Value 0 (default) will set MSS automatically in proportion to interface MTU. Default 0 is usually the best choice", - "type": "integer", - "anyOf": [ - { - "minimum": 256, - "maximum": 9162 - }, - { - "const": 0 - } - ], - "default": 0 - }, - "resetOnTimeout": { - "title": "Reset on timeout", - "description": "If true (default), connections which time out will be reset (that is, the system sends an RST packet to the peer) before the system expunges them", - "type": "boolean", - "default": true - }, - "synCookieAllowlist": { - "title": "Syn Cookie Allowlist", - "description": "Specifies whether or not to use a SYN Cookie Allowlist when doing software SYN Cookies. This means not doing a SYN Cookie for the same src IP address if it has been done already in the previous tm.flowstate.timeout (30) seconds. The default value is disabled.", - "type": "boolean", - "default": false - }, - "synCookieEnable": { - "title": "SYN cookie enable", - "description": "Enables syn-cookies capability on this virtual server. If true (default), the system may use SYN cookies to avert connection-table overflow (for example, from DoS attacks)", - "type": "boolean", - "default": true - }, - "tcpCloseTimeout": { - "title": "TCP Close timeout", - "description": "Specifies an TCP close timeout in seconds. Value -1 means indefinite (not recommended)", - "type": "integer", - "minimum": -1, - "maximum": 86400, - "default": 5 - }, - "tcpHandshakeTimeout": { - "title": "TCP Handshake timeout", - "description": "Specifies a TCP handshake timeout in seconds. The default value is 5 seconds. Value -1 means indefinite (not recommended)", - "type": "integer", - "minimum": -1, - "maximum": 86400, - "default": 5 - } - }, - "additionalProperties": false, - "required": [ - "class" - ] - }, "Classification_Profile": { "title": "Classification_Profile", "description": "Configures a classification profile", @@ -13695,34 +13719,40 @@ "description": "The name of the service type", "type": "string", "enum": [ + "boxp", + "coap", "dhcp", - "dns", - "gtp", - "imap", - "mqtt", - "netbios_ns", - "nntp", - "pop3", - "sip", - "snmp", - "ssl", - "telnet", - "wins", "diameter", + "dns", "ftp", + "gtp", "http", + "imap", + "ipsec", "irc", + "mqtt", "mysql", + "netbios_ns", "netbios_ssn", + "nntp", + "oracle", "other", + "pfcp", + "pop3", "radius", + "rdp", + "rmi", + "rsh", + "sip", "smtp", + "snmp", "ssh", + "ssl", "sunrpc", + "telnet", "tftp", - "coap", - "oracle", - "pfcp" + "thrift", + "wins" ] }, "compliance": { @@ -18211,7 +18241,7 @@ "default": true }, "iRule": { - "$ref": "#/definitions/iRule_Core" + "$ref": "#/definitions/IRule_Core" } }, "additionalProperties": false, @@ -22264,258 +22294,6 @@ }, "additionalProperties": false }, - "Log_Destination": { - "title": "Log_Destination", - "description": "Configures a log destination", - "type": "object", - "properties": { - "class": { - "title": "Class", - "type": "string", - "const": "Log_Destination" - }, - "label": { - "$ref": "#/definitions/Label" - }, - "remark": { - "$ref": "#/definitions/Remark" - }, - "type": { - "description": "The type of the log destination", - "type": "string", - "enum": [ - "management-port", - "remote-high-speed-log", - "remote-syslog", - "splunk" - ] - } - }, - "required": [ - "class", - "type" - ], - "allOf": [ - { - "if": { - "properties": { - "type": { - "const": "management-port" - } - } - }, - "then": { - "$ref": "#/definitions/Log_Destination_Management_Port" - } - }, - { - "if": { - "properties": { - "type": { - "const": "remote-syslog" - } - } - }, - "then": { - "$ref": "#/definitions/Log_Destination_Remote_Syslog" - } - }, - { - "if": { - "properties": { - "type": { - "const": "remote-high-speed-log" - } - } - }, - "then": { - "$ref": "#/definitions/Log_Destination_Remote_High_Speed_Log" - } - }, - { - "if": { - "properties": { - "type": { - "const": "splunk" - } - } - }, - "then": { - "$ref": "#/definitions/Log_Destination_Splunk" - } - } - ] - }, - "Log_Destination_Management_Port": { - "description": "Sends received messages to a specified IP address and port through the management interface", - "type": "object", - "properties": { - "address": { - "description": "Specifies the IP address that will receive messages from the specified local Log Destination", - "type": "string", - "format": "f5ip" - }, - "port": { - "description": "Specifies the port of the IP address that will receive messages from the specified local Log Destination ", - "type": "integer", - "minimum": 0, - "maximum": 65535 - }, - "protocol": { - "description": "Specifies the protocol for the system to use to send logs to the specified location", - "type": "string", - "enum": [ - "tcp", - "udp" - ], - "default": "tcp" - } - }, - "required": [ - "address", - "port" - ] - }, - "Log_Destination_Remote_Syslog": { - "description": "Configures Remote Syslog destinations to format log messages into Syslog format and forward them to a Remote High-Speed Log destination", - "type": "object", - "properties": { - "format": { - "description": "Specifies the method to use to format the logs", - "type": "string", - "enum": [ - "legacy-bigip", - "rfc3164", - "rfc5424" - ], - "default": "rfc3164" - }, - "defaultFacility": { - "description": "Specifies the facility given to log messages received that do not already have a facility listed", - "type": "string", - "enum": [ - "local0", - "local1", - "local2", - "local3", - "local4", - "local5", - "local6", - "local7" - ], - "default": "local0" - }, - "defaultSeverity": { - "description": "Specifies the severity given to log messages received that do not already have a severity listed", - "type": "string", - "enum": [ - "alert", - "crit", - "debug", - "emerg", - "err", - "info", - "notice", - "warn" - ], - "default": "info" - }, - "remoteHighSpeedLog": { - "description": "Specifies a remote high-speed log destination, which the system uses to forward the logs to a pool of remote log servers", - "type": "object", - "properties": { - "use": { - "title": "Use", - "description": "BIG-IP AS3 pointer to remote high speed log declaration", - "type": "string", - "minLength": 1, - "f5PostProcess": { - "tag": "pointer", - "data": { - "properties": { - "class": { - "const": "Log_Destination" - }, - "type": { - "const": "remote-high-speed-log" - } - }, - "required": [ - "class" - ] - } - } - }, - "bigip": { - "title": "BIG-IP remote high speed log", - "description": "Pathname of existing BIG-IP remote high speed log", - "type": "string", - "format": "f5bigip" - } - }, - "additionalProperties": false, - "minProperties": 1, - "maxProperties": 1, - "f5PostProcess": { - "tag": "bigComponent", - "data": [ - "query sys log-config destination remote-high-speed-log" - ] - } - } - }, - "required": [ - "remoteHighSpeedLog" - ] - }, - "Log_Destination_Remote_High_Speed_Log": { - "description": "Sends received messages to a specified pool", - "type": "object", - "properties": { - "distribution": { - "description": "Specifies the distribution method used to send messages to pool members", - "type": "string", - "enum": [ - "adaptive", - "balanced", - "replicated" - ], - "default": "adaptive" - }, - "protocol": { - "description": "Specifies the protocol for the system to use to send logs to the pool", - "type": "string", - "enum": [ - "tcp", - "udp" - ], - "default": "tcp" - }, - "pool": { - "$ref": "#/definitions/Pointer_Pool" - } - }, - "required": [ - "pool" - ] - }, - "Log_Destination_Splunk": { - "description": "Configures Splunk formatting destinations to format incoming log messages into Splunk format", - "type": "object", - "properties": { - "forwardTo": { - "description": "Specifies the log destination to which logs are forwarded", - "allOf": [ - { - "$ref": "#/definitions/Pointer_Log_Destination" - } - ] - } - }, - "required": [ - "forwardTo" - ] - }, "Traffic_Log_Profile": { "title": "Traffic_Log_Profile", "description": "A traffic log profile", @@ -22902,6 +22680,7 @@ "httpHeader", "httpRedirect", "httpUri", + "botDefense", "waf", "forward", "drop", @@ -22937,6 +22716,18 @@ "$ref": "#/definitions/Policy_Action_WAF" } }, + { + "if": { + "properties": { + "type": { + "const": "botDefense" + } + } + }, + "then": { + "$ref": "#/definitions/Policy_Action_Bot_Defense" + } + }, { "if": { "properties": { @@ -23013,7 +22804,7 @@ "if": { "properties": { "type": { - "const": "serverSsl" + "const": "clientSsl" } } }, @@ -23106,6 +22897,26 @@ }, "required": [] }, + "Policy_Action_Bot_Defense": { + "type": "object", + "description": "Enable or disable Unified Bot Defense processing", + "properties": { + "event": { + "type": "string", + "description": "When to run this event in the request-response cycle", + "enum": [ + "client-accepted", + "proxy-request", + "request" + ], + "default": "request" + }, + "profile": { + "$ref": "#/definitions/Pointer_Bot_Defense_Profile" + } + }, + "required": [] + }, "Policy_Action_Drop": { "type": "object", "description": "Reset connection", @@ -25057,44 +24868,197 @@ "maximum": 7 }, "default": "pass-through" - }, - "categories": { - "description": "This specifies the categories under policy. Note: policy need to be enabled as dynamic to configure categories. Up to a maximum of 32 categories can be configured. All the categories under the dynamic policy share the bandwidth as specified for the category, up to a maximum of maxUserBandwidth.", - "additionalProperties": { - "$ref": "#/definitions/Bandwidth_Control_Policy_Category" - } + }, + "categories": { + "description": "This specifies the categories under policy. Note: policy need to be enabled as dynamic to configure categories. Up to a maximum of 32 categories can be configured. All the categories under the dynamic policy share the bandwidth as specified for the category, up to a maximum of maxUserBandwidth.", + "additionalProperties": { + "$ref": "#/definitions/Bandwidth_Control_Policy_Category" + } + } + }, + "required": [ + "class", + "maxBandwidth" + ], + "if": { + "required": [ + "dynamicControlEnabled" + ], + "properties": { + "dynamicControlEnabled": { + "const": true + } + } + }, + "then": { + "required": [ + "maxUserBandwidth" + ] + }, + "additionalProperties": false + }, + "Idle_Timeout_Policy": { + "title": "Idle_Timeout_Policy", + "description": "Destination port based idle timeout policy", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Idle_Timeout_Policy" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "rules": { + "description": "List of idle timeout rules", + "type": "array", + "items": { + "$ref": "#/definitions/Idle_Timeout_Rule" + } + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "Idle_Timeout_Rule": { + "description": "Idle timeout rule", + "type": "object", + "properties": { + "name": { + "description": "Idle timeout rule name", + "type": "string", + "pattern": "^[A-Za-z_][0-9A-Za-z_/-]*$", + "maxLength": 64 + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "protocol": { + "type": "string", + "allOf": [ + { + "$ref": "#/definitions/Enum_Protocols_Idle_Timeout_Policy" + } + ], + "default": "all-other" + }, + "destinationPorts": { + "type": "array", + "description": "List of ports, port ranges (for example, 80, \"8080-8090\"), or \"all-other\".", + "items": { + "type": [ + "integer", + "string" + ] + }, + "minItems": 1 + }, + "idleTimeout": { + "description": "Idle timeout in seconds", + "type": [ + "integer", + "string" + ], + "oneOf": [ + { + "type": "integer" + }, + { + "type": "string", + "enum": [ + "immediate", + "indefinite", + "unspecified" + ] + } + ], + "default": "unspecified" + } + }, + "required": [ + "name" + ], + "additionalProperties": false + }, + "Bandwidth_Control_Policy_Category": { + "description": "Create a listener to specify how to handle traffic for policy enforcement", + "type": "object", + "properties": { + "remark": { + "$ref": "#/definitions/Remark" + }, + "maxBandwidth": { + "description": "Specifies the maximum bandwidth that this category of traffic can use when associated with this bandwidth control policy. The range is from 5 kbps to the value set for Maximum Rate Per User.", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709552000 + }, + "maxBandwidthUnit": { + "description": "Specifies the units used by the maxBandwidth property", + "type": "string", + "enum": [ + "bps", + "Kbps", + "Mbps", + "Gbps", + "%" + ], + "default": "Mbps" + }, + "markIP": { + "description": "Specifies whether to mark traffic that exceeds the per-user limit by setting a Type of Service (ToS) bit in the IP headers of TCP packets associated with this bandwidth control policy. The default value is \"pass-through\", which means there is no change to the ToS bit. To set a ToS bit use a value from 0 to 63. If this setting is specified, the bandwidth policy is not enforced, but rather the packets are marked for a downstream system to process.", + "if": { + "type": "string" + }, + "then": { + "const": "pass-through" + }, + "else": { + "type": "integer", + "minimum": 0, + "maximum": 63 + }, + "default": "pass-through" + }, + "markL2": { + "description": "Specifies whether to mark traffic that exceeds the per-user limit by setting a Quality of Service (QoS) bit in the L2 headers of packets associated with this bandwidth control policy. The default value is \"pass-through\", which means there is no change to the QoS bit. To set a QoS bit use a value from 0 to 7. If this setting is specified, the bandwidth policy is not enforced, but rather the packets are marked for a downstream system to process.", + "if": { + "type": "string" + }, + "then": { + "const": "pass-through" + }, + "else": { + "type": "integer", + "minimum": 0, + "maximum": 7 + }, + "default": "pass-through" } }, "required": [ - "class", "maxBandwidth" ], - "if": { - "required": [ - "dynamicControlEnabled" - ], - "properties": { - "dynamicControlEnabled": { - "const": true - } - } - }, - "then": { - "required": [ - "maxUserBandwidth" - ] - }, "additionalProperties": false }, - "Idle_Timeout_Policy": { - "title": "Idle_Timeout_Policy", - "description": "Destination port based idle timeout policy", + "Net_Address_List": { + "title": "Net_Address_List", + "description": "You can use the address-list component to define reusable lists of addresses. This property requires a BIG-IP version of 14.1 or higher.", "type": "object", "properties": { "class": { "title": "Class", "type": "string", - "const": "Idle_Timeout_Policy" + "const": "Net_Address_List" }, "label": { "$ref": "#/definitions/Label" @@ -25102,152 +25066,49 @@ "remark": { "$ref": "#/definitions/Remark" }, - "rules": { - "description": "List of idle timeout rules", + "addresses": { "type": "array", + "description": "A list of IPv4 and IPv6 addresses and address ranges. You can specify a network with CIDR slash notation.", "items": { - "$ref": "#/definitions/Idle_Timeout_Rule" - } - } - }, - "required": [ - "class" - ], - "additionalProperties": false - }, - "Idle_Timeout_Rule": { - "description": "Idle timeout rule", - "type": "object", - "properties": { - "name": { - "description": "Idle timeout rule name", - "type": "string", - "pattern": "^[A-Za-z_][0-9A-Za-z_/-]*$", - "maxLength": 64 - }, - "label": { - "$ref": "#/definitions/Label" - }, - "remark": { - "$ref": "#/definitions/Remark" - }, - "protocol": { - "type": "string", - "allOf": [ - { - "$ref": "#/definitions/Enum_Protocols_Idle_Timeout_Policy" - } - ], - "default": "all-other" + "type": "string" + }, + "minItems": 1 }, - "destinationPorts": { + "addressLists": { "type": "array", - "description": "List of ports, port ranges (for example, 80, \"8080-8090\"), or \"all-other\".", + "description": "A list of other address lists (each by BIG-IP AS3 pointer or BIG-IP pathname).", "items": { - "type": [ - "integer", - "string" - ] + "$ref": "#/definitions/Pointer_Net_Address_List" }, "minItems": 1 - }, - "idleTimeout": { - "description": "Idle timeout in seconds", - "type": [ - "integer", - "string" - ], - "oneOf": [ - { - "type": "integer" - }, - { - "type": "string", - "enum": [ - "immediate", - "indefinite", - "unspecified" - ] - } - ], - "default": "unspecified" } }, "required": [ - "name" + "class" ], - "additionalProperties": false - }, - "Bandwidth_Control_Policy_Category": { - "description": "Create a listener to specify how to handle traffic for policy enforcement", - "type": "object", - "properties": { - "remark": { - "$ref": "#/definitions/Remark" - }, - "maxBandwidth": { - "description": "Specifies the maximum bandwidth that this category of traffic can use when associated with this bandwidth control policy. The range is from 5 kbps to the value set for Maximum Rate Per User.", - "type": "integer", - "minimum": 0, - "maximum": 18446744073709552000 - }, - "maxBandwidthUnit": { - "description": "Specifies the units used by the maxBandwidth property", - "type": "string", - "enum": [ - "bps", - "Kbps", - "Mbps", - "Gbps", - "%" - ], - "default": "Mbps" - }, - "markIP": { - "description": "Specifies whether to mark traffic that exceeds the per-user limit by setting a Type of Service (ToS) bit in the IP headers of TCP packets associated with this bandwidth control policy. The default value is \"pass-through\", which means there is no change to the ToS bit. To set a ToS bit use a value from 0 to 63. If this setting is specified, the bandwidth policy is not enforced, but rather the packets are marked for a downstream system to process.", - "if": { - "type": "string" - }, - "then": { - "const": "pass-through" - }, - "else": { - "type": "integer", - "minimum": 0, - "maximum": 63 - }, - "default": "pass-through" + "anyOf": [ + { + "required": [ + "addresses" + ] }, - "markL2": { - "description": "Specifies whether to mark traffic that exceeds the per-user limit by setting a Quality of Service (QoS) bit in the L2 headers of packets associated with this bandwidth control policy. The default value is \"pass-through\", which means there is no change to the QoS bit. To set a QoS bit use a value from 0 to 7. If this setting is specified, the bandwidth policy is not enforced, but rather the packets are marked for a downstream system to process.", - "if": { - "type": "string" - }, - "then": { - "const": "pass-through" - }, - "else": { - "type": "integer", - "minimum": 0, - "maximum": 7 - }, - "default": "pass-through" + { + "required": [ + "addressLists" + ] } - }, - "required": [ - "maxBandwidth" ], "additionalProperties": false }, - "Net_Address_List": { - "title": "Net_Address_List", - "description": "You can use the address-list component to define reusable lists of addresses. This property requires a BIG-IP version of 14.1 or higher.", + "Net_Port_List": { + "title": "Net_Port_List", + "description": "You can use the port-list component to define reusable lists of ports. This property requires a BIG-IP version of 14.1 or higher.", "type": "object", "properties": { "class": { "title": "Class", "type": "string", - "const": "Net_Address_List" + "const": "Net_Port_List" }, "label": { "$ref": "#/definitions/Label" @@ -25255,19 +25116,22 @@ "remark": { "$ref": "#/definitions/Remark" }, - "addresses": { + "ports": { "type": "array", - "description": "A list of IPv4 and IPv6 addresses and address ranges. You can specify a network with CIDR slash notation.", + "description": "A list of ports and port ranges (for example, 80, \"8080-8090\").", "items": { - "type": "string" + "type": [ + "integer", + "string" + ] }, "minItems": 1 }, - "addressLists": { + "portLists": { "type": "array", - "description": "A list of other address lists (each by BIG-IP AS3 pointer or BIG-IP pathname).", + "description": "A list of other port lists (each by BIG-IP AS3 pointer or BIG-IP pathname).", "items": { - "$ref": "#/definitions/Pointer_Net_Address_List" + "$ref": "#/definitions/Pointer_Net_Port_List" }, "minItems": 1 } @@ -25278,12 +25142,12 @@ "anyOf": [ { "required": [ - "addresses" + "ports" ] }, { "required": [ - "addressLists" + "portLists" ] } ], @@ -26566,7 +26430,7 @@ "default": true }, "iRule": { - "$ref": "#/definitions/iRule_Core" + "$ref": "#/definitions/IRule_Core" } }, "additionalProperties": false, @@ -28826,6 +28690,35 @@ } ] }, + "Pointer_Firewall_Port_List": { + "description": "Reference to a firewall port list", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to firewall port list declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Firewall_Port_List" + ] + } + }, + "required": [ + "class" + ] + } + } + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1 + }, "Pointer_Firewall_Rule_List": { "description": "Reference to a firewall rule list", "type": "object", @@ -29784,6 +29677,50 @@ } ] }, + "Pointer_Net_Port_List": { + "description": "Reference to a net port list", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to net port list declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Net_Port_List" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP net port list", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query net port-list" + ] + } + } + ] + }, "Pointer_Persist_Profile": { "description": "Reference to a Persist Profile", "type": "object", @@ -30036,50 +29973,6 @@ } ] }, - "Pointer_L4_Profile": { - "description": "Reference to a fast L4 profile", - "type": "object", - "properties": { - "use": { - "description": "AS3 pointer to fast L4 profile declaration", - "type": "string", - "minLength": 1, - "f5PostProcess": { - "tag": "pointer", - "data": { - "properties": { - "class": { - "enum": [ - "L4_Profile" - ] - } - }, - "required": [ - "class" - ] - } - } - }, - "bigip": { - "description": "Pathname of existing BIG-IP fast L4 profile", - "type": "string", - "format": "f5bigip" - } - }, - "additionalProperties": false, - "minProperties": 1, - "maxProperties": 1, - "allOf": [ - { - "f5PostProcess": { - "tag": "bigComponent", - "data": [ - "query ltm profile fastl4" - ] - } - } - ] - }, "Pointer_Radius_Profile": { "description": "Reference to a radius profile", "type": "object", @@ -30656,6 +30549,52 @@ } ] }, + "Pointer_Port_List": { + "description": "Reference to a firewall port list or net port list", + "type": "object", + "properties": { + "use": { + "description": "AS3 pointer to firewall port list or net port list declaration", + "type": "string", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "Firewall_Port_List", + "Net_Port_List" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP firewall port list or net port list", + "type": "string", + "format": "f5bigip" + } + }, + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "allOf": [ + { + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query security firewall port-list", + "query net port-list" + ] + } + } + ] + }, "Pointer_Request_Adapt_Profile": { "description": "Reference to a Request Adapt Profile", "type": "object", @@ -34125,9 +34064,64 @@ ], "additionalProperties": false }, + "IRule": { + "title": "iRule", + "type": "object", + "description": "iRule definition with configurable options", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "iRule" + }, + "expand": { + "title": "Expand", + "description": "If true (default), expand backquoted variables in iRule", + "type": "boolean", + "default": true + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "iRule": { + "$ref": "#/definitions/IRule_Core" + } + }, + "required": [ + "class", + "iRule" + ], + "additionalProperties": false + }, + "IRule_Core": { + "title": "iRule Core definition", + "description": "Reference to an iRule or text of an iRule", + "allOf": [ + { + "$ref": "#/definitions/F5_String" + }, + { + "f5PostProcess": { + "tag": "expand", + "data": { + "when": "1/expand" + } + } + }, + { + "f5PostProcess": { + "tag": "fetch", + "data": "string" + } + } + ] + }, "JWE": { "title": "JWE cryptogram", - "description": "A value in a cryptogram which is a Flattened JWE JSON Serialization object. If 'miniJWE' is true then enc=(none|f5sv) only (in JOSE header)", + "description": "A value in a cryptogram which is a Flattened JWE JSON Serialization object. If 'miniJWE' is true then enc=(none|f5sv) only (in JOSE header)", "type": "object", "properties": { "ciphertext": { @@ -34170,6 +34164,378 @@ "protected" ] }, + "L4_Profile": { + "title": "L4 Profile", + "description": "Configures a Fast Layer 4 profile", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "L4_Profile" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "clientTimeout": { + "title": "Client timeout", + "description": "Number of seconds allowed for a client to transmit enough data to select a server when you have late binding enabled. Value -1 means indefinite (not recommended)", + "type": "integer", + "maximum": 86400, + "minimum": -1, + "default": 30 + }, + "idleTimeout": { + "title": "Idle timeout", + "description": "Number of seconds (default 300; may not be 0) connection may remain idle before it becomes eligible for deletion. Value -1 (not recommended) means infinite", + "type": "integer", + "default": 300, + "anyOf": [ + { + "maximum": 86400, + "minimum": 1 + }, + { + "const": -1 + } + ] + }, + "keepAliveInterval": { + "title": "Keep-alive interval", + "description": "Number of seconds between keep-alive probes. A value of 0 seconds disables the feature.", + "type": "integer", + "default": 0, + "maximum": 4294967295, + "minimum": 0 + }, + "looseClose": { + "title": "Loose close", + "description": "When true, system closes a loosely-initiated connection when the system receives the first FIN packet from either the client or the server (default false).", + "type": "boolean", + "default": false + }, + "looseInitialization": { + "title": "Loose initialization", + "description": "When true, system initializes a connection when it receives any TCP packet, rather than requiring a SYN packet for connection initiation (default false).", + "type": "boolean", + "default": false + }, + "maxSegmentSize": { + "title": "MSS", + "description": "Sets MSS advertised to peer. Value 0 (default) will set MSS automatically in proportion to interface MTU. Default 0 is usually the best choice", + "type": "integer", + "default": 0, + "anyOf": [ + { + "maximum": 9162, + "minimum": 256 + }, + { + "const": 0 + } + ] + }, + "resetOnTimeout": { + "title": "Reset on timeout", + "description": "If true (default), connections which time out will be reset (that is, the system sends an RST packet to the peer) before the system expunges them", + "type": "boolean", + "default": true + }, + "synCookieAllowlist": { + "title": "Syn Cookie Allowlist", + "description": "Specifies whether or not to use a SYN Cookie Allowlist when doing software SYN Cookies. This means not doing a SYN Cookie for the same src IP address if it has been done already in the previous tm.flowstate.timeout (30) seconds. The default value is disabled.", + "type": "boolean", + "default": false + }, + "synCookieEnable": { + "title": "SYN cookie enable", + "description": "Enables syn-cookies capability on this virtual server. If true (default), the system may use SYN cookies to avert connection-table overflow (for example, from DoS attacks)", + "type": "boolean", + "default": true + }, + "tcpCloseTimeout": { + "title": "TCP Close timeout", + "description": "Specifies an TCP close timeout in seconds. Value -1 means indefinite (not recommended)", + "type": "integer", + "default": 5, + "maximum": 86400, + "minimum": -1 + }, + "tcpHandshakeTimeout": { + "title": "TCP Handshake timeout", + "description": "Specifies a TCP handshake timeout in seconds. The default value is 5 seconds. Value -1 means indefinite (not recommended)", + "type": "integer", + "maximum": 86400, + "default": 5, + "minimum": -1 + } + }, + "required": [ + "class" + ], + "additionalProperties": false + }, + "Log_Destination": { + "title": "Log Destination", + "description": "Configures a log destination", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Log_Destination" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "remark": { + "$ref": "#/definitions/Remark" + }, + "type": { + "description": "The type of the log destination", + "type": "string", + "enum": [ + "management-port", + "remote-high-speed-log", + "remote-syslog", + "splunk" + ] + } + }, + "required": [ + "class", + "type" + ], + "allOf": [ + { + "if": { + "properties": { + "type": { + "const": "management-port" + } + } + }, + "then": { + "$ref": "#/definitions/Log_Destination_Management_Port" + } + }, + { + "if": { + "properties": { + "type": { + "const": "remote-syslog" + } + } + }, + "then": { + "$ref": "#/definitions/Log_Destination_Remote_Syslog" + } + }, + { + "if": { + "properties": { + "type": { + "const": "remote-high-speed-log" + } + } + }, + "then": { + "$ref": "#/definitions/Log_Destination_Remote_High_Speed_Log" + } + }, + { + "if": { + "properties": { + "type": { + "const": "splunk" + } + } + }, + "then": { + "$ref": "#/definitions/Log_Destination_Splunk" + } + } + ] + }, + "Log_Destination_Management_Port": { + "title": "Log Destination Management Port", + "description": "Sends received messages to a specified IP address and port through the management interface", + "type": "object", + "properties": { + "address": { + "description": "Specifies the IP address that will receive messages from the specified local Log Destination", + "type": "string", + "format": "f5ip" + }, + "port": { + "description": "Specifies the port of the IP address that will receive messages from the specified local Log Destination", + "type": "integer", + "minimum": 0, + "maximum": 65535 + }, + "protocol": { + "description": "Specifies the protocol for the system to use to send logs to the specified location", + "type": "string", + "enum": [ + "tcp", + "udp" + ], + "default": "tcp" + } + }, + "required": [ + "address", + "port" + ] + }, + "Log_Destination_Remote_High_Speed_Log": { + "title": "Log Destination Remote High Speed Log", + "description": "Sends received messages to a specified pool", + "type": "object", + "properties": { + "distribution": { + "description": "Specifies the distribution method used to send messages to pool members", + "type": "string", + "enum": [ + "adaptive", + "balanced", + "replicated" + ], + "default": "adaptive" + }, + "protocol": { + "description": "Specifies the protocol for the system to use to send logs to the pool", + "type": "string", + "enum": [ + "tcp", + "udp" + ], + "default": "tcp" + }, + "pool": { + "$ref": "#/definitions/Pointer_Pool" + } + }, + "required": [ + "pool" + ] + }, + "Log_Destination_Remote_Syslog": { + "title": "Log Destination Remote Syslog", + "description": "Configures Remote Syslog destinations to format log messages into Syslog format and forward them to a Remote High-Speed Log destination", + "type": "object", + "properties": { + "format": { + "description": "Specifies the method to use to format the logs", + "type": "string", + "enum": [ + "legacy-bigip", + "rfc3164", + "rfc5424" + ], + "default": "rfc3164" + }, + "defaultFacility": { + "description": "Specifies the facility given to log messages received that do not already have a facility listed", + "type": "string", + "enum": [ + "local0", + "local1", + "local2", + "local3", + "local4", + "local5", + "local6", + "local7" + ], + "default": "local0" + }, + "defaultSeverity": { + "description": "Specifies the severity given to log messages received that do not already have a severity listed", + "type": "string", + "enum": [ + "alert", + "crit", + "debug", + "emerg", + "err", + "info", + "notice", + "warn" + ], + "default": "info" + }, + "remoteHighSpeedLog": { + "description": "Specifies a remote high-speed log destination, which the system uses to forward the logs to a pool of remote log servers", + "allOf": [ + { + "$ref": "#/definitions/Pointer_BIGIP_Or_Use" + }, + { + "type": "object", + "properties": { + "use": { + "description": "BIG-IP AS3 pointer to remote high speed log declaration", + "minLength": 1, + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "const": "Log_Destination" + }, + "type": { + "const": "remote-high-speed-log" + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "description": "Pathname of existing BIG-IP remote high speed log", + "format": "f5bigip" + } + }, + "f5PostProcess": { + "tag": "bigComponent", + "data": [ + "query sys log-config destination remote-high-speed-log" + ] + } + } + ], + "minProperties": 1, + "maxProperties": 1 + } + }, + "required": [ + "remoteHighSpeedLog" + ] + }, + "Log_Destination_Splunk": { + "title": "Log Destination Splunk", + "description": "Configures Splunk formatting destinations to format incoming log messages into Splunk format", + "type": "object", + "properties": { + "forwardTo": { + "description": "Specifies the log destination to which logs are forwarded", + "allOf": [ + { + "$ref": "#/definitions/Pointer_Log_Destination" + } + ] + } + }, + "required": [ + "forwardTo" + ] + }, "Log_Publisher": { "title": "Log_Publisher", "description": "Configures lists of destinations for the common logging interface", @@ -34472,6 +34838,48 @@ "maxProperties": 1, "minProperties": 1 }, + "Pointer_L4_Profile": { + "title": "Pointer L4 Profile", + "description": "Reference to a fast L4 profile", + "maxProperties": 1, + "minProperties": 1, + "allOf": [ + { + "$ref": "#/definitions/Pointer_BIGIP_Or_Use" + }, + { + "type": "object", + "properties": { + "use": { + "f5PostProcess": { + "tag": "pointer", + "data": { + "properties": { + "class": { + "enum": [ + "L4_Profile" + ] + } + }, + "required": [ + "class" + ] + } + } + }, + "bigip": { + "format": "f5bigip" + } + }, + "f5PostProcess": { + "data": [ + "query ltm profile fastl4" + ], + "tag": "bigComponent" + } + } + ] + }, "Pointer_Log_Destination": { "title": "Pointer Log Destination", "description": "Reference to a log destination", diff --git a/scripts/build/buildRpm.sh b/scripts/build/buildRpm.sh index f699ae5d..97829cfc 100755 --- a/scripts/build/buildRpm.sh +++ b/scripts/build/buildRpm.sh @@ -20,7 +20,7 @@ function set_vars() { RELEASE=$(echo $FULL_VERSION | sed 's/[0-9.]*-//') VERSION=$(echo $FULL_VERSION | sed 's/-[0-9]*//') MAINDIR=$(pwd) - DISCOVERY_WORKER_VERSION="1.13.0-3" + DISCOVERY_WORKER_VERSION="1.14.0-1" DISCOVERY_WORKER_URL="https://${ARTIFACTORY_URL}/artifactory/list/ecosystems-f5-service-discovery-rpm/f5-service-discovery-${DISCOVERY_WORKER_VERSION}.noarch.rpm" CLOUDLIBS_VER=$(echo $DISCOVERY_WORKER_VERSION) } diff --git a/scripts/build/generate-all-properties-declaration.js b/scripts/build/generate-all-properties-declaration.js index 0224520c..0285975c 100644 --- a/scripts/build/generate-all-properties-declaration.js +++ b/scripts/build/generate-all-properties-declaration.js @@ -17,7 +17,7 @@ 'use strict'; const fs = require('fs'); -const rimraf = require('rimraf'); +const rimraf = require('rimraf').rimraf; const Mocha = require('mocha'); const schema = require('../../src/schema/latest/adc-schema.json'); const propertiesCommon = require('../../test/integration/bigip/property/propertiesCommon'); diff --git a/scripts/build/image-build.sh b/scripts/build/image-build.sh index 5b52f838..dc109b97 100755 --- a/scripts/build/image-build.sh +++ b/scripts/build/image-build.sh @@ -6,7 +6,7 @@ IMAGE_NAME="${IMAGE_NAME:-f5-as3-container}" TARGET=$(ls -v dist/*appsvcs-3*.rpm 2>/dev/null|tail -1) IMAGE_TAG=$(rpm -qp --queryformat '%{VERSION}-%{RELEASE}' $TARGET) -if [[ ${CI_COMMIT_REF_NAME} == 'master' ]]; then +if [[ ${CI_COMMIT_REF_NAME} == 'main' ]]; then IMAGE_TAG=$(echo $IMAGE_TAG | grep -o "^[^-]\+") fi diff --git a/scripts/build/schema-build-doc.js b/scripts/build/schema-build-doc.js index aa93f835..d9c3f27f 100644 --- a/scripts/build/schema-build-doc.js +++ b/scripts/build/schema-build-doc.js @@ -18,7 +18,7 @@ const fs = require('fs'); const util = require('util'); -const rimraf = require('rimraf'); +const rimraf = require('rimraf').rimraf; const schemaDoc = require('f5-schema-doc'); const schemaBuild = require('./schema-build').build; diff --git a/scripts/build/schema-build.js b/scripts/build/schema-build.js index 0a818106..2a10fc69 100644 --- a/scripts/build/schema-build.js +++ b/scripts/build/schema-build.js @@ -171,6 +171,19 @@ function getApplicationClassNames(schema) { .filter((name) => skipList.indexOf(name) === -1); } +/** + * identifies special class cases and returns their expected values + * @param {string} cls - class name like "iRule" + */ +function checkClass(cls) { + switch (cls) { + case 'iRule': + return 'IRule'; // Shared Schema requires definitions start with capitals + default: + return cls; + } +} + function buildApplicationAdditionalProps() { return readSchema('adc-schema.json') .then((data) => { @@ -185,7 +198,7 @@ function buildApplicationAdditionalProps() { }, allOf: classes.map((c) => ({ if: { properties: { class: { const: c } } }, - then: { $ref: `#/definitions/${c}` } + then: { $ref: `#/definitions/${checkClass(c)}` } })) }; return writeSchema('adc-schema.json', schema); @@ -249,8 +262,16 @@ function buildSharedSchema() { 'HTTP_Profile_Reverse', 'HTTP_Profile_Transparent', 'HTTP2_Profile', + 'IRule', + 'IRule_Core', 'JWE', + 'Log_Destination', + 'Log_Destination_Management_Port', + 'Log_Destination_Remote_Syslog', + 'Log_Destination_Remote_High_Speed_Log', + 'Log_Destination_Splunk', 'Log_Publisher', + 'L4_Profile', 'Pointer_BIGIP', 'Pointer_BIGIP_Or_Use', 'Pointer_CA_Bundle', @@ -260,6 +281,7 @@ function buildSharedSchema() { 'Pointer_F5_String_Or_BIGIP', 'Pointer_HTTP_Acceleration_Profile', 'Pointer_HTTP_Profile', + 'Pointer_L4_Profile', 'Pointer_Log_Destination', 'Pointer_Log_Publisher', 'Pointer_Pool', diff --git a/scripts/dev/update-as3-deps.sh b/scripts/dev/update-as3-deps.sh index 5477cc6c..c71f7c1f 100755 --- a/scripts/dev/update-as3-deps.sh +++ b/scripts/dev/update-as3-deps.sh @@ -1,13 +1,7 @@ # Update deps to latest using npm-check-updates # exlude version-pinned deps # --------------------------------------------- -# ajv 6.x - Node.js incompatibility in newer major versions -# semver 5.x - Node.js incompatibility in newer major versions -# nock 10.0.0 - Node.js incompatibility in newer versions -# sinon 7.x - Node.js incompatibility in newer major versions -# error 7.x - Node.js incompatibility in newer major versions -# eslint 7.x - requires devs to use Node.js 16+ in newer major verisons -# uuid 3.4.0 - Newer versions break unit tests +# Go to the link in '${CONFLUENCE_URL}/display/PDESETEAM/Package+Dependencies+-+Pinned' to see a list npx npm-check-updates -u -x ajv,semver,nock,sinon,error,eslint,uuid npm i npm upgrade diff --git a/src/app/README.md b/src/app/README.md deleted file mode 100644 index 1edbf386..00000000 --- a/src/app/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# Using AS3 in the f5-icontrol-gateway container -+ Download the container -+ Install the container on your system - ``` - docker load --input /path/to/f5-as3-container-fig.tar.gz - ``` -+ Run the container - ``` - docker run -p 8443:443 --rm --name f5-as3-container f5-as3-container-fig:latest - ``` -+ Create a declaration as you would for AS3 running in the Application Services Gateway container -+ POST the declration. Important, POST to /shared, not /mgmt/shared - ``` - curl -sku admin:admin -X POST -d @'declaration_file' https://localhost:8443/shared/appsvcs/declare - ``` -+ To login to the shell to explore - ``` - docker exec -it f5-as3-container /bin/bash - ``` -+ Code is installed in /var/config/rest/iapps/f5-appsvcs as usual -+ Config file is installed to /etc/unit/f5-appsvcs.conf -+ For more information on the f5-icontrol-gateway, see: https://hub.docker.com/r/f5devcentral/f5-icontrol-gateway diff --git a/src/app/app.js b/src/app/app.js deleted file mode 100644 index 45e7996b..00000000 --- a/src/app/app.js +++ /dev/null @@ -1,66 +0,0 @@ -/** - * Copyright 2023 F5 Networks, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -'use strict'; - -// eslint-disable-next-line import/no-extraneous-dependencies -const express = require('express'); // express is installed in the container - -const config = require('./config'); -const RestOperation = require('./restOperation'); - -const RestWorker = require('../nodejs/restWorker'); - -const restWorker = new RestWorker(); - -function setupRoutes(app) { - app.get('/shared/appsvcs/*', (req, res) => { - try { - const restOperation = new RestOperation(req, res); - restWorker.onGet(restOperation); - } catch (err) { - res.send(err); - } - }); - - app.post('/shared/appsvcs/*', (req, res) => { - try { - const restOperation = new RestOperation(req, res); - restWorker.onPost(restOperation); - } catch (err) { - res.send(err); - } - }); -} - -function start() { - const app = express(); - app.use(express.json()); - - function onSuccess() { - setupRoutes(app); - } - - function onFailure(data) { - // eslint-disable-next-line no-console - console.log(`Unable to start f5-appsvcs: ${JSON.stringify(data)}`); - } - - restWorker.onStartCompleted(onSuccess, onFailure, null, null, config.initialHostContext); - return app; -} - -module.exports = { start }; diff --git a/src/app/config.js b/src/app/config.js deleted file mode 100644 index d44bfaa6..00000000 --- a/src/app/config.js +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Copyright 2023 F5 Networks, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -'use strict'; - -const constants = require('../lib/constants'); - -module.exports = { - initialHostContext: { - deviceType: constants.DEVICE_TYPES.CONTAINER - } -}; diff --git a/src/app/restOperation.js b/src/app/restOperation.js deleted file mode 100644 index 0faec0b9..00000000 --- a/src/app/restOperation.js +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Copyright 2023 F5 Networks, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -'use strict'; - -class RestOperation { - constructor(req, res) { - this.req = req; - this.res = res; - } - - complete() {} - - getBasicAuthorization() {} - - getBody() { - if (this.method === 'Get') { - return null; - } - return this.req.body; - } - - setBody(body) { - this.res.json(body); - } - - get method() { - // Rest framwork uses form like 'Get' - return this.req.method.charAt(0) + this.req.method.slice(1).toLowerCase(); - } - - setStatusCode(code) { - this.res.status(code); - } - - getUri() { - return { - path: this.req.path, - pathname: this.req.path - }; - } - - get uri() { - return this.getUri(); - } -} - -module.exports = RestOperation; diff --git a/src/app/unitapp.conf b/src/app/unitapp.conf deleted file mode 100644 index 8ad2c7ff..00000000 --- a/src/app/unitapp.conf +++ /dev/null @@ -1,21 +0,0 @@ -{ - "routes": [ - { - "match": { - "uri": "/shared/appsvcs*" - }, - "action": { - "pass": "applications/f5-appsvcs" - } - } - ], - "applications": { - "f5-appsvcs": { - "type": "external", - "working_directory": "/var/config/rest/iapps/f5-appsvcs", - "executable": "app/unitapp.js", - "user": "nginx", - "group": "nginx" - } - } -} \ No newline at end of file diff --git a/src/app/unitapp.js b/src/app/unitapp.js deleted file mode 100755 index bb793796..00000000 --- a/src/app/unitapp.js +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Copyright 2023 F5 Networks, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -'use strict'; - -const { - createServer, - IncomingMessage, - ServerResponse -} = require('unit-http'); // eslint-disable-line import/no-unresolved - -require('http').ServerResponse = ServerResponse; -require('http').IncomingMessage = IncomingMessage; - -const app = require('./app'); - -createServer(app.start()).listen(); diff --git a/src/lib/adcParser.js b/src/lib/adcParser.js index 6438850c..a36ea45a 100644 --- a/src/lib/adcParser.js +++ b/src/lib/adcParser.js @@ -181,13 +181,16 @@ class As3Parser { * modifications (WILL BE MODIFIED) * @param {Boolean} [options.copySecrets=false] - copy sv cryptograms to baseDeclaration * @param {Object} [options.previousDeclaration] - the previous saved declaration + * @param {Boolean} [options.isPerApp=false] - Validates against per-app && ignores + * PostProcess step * @returns {Promise} - resolves to declaration label+id (declaration is MODIFIED) */ digest(context, declaration, options) { const defaultOpts = { copySecrets: false, baseDeclaration: {}, - previousDeclaration: {} + previousDeclaration: {}, + isPerApp: false }; this.options = Object.assign(this.options, defaultOpts, options); this.fetches = []; @@ -201,8 +204,6 @@ class As3Parser { } this.context = context; - // TODO: Update as3Digest() to receive 'context' instead of 'this' - // return as3Digest.call(this, declaration) --> return as3Digest(context, declaration) return as3Digest.call(this, declaration) .then((results) => { log.debug('success parsing declaration'); @@ -265,12 +266,6 @@ function prepareParserAjv() { // Add AS3 custom string formats parserFormats.forEach((format) => ajv.addFormat(format.name, format.check)); - // - // Add AS3 custom keywords - // - // (AJV custom keyword execution order: - // https://github.com/epoberezkin/ajv/issues/578 ) - // parserKeywords.keywords.forEach((keyword) => ajv.addKeyword(keyword.name, keyword.definition(this))); @@ -279,18 +274,25 @@ function prepareParserAjv() { function validate(declaration) { const parserTime = new Date(); + const validator = this.options.isPerApp ? 'app' : 'adc'; + let id = declaration.id; - const validator = this.context.request.isPerApp ? 'app' : 'adc'; + if (validator === 'app') { + // Use the transformed declaration id for consistency + id = this.context.request.body.id; + } // what is the ID of this declaration? - if (!Object.prototype.hasOwnProperty.call(declaration, 'id') - || (!id.match(/^[^\x00-\x20\x22'<>\x5c^`|\x7f]{0,255}$/))) { + if (validator === 'adc' && (!Object.prototype.hasOwnProperty.call(declaration, 'id') + || (!id.match(/^[^\x00-\x20\x22'<>\x5c^`|\x7f]{0,255}$/)))) { + // Per-app declarations do not currently support id const error = new Error('declaration lacks valid \'id\' property'); error.status = 422; return Promise.reject(error); } - if (Object.prototype.hasOwnProperty.call(declaration, 'label') - && (declaration.label.match(/^[^\x00-\x1f\x22#&*<>?\x5b-\x5d`\x7f]{1,48}$/))) { + if (validator === 'adc' && (Object.prototype.hasOwnProperty.call(declaration, 'label') + && (declaration.label.match(/^[^\x00-\x1f\x22#&*<>?\x5b-\x5d`\x7f]{1,48}$/)))) { + // Per-app declarations do not currently support label id = `id ${id}|${declaration.label.replace(/'/g, '.')}`; } else { id = `id ${id}`; @@ -344,10 +346,13 @@ function as3Digest(declaration) { let getNodelist = Promise.resolve([]); let getVirtualAddresses = Promise.resolve([]); let getAccessProfileList = Promise.resolve([]); - if (!declaration.scratch) { + let getAddressListList = Promise.resolve([]); + if (!declaration.scratch && !this.options.isPerApp) { + // per-app validation does NOT require this getNodelist = util.getNodelist(this.context); - getVirtualAddresses = util.getVirtualAddressList(this.context); + getVirtualAddresses = util.getVirtualAddressList(this.context, 'Common'); getAccessProfileList = util.getAccessProfileList(this.context); + getAddressListList = util.getAddressListList(this.context, 'Common'); } this.postProcess = []; @@ -357,17 +362,31 @@ function as3Digest(declaration) { return getNodelist .then((nodelist) => { this.nodelist = nodelist; }) .then(() => getVirtualAddresses) - .then((virtualAddressList) => { this.virtualAddressList = virtualAddressList.filter((address) => address.partition === 'Common'); }) + .then((virtualAddressList) => { this.virtualAddressList = virtualAddressList; }) .then(() => getAccessProfileList) .then((accessProfileList) => { this.accessProfileList = accessProfileList; }) + .then(() => getAddressListList) + .then((addressListList) => { this.addressListList = addressListList; }) .then(() => Config.getAllSettings()) .then((settings) => { this.settings = settings; }) .then(() => validate.call(this, declaration)) - .then(() => PostProcessor.process(this.context, declaration, originalDeclaration, this.postProcess)) - .then((postProcessResults) => { - results.warnings = postProcessResults.warnings; + .then(() => { + if (this.options.isPerApp) { + // We are skipping postProcessing as it will be done after transformation in request context + return Promise.resolve(); + } + return PostProcessor.process(this.context, declaration, originalDeclaration, this.postProcess) + .then((postProcessResults) => { + results.warnings = postProcessResults.warnings; + }); + }) + .then(() => { + if (this.options.isPerApp) { + // Without path expansion from postProcess, this step is pointless + return Promise.resolve(); + } + return PostValidator.validate(this.context, declaration); }) - .then(() => PostValidator.validate(this.context, declaration)) .then(() => { if (this.options.copySecrets && this.options.baseDeclaration) { copySecrets(declaration, this.options.baseDeclaration); diff --git a/src/lib/as3request.js b/src/lib/as3request.js index 3db96f1e..0dc14929 100644 --- a/src/lib/as3request.js +++ b/src/lib/as3request.js @@ -137,11 +137,6 @@ class As3Request { }); } - convertToADCClass(request) { - request.class = request.class || 'ADC'; - return request; - } - // wrap to get/set the context of the AS3 host and the targeted device // For container, target* properties in AS3 class determines the device to deploy config to // For bigiq, target* properties refer to itself, and decl.target determines the device to deploy config to @@ -195,10 +190,6 @@ class As3Request { let error; let request = util.simpleCopy(requestContext.body); - if (requestContext.isPerApp) { - request = this.convertToADCClass(request); - } - // populate AS3 class prop defaults from schema if req === [ADC] request = this.wrapWithAS3Class(request, requestContext.pathName); @@ -206,12 +197,6 @@ class As3Request { error = this.getValidatorError(); } - // 'class' is not part of a per-app request, but we added it to pass this - // early validation and need to remove it now - if (requestContext.isPerApp && request.declaration) { - delete request.declaration.class; - } - if (!Array.isArray(request)) { request = [request]; } diff --git a/src/lib/audit.js b/src/lib/audit.js index 1b919cb8..3749c983 100644 --- a/src/lib/audit.js +++ b/src/lib/audit.js @@ -266,8 +266,11 @@ const auditTenant = function (context, tenantId, declaration, commonConfig, prev const tenantControls = util.simpleCopy(context.control); - // Update tenantControls object with any tenant controls from the declaration - util.updateControlsWithDecl(tenantControls, declaration[tenantId].controls); + if (!context.request.isPerApp) { + // Update tenantControls object with any tenant controls from the declaration + // PerApp does not support tenant controls, yet + util.updateControlsWithDecl(tenantControls, declaration[tenantId].controls); + } log.updateGlobalSettings(tenantControls); if (typeof tenantControls.fortune !== 'undefined') { @@ -324,7 +327,9 @@ const auditTenant = function (context, tenantId, declaration, commonConfig, prev return Promise.resolve() .then(() => { - if (declaration[tenantId].optimisticLockKey && previousDeclaration[tenantId] !== undefined) { + // PerApp does not support optimisticLockKey, yet 5/22/2023 + if (!context.request.isPerApp && declaration[tenantId].optimisticLockKey + && previousDeclaration[tenantId] !== undefined) { delete previousDeclaration[tenantId].optimisticLockKey; const localHash = hash.hashTenant(JSON.stringify(previousDeclaration[tenantId])); if (localHash !== declaration[tenantId].optimisticLockKey) { diff --git a/src/lib/classes.js b/src/lib/classes.js index 32f343f1..e05a8bc7 100644 --- a/src/lib/classes.js +++ b/src/lib/classes.js @@ -176,6 +176,7 @@ module.exports = { NAT_Policy: 'security nat policy', NAT_Source_Translation: 'security nat source-translation', Net_Address_List: 'net address-list', + Net_Port_List: 'net port-list', Log_Publisher: 'sys log-config publisher', Log_Destination: [ 'sys log-config destination management-port', diff --git a/src/lib/context/requestContext.js b/src/lib/context/requestContext.js index 88af1d86..f378ed91 100644 --- a/src/lib/context/requestContext.js +++ b/src/lib/context/requestContext.js @@ -37,7 +37,8 @@ * Otherwise it is undefined. * isPerApp - Detects if the request used the per-app interface and sets the * boolean appropriately. - * perAppInfo - logs the tenant and the application name for later reference + * perAppInfo - logs the tenant, relevant application names, and original + * declaration for later reference * declarations - An array of wrapped and normalized sub-declarations * dryRun - A boolean to indicate if the task is to run as a dry-run * @@ -57,6 +58,7 @@ */ const EventEmitter = require('events'); + const log = require('../log'); const constants = require('../constants'); const config = require('../config'); @@ -66,6 +68,7 @@ const Tracer = require('../tracer').Tracer; const tracerUtil = require('../tracer').Util; const tracerTags = require('../tracer').Tags; const STATUS_CODES = require('../constants').STATUS_CODES; +const perAppUtil = require('../util/perAppUtil'); class RequestContext { static get(restOperation, hostContext) { @@ -73,6 +76,10 @@ class RequestContext { this.as3Wrapper = new As3Request(constants.reqSchemaFile); } const initialContext = buildInitialContext(restOperation); + if (initialContext.error) { + return Promise.resolve(initialContext); + } + const allowedCheck = checkIfAllowed(initialContext, hostContext); if (allowedCheck.failed) { initialContext.error = allowedCheck.error; @@ -103,6 +110,11 @@ class RequestContext { return reqContext; } + if (reqContext.isPerApp && reqContext.method !== 'Get' && reqContext.method !== 'Delete') { + // Blindly transform into per-tenant, to be validated in declareHandler + reqContext.body = perAppUtil.convertToPerTenant(reqContext.body, reqContext.perAppInfo); + } + const validated = this.as3Wrapper.validateAndWrap(reqContext, hostContext); if (validated.error) { @@ -295,9 +307,34 @@ function buildInitialContext(restOperation) { context.isPerApp = splitSubPath[1] === 'applications'; if (context.isPerApp) { context.perAppInfo = { - tenant: splitSubPath[0], - app: splitSubPath[2] + tenant: splitSubPath[0] }; + + let apps = []; + switch (context.method) { + case 'Delete': + case 'Get': + // DELETE & GET apps come from the URL + apps = (typeof splitSubPath[2] === 'undefined') ? [] : [splitSubPath[2]]; + break; + case 'Post': + if (Array.isArray(context.body)) { + context.error = 'declaration should be an object'; + context.errorCode = 422; + } else { + // POST apps comes from the declaration + Object.keys(context.body).forEach((key) => { + if (context.body[key].class === 'Application') { + apps.push(key); + } + }); + // Store original declaration for later validation + context.perAppInfo.decl = util.simpleCopy(context.body); + } + break; + default: + } + context.perAppInfo.apps = apps; } } context.queryParams = getQueryParams(context.fullPath, context.pathName); diff --git a/src/lib/declarationHandler.js b/src/lib/declarationHandler.js index 355facd2..a44c4baf 100644 --- a/src/lib/declarationHandler.js +++ b/src/lib/declarationHandler.js @@ -180,14 +180,14 @@ class DeclarationHandler { /** * This function parses and formats the declaration for per-app * - * @param {object} decl The declaration which holds the application and tenant info - * @param {string} tenant The desired tenant name which holds the application - * @param {string} [app] The desired application name, if undefined return array of all applications + * @param {object} decl - The declaration which holds the application and tenant info + * @param {string} tenant - The desired tenant name which holds the application + * @param {string[]} apps - Array of desired application names, if empty return array of all applications * @returns {object} .body: is the GET returned value * .statusCode: STATUS_CODE of the result * .message: The error message, if there is one */ - filterAppInDeclaration(decl, tenant, app) { + filterAppsInDeclaration(decl, tenant, apps) { if (typeof decl[tenant] === 'undefined') { return { statusCode: STATUS_CODES.NOT_FOUND, @@ -195,8 +195,8 @@ class DeclarationHandler { }; } const perAppDecl = {}; - if (typeof app === 'undefined') { - // If apps is undefined, we want all apps in tenant + if (apps.length === 0) { + // If the apps array is empty, we want all apps in tenant Object.keys(decl[tenant]).forEach((appName) => { if (decl[tenant][appName].class === 'Application') { perAppDecl[appName] = decl[tenant][appName]; @@ -207,14 +207,23 @@ class DeclarationHandler { statusCode: STATUS_CODES.OK }; } - if (typeof decl[tenant][app] === 'undefined') { - return { - statusCode: STATUS_CODES.NOT_FOUND, - message: (`specified Application '${app}' not found in '${tenant}'`) - }; - } - perAppDecl[app] = decl[tenant][app]; + const missingApps = []; + apps.forEach((app) => { + if (typeof decl[tenant][app] === 'undefined') { + missingApps.push({ + statusCode: STATUS_CODES.NOT_FOUND, + message: (`specified Application '${app}' not found in '${tenant}'`) + }); + } else { + perAppDecl[app] = decl[tenant][app]; + } + }); + + if (missingApps.length > 0) { + // Only 1 error message can be returned at a time, so return the first + return missingApps[0]; + } return { body: perAppDecl, @@ -327,10 +336,10 @@ class DeclarationHandler { return digestDeclaration; } - const appFilterResult = this.filterAppInDeclaration( + const appFilterResult = this.filterAppsInDeclaration( digestDeclaration, context.request.perAppInfo.tenant, - context.request.perAppInfo.app + context.request.perAppInfo.apps ); if (appFilterResult.statusCode !== STATUS_CODES.OK) { return DeclarationHandler.buildResult(appFilterResult.statusCode, appFilterResult.message); @@ -420,6 +429,9 @@ class DeclarationHandler { let decl = currentTask.declaration; // may be a stub if (!context.request.isPerApp) { decl.updateMode = decl.updateMode || 'selective'; + } else { + // perApp mode relies on selective updates to prevent requests from overwriting each other + decl.updateMode = 'selective'; } let mutexRefresher = null; const commonConfig = {}; @@ -638,6 +650,7 @@ class DeclarationHandler { context.host.parser.nodelist = commonNodeList; commonConfig.nodeList = commonNodeList; commonConfig.virtualAddressList = context.host.parser.virtualAddressList; + commonConfig.addressListList = context.host.parser.addressListList; let x; declarationFullId = decl.id; @@ -655,7 +668,7 @@ class DeclarationHandler { declarationFullId += `|${decl.label.replace(regex, '.')}`; } - const tenantListResult = fetch.tenantList(decl); + const tenantListResult = fetch.tenantList(decl, context.request.perAppInfo); context.tasks[context.currentIndex].firstPassNoDelete = tenantListResult.firstPassNoDelete; const tenantList = tenantListResult.list; @@ -898,7 +911,16 @@ class DeclarationHandler { // does customer want to save or sync updated config? if (currentTask.persist) { - promise = promise.then(() => persistConfig(context)); + promise = promise + .then(() => persistConfig(context)) + .then((status) => { + if (status.warning) { + response.results.forEach((result) => { + result.warnings = result.warnings || []; + result.warnings.push(status.warning); + }); + } + }); } if (currentTask.syncToGroup !== '') { promise = promise.then(() => configSync(context, @@ -1061,7 +1083,7 @@ class DeclarationHandler { * just map whatever they get from caller and/or * framework to a request object and send it here * - * @param {object} context + * @param {object} context - full AS3 context object * @returns {Promise} */ process(context) { @@ -1172,6 +1194,10 @@ function persistConfig(context) { return true; } + if (error.message.indexOf('Connection refused') > -1) { + return true; + } + return false; } @@ -1181,9 +1207,11 @@ function persistConfig(context) { } if (error.message.indexOf('Task not found') > -1) { - error.message = 'Record no longer exists on BIG-IP for saving configuration task' - + ` (ID: ${id}). To avoid this issue in the future, try increasing the` + const warning = 'AS3 was unable to verify that the configuration was persisted.' + + ' To avoid this issue in the future, try increasing the' + ' following DB variables: icrd.timeout, restjavad.timeout, restnoded.timeout'; + log.warning(warning); + return Promise.resolve({ warning }); } throw error; @@ -1211,9 +1239,9 @@ function persistConfig(context) { return util.iControlRequest(context, startOptions); }) .then(() => waitForCompletion(120)) - .then(() => { + .then((result) => { log.debug('BIG-IP config saved'); - return true; + return typeof result !== 'undefined' ? result : true; }) .catch((e) => { e.message = `failed to save BIG-IP config (${e.message})`; diff --git a/src/lib/declarationProvider.js b/src/lib/declarationProvider.js index fdc3980d..ab874590 100644 --- a/src/lib/declarationProvider.js +++ b/src/lib/declarationProvider.js @@ -493,6 +493,23 @@ class DeclarationProvider { } else { declToReturn = {}; } + + const controlsName = Object.keys(declToReturn) + .find((key) => declToReturn[key].class === 'Controls'); + if (controlsName) { + const action = util.getDeepValue(declToReturn[controlsName], 'internalUse.action'); + if (action === 'dry-run') { + declToReturn[controlsName].dryRun = true; + if (Object.keys(declToReturn[controlsName].internalUse).length === 1) { + delete declToReturn[controlsName].internalUse; + } else { + log.warning(`Unexpected properties in controls.internalUse: ${JSON.stringify(declToReturn[controlsName].internalUse)}`); + } + } else { + log.warning(`Unexpected action "${action}" in controls`); + } + } + log.debug(`fetched declaration from target, ${fakeDecl.metadata.blocks} blocks, ${fakeDecl.metadata.tenants.length} Tenants`); return (includeMetadata) ? { diff --git a/src/lib/declareHandler.js b/src/lib/declareHandler.js index 454ad024..7a7b78ef 100644 --- a/src/lib/declareHandler.js +++ b/src/lib/declareHandler.js @@ -456,6 +456,8 @@ function parseDeclRequest(requestContextCopy, task) { delete declReq.restOp; delete declReq.controls; delete declReq.basicAuth; + delete declReq.isPerApp; + delete declReq.perAppInfo; return Promise.resolve(declReq); } @@ -496,11 +498,10 @@ function getInitialControls(context, settings) { } function processDeclInArray(item, index, context) { - let errorMessage; let declResult; if (item.hasDuplicate) { - errorMessage = 'Error(s): \'Invalid/Duplicate\': another request exists with the same targetHost-declaration tenant, declaration target, and/or declaration tenant-app'; + let errorMessage = 'Error(s): \'Invalid/Duplicate\': another request exists with the same targetHost-declaration tenant, declaration target, and/or declaration tenant-app'; if (!item.validatorResult.isValid) { errorMessage += `${VALIDATOR_ERR_PREFIX} ${item.validatorResult.data}`; } @@ -508,32 +509,67 @@ function processDeclInArray(item, index, context) { return Promise.resolve(declResult); } if (!item.validatorResult.isValid) { - errorMessage = `${VALIDATOR_ERR_PREFIX} ${item.validatorResult.data}`; + const errorMessage = `${VALIDATOR_ERR_PREFIX} ${item.validatorResult.data}`; declResult = restUtil.buildOpResult(STATUS_CODES.UNPROCESSABLE_ENTITY, errorMessage); return Promise.resolve(declResult); } - const reqCopy = Object.assign({}, context.request); - const task = Object.assign({}, context.tasks[index]); - - return parseDeclRequest(reqCopy, task) - .then((declReq) => { - if (typeof declReq.success !== 'undefined' && !declReq.success) { - return declReq; + return Promise.resolve() + .then(() => { + if (context.request.isPerApp && context.request.method !== 'Get' && context.request.method !== 'Delete') { + // validate the per-app declaration + return Promise.resolve() + .then(() => context.host.parser.digest( + context, + context.request.perAppInfo.decl, + { isPerApp: true } // Runs in perApp verification mode (e.g. skips PostProcess) + )) + .catch((e) => { + if (typeof e.errors === 'undefined') { + // Continue on if there are no actual errors + return Promise.resolve(); + } + log.error(e); + + const body = { + code: STATUS_CODES.UNPROCESSABLE_ENTITY, + errors: e.errors, + message: e.message + }; + declResult = restUtil.buildOpResult(STATUS_CODES.UNPROCESSABLE_ENTITY, e.message, body); + return Promise.resolve(declResult); + }); } - - // TODO: Review these values being saved into context object - context.currentIndex = index; - context.control = context.request.controls[index]; - context.tasks[index] = declReq; - context.tasks[index].control = context.request.controls[index]; - context.tasks[index].uuid = uuid.v4(); - const handler = new DeclarationHandler(); - return handler.process(context); + return Promise.resolve(); }) - .then((result) => { - declResult = restUtil.buildOpResult(result.statusCode, result.errorMessage, result.body); - return declResult; + .then((perAppError) => { + if (perAppError && typeof perAppError.message !== 'undefined') { + // If we have an error return it like the validation failures above + return Promise.resolve(perAppError); + } + + const reqCopy = Object.assign({}, context.request); + const task = Object.assign({}, context.tasks[index]); + + return parseDeclRequest(reqCopy, task) + .then((declReq) => { + if (typeof declReq.success !== 'undefined' && !declReq.success) { + return declReq; + } + + // TODO: Review these values being saved into context object + context.currentIndex = index; + context.control = context.request.controls[index]; + context.tasks[index] = declReq; + context.tasks[index].control = context.request.controls[index]; + context.tasks[index].uuid = uuid.v4(); + const handler = new DeclarationHandler(); + return handler.process(context); + }) + .then((result) => { + declResult = restUtil.buildOpResult(result.statusCode, result.errorMessage, result.body); + return declResult; + }); }); } @@ -565,7 +601,7 @@ function processRequest(context) { if (context.request.isMultiDecl) { restUtil.completeRequestMultiStatus(context.request.restOp, result); } else { - restUtil.completeRequest(context.request.restOp, result); + restUtil.completeRequest(context.request.restOp, result, context.request.perAppInfo); } } return result; @@ -707,7 +743,7 @@ function processSync(context) { if (context.request.isMultiDecl) { restUtil.completeRequestMultiStatus(context.request.restOp, result); } else { - restUtil.completeRequest(context.request.restOp, result); + restUtil.completeRequest(context.request.restOp, result, context.request.perAppInfo); } }, 45000); }); @@ -719,7 +755,7 @@ function processAsync(context) { if (context.request.isMultiDecl) { restUtil.completeRequestMultiStatus(context.request.restOp, result); } else { - restUtil.completeRequest(context.request.restOp, result); + restUtil.completeRequest(context.request.restOp, result, context.request.perAppInfo); } }); } diff --git a/src/lib/fetch.js b/src/lib/fetch.js index b1279e45..c7c3a131 100644 --- a/src/lib/fetch.js +++ b/src/lib/fetch.js @@ -16,9 +16,10 @@ 'use strict'; +const deepDiff = require('deep-diff'); const atgStorage = require('@f5devcentral/atg-storage'); const promiseUtil = require('@f5devcentral/atg-shared-utilities').promiseUtils; -const deepDiff = require('deep-diff'); +const arrayUtil = require('@f5devcentral/atg-shared-utilities').arrayUtils; const ipUtil = require('@f5devcentral/atg-shared-utilities').ipUtils; const mapAs3 = require('./map_as3'); const mapMcp = require('./map_mcp'); @@ -30,6 +31,9 @@ const constants = require('./constants'); const BEGIN_TRANS = 'tmsh::begin_transaction'; const COMMIT_TRANS = 'tmsh::commit_transaction'; + +const CREATE_LIST_REGEX = /tmsh::create (?:security firewall|net) (?:port|address)-list\s+(.+?)\s+/; + /** * Align objects to enable object "diff" comparison. * @@ -102,25 +106,30 @@ const validClassList = function (as3, className) { * * @public * @param {object} declaration - a declaration + * @param {object} perAppInfo - holds target tenant and apps array * @returns {array} - list of (Tenant-class) property names */ -const tenantList = function (declaration) { +const tenantList = function (declaration, perAppInfo) { const list = []; - let common = false; let firstPassNoDelete = false; - validClassList(declaration, 'Tenant').forEach((tenantId) => { - if (tenantId === 'Common') { - common = true; - } else { - list.push(tenantId); + if (typeof perAppInfo !== 'undefined') { + list.push(perAppInfo.tenant); // Tenant is mandatory in perAppInfo, should never be undefined + } else { + let common = false; + validClassList(declaration, 'Tenant').forEach((tenantId) => { + if (tenantId === 'Common') { + common = true; + } else { + list.push(tenantId); + } + }); + // config in /Common must be created first and deleted last + // so it must appear twice in the tenant list + if (common) { + firstPassNoDelete = true; + list.unshift('Common'); + list.push('Common'); } - }); - // config in /Common must be created first and deleted last - // so it must appear twice in the tenant list - if (common) { - firstPassNoDelete = true; - list.unshift('Common'); - list.push('Common'); } return { list, @@ -622,12 +631,13 @@ const getDesiredConfig = function (context, tenantId, declaration, commonConfig) const tenantDecl = declaration[tenantId]; const appPromiseFuncs = []; - if ((tenantDecl && tenantDecl.enable) || tenantId === 'Common') { + if (tenantId === 'Common' || (tenantDecl && tenantDecl.enable)) { appList = validClassList(tenantDecl, 'Application'); } appList.forEach((appId) => { - if (!tenantDecl[appId].enable) { + if ((context.request.isPerApp && (context.request.perAppInfo.apps.length > 0 + && context.request.perAppInfo.apps.indexOf(appId) === -1)) || !tenantDecl[appId].enable) { return; } @@ -809,7 +819,50 @@ function updateCommonAccessProfiles(context, desiredConfig) { return promiseUtil.series(promises).then(() => storage.persist()); } -function filterAs3Items(configs) { +// Recursively looks through address lists and filters referenced virtual-addresses +// from the config +function filterAddressListVirtualAddresses(addressListName, configs, commonConfig) { + if (!addressListName) { + return configs; + } + + let addressList; + + if (addressListName.startsWith('/Common')) { + addressList = commonConfig.addressListList.find((item) => item.fullPath === addressListName); + } else { + addressList = configs.find((item) => item.fullPath === addressListName); + } + + const addresses = addressList ? addressList.addresses : undefined; + if (addresses) { + configs = configs.filter((item) => { + if (item.kind === 'tm:ltm:virtual-address:virtual-addressstate') { + const match = addresses.find((firewallAddress) => { + if (firewallAddress.name.indexOf('-') === -1) { + return firewallAddress.name.split('/')[0] === item.address; + } + const rangeArray = firewallAddress.name.split('-'); + return ipUtil.isIPinRange(item.address, rangeArray[0], rangeArray[1]); + }); + return !match; + } + return true; + }); + } + + const addressLists = addressList ? addressList.addressLists : undefined; + if (addressLists) { + addressLists.forEach((subList) => { + const fullPath = `/${subList.partition}/${subList.subPath}/${subList.name}`; + configs = filterAddressListVirtualAddresses(fullPath, configs, commonConfig); + }); + } + + return configs; +} + +function filterAs3Items(context, configs, commonConfig) { configs.forEach((config) => { // Filter ephemeral pool members if (config.kind === 'tm:ltm:pool:poolstate' && config.membersReference.items) { @@ -833,6 +886,15 @@ function filterAs3Items(configs) { configs = configs.filter((item) => !(item.kind === 'tm:apm:policy:access-policy:access-policystate' && hiddenAccessPolicies.indexOf(item.fullPath) !== -1)); + // When using traffic-matching-criteria, TMOS manages virtual-addresses that are in the destination list, + // so ignore those when we are updating/creating. For delete, though we still need to handle it + // or the partition won't be empty in time and we won't be able to delete that. + if (context.request.method !== 'Delete') { + const tmc = configs.find((item) => item.kind === 'tm:ltm:traffic-matching-criteria:traffic-matching-criteriastate'); + const destinationAddrListName = tmc ? tmc.destinationAddressList : undefined; + configs = filterAddressListVirtualAddresses(destinationAddrListName, configs, commonConfig); + } + return configs; } @@ -867,28 +929,34 @@ function isAs3Item(context, item, partition, filter) { && item.metadata.find((m) => m.name === 'as3')) { return true; } - if (item.kind === 'tm:gtm:server:devices:devicesstate') { - return true; - } - if (item.kind === 'tm:gtm:server:virtual-servers:virtual-serversstate') { - return true; - } - if (item.kind === 'tm:gtm:prober-pool:members:membersstate') { - return true; - } if (/^tm:gtm:pool:(?:a|aaaa|cname|mx):members:membersstate$/.test(item.kind)) { return true; } - if (item.kind === 'tm:apm:profile:access:accessstate' && context.tasks[context.currentIndex].commonAccessProfiles - && context.tasks[context.currentIndex].commonAccessProfiles.find((profile) => profile === item.name)) { - return true; - } - if (item.kind === 'tm:gtm:topology:topologystate' && item.description !== constants.as3ManagedDescription) { - return false; - } - if (item.kind === 'shared:service-discovery:taskstate' - && decodeURIComponent(item.id).split(/\/|~/g)[1] === partition) { + + switch (item.kind) { + case 'tm:gtm:server:devices:devicesstate': + case 'tm:gtm:server:virtual-servers:virtual-serversstate': + case 'tm:gtm:prober-pool:members:membersstate': + case 'tm:ltm:snat-translation:snat-translationstate': return true; + case 'tm:apm:profile:access:accessstate': + if (context.tasks[context.currentIndex].commonAccessProfiles + && context.tasks[context.currentIndex].commonAccessProfiles.find((profile) => profile === item.name)) { + return true; + } + break; + case 'tm:gtm:topology:topologystate': + if (item.description !== constants.as3ManagedDescription) { + return false; + } + break; + case 'shared:service-discovery:taskstate': + if (decodeURIComponent(item.id).split(/\/|~/g)[1] === partition) { + return true; + } + break; + default: + break; } if ((partition !== 'Common' || isShared(item)) && item.kind !== 'tm:auth:partition:partitionstate' @@ -907,9 +975,11 @@ function isAs3Item(context, item, partition, filter) { * @param {object} context * @param {array} pathList - list of BIG-IP config pathnames * @param {string} tenantId - Tenant name indicates BIG-IP partition + * @param {object} [commonConfig] - Configuration from Common + * * @returns {Promise} */ -const getBigipConfig = function (context, pathList, tenantId) { +const getBigipConfig = function (context, pathList, tenantId, commonConfig) { const partition = tenantId; const supportedPaths = pathList @@ -945,7 +1015,7 @@ const getBigipConfig = function (context, pathList, tenantId) { .then((config) => gatherAccessProfileItems(context, partition, config) .then((result) => ({ config, filter: result }))) .then((configs) => extractAs3Items(context, configs.config, partition, configs.filter)) - .then((configs) => filterAs3Items(configs)) + .then((configs) => filterAs3Items(context, configs, commonConfig)) .catch((err) => { log.error(err); throw err; @@ -1129,11 +1199,11 @@ const updateAddressesWithRouteDomain = function (configs, tenantId) { const cfg = configs[k]; if (cfg.command === 'ltm virtual-address') { let destAddr = cfg.properties.address; - if (!util.isEmptyOrUndefined(defaultRd) && !destAddr.includes('%')) { + if (!util.isEmptyOrUndefined(defaultRd) && !util.isEmptyOrUndefined(destAddr) && !destAddr.includes('%')) { destAddr = `${destAddr}%${defaultRd}`; cfg.properties.address = destAddr; } - if (destAddr.includes('%')) { + if (!util.isEmptyOrUndefined(destAddr) && destAddr.includes('%')) { // not sure why we're tagging the path with this.. // but it's only on the config path, not on the cli script destWithRds[k.replace('Service_Address-', '')] = destAddr; @@ -1147,7 +1217,7 @@ const updateAddressesWithRouteDomain = function (configs, tenantId) { if (cfg.command === 'ltm virtual') { let cidr = ''; const sourceAddr = cfg.properties.source; - if (!util.isEmptyOrUndefined(defaultRd) && !sourceAddr.includes('%')) { + if (!util.isEmptyOrUndefined(defaultRd) && !util.isEmptyOrUndefined(sourceAddr) && !sourceAddr.includes('%')) { const addrParts = sourceAddr.split('/'); const ip = addrParts[0]; if (!util.isEmptyOrUndefined(addrParts[1])) { @@ -1192,6 +1262,43 @@ const pathReferenceLinks = function (context, referredList, tenantId, partitionC return getBigipConfig(context, referenceLinks, tenantId); }; +/** + * Returns a subset of the config array, based on the perAppInfo.apps + * + * @param {object} perAppInfo - holds target tenant and apps array + * @param {array} config - an array of relevant BIG-IP objects + */ +const getFilteredPerAppConfig = function (perAppInfo, config) { + const filteredConfig = []; + config.forEach((c) => { + switch (c.kind) { + case 'tm:auth:partition:partitionstate': + if (c.fullPath === perAppInfo.tenant) { + filteredConfig.push(c); + } + break; + case 'tm:sys:folder:folderstate': + if (perAppInfo.apps.indexOf(c.name) !== -1) { + // applications are sys:folders, so the name should be accurate + filteredConfig.push(c); + } + break; + case 'tm:ltm:virtual-address:virtual-addressstate': + case 'tm:ltm:node:nodestate': + // virtual addresses & nodes are saved at the root tenant, and so do NOT have a subPath to compare + // TODO: check metadata here + filteredConfig.push(c); + break; + default: + if (perAppInfo.apps.indexOf(c.subPath) !== -1) { + // Everything in an application should have a subPath of the application name + filteredConfig.push(c); + } + } + }); + return filteredConfig; +}; + /** * Pull the current BIG-IP configuration for a given * partition (AS3 tenant). This uses iControl-REST @@ -1235,8 +1342,12 @@ const getTenantConfig = function (context, tenantId, commonConfig) { log.debug(`tenant ${tenantId} lacks a partition`); return actionableConfig; } - return getBigipConfig(context, paths.root, tenantId) + return getBigipConfig(context, paths.root, tenantId, commonConfig) .then((config) => { + if (context.request.isPerApp && context.request.perAppInfo.apps.length > 0) { + // If no apps are specified, tenant filtering is sufficient + config = getFilteredPerAppConfig(context.request.perAppInfo, config); + } partitionConfig = config || []; return pathReferenceLinks(context, paths.referred, tenantId, partitionConfig); }) @@ -1253,7 +1364,7 @@ const getTenantConfig = function (context, tenantId, commonConfig) { }); } }); - return getBigipConfig(context, subReferenceLinks, tenantId); + return getBigipConfig(context, subReferenceLinks, tenantId, commonConfig); }) .then((config) => { referenceConfig = referenceConfig.concat(config); @@ -1270,6 +1381,7 @@ const getTenantConfig = function (context, tenantId, commonConfig) { }); updateAddressesWithRouteDomain(actionableConfig, tenantId); tenantAddCommonNodes(context, actionableConfig, commonConfig.nodeList); + return actionableConfig; }); }) @@ -1543,6 +1655,7 @@ const getDiff = function (context, currentConfig, desiredConfig, commonConfig, t } const orderedItems = []; + const snatPoolAddresses = new Set(); // handle cases where we need to delete an entry in current config so modifications // can occur as required. @@ -1621,9 +1734,25 @@ const getDiff = function (context, currentConfig, desiredConfig, commonConfig, t delete currentValue.properties.geo; } } + + // Likewise for net port-lists and firewall port-lists + if (desiredValue.command === 'net port-list' || desiredValue.command === 'security firewall port-list') { + if (desiredValue.command === 'security firewall port-list') { + currentValue.command = 'security firewall port-list'; + } else { + currentValue.command = 'net port-list'; + } + } // we should only track this if we have a desired value } else if (currentValue && currentValue.command === 'gtm global-settings load-balancing') { delete currentConfig[configKey]; + } else if (currentValue && currentValue.command === 'ltm snatpool' && tenantId === 'Common') { + // BIGIP will auto delete snat-translation(s) belonging to a snatpool + if (currentValue.properties && currentValue.properties.members) { + Object.keys(currentValue.properties.members).forEach((m) => { + snatPoolAddresses.add(m); + }); + } } if (!desiredValue && currentValue && currentValue.command === 'gtm topology' && context.tasks[context.currentIndex].gtmTopologyProcessed) { @@ -1651,6 +1780,18 @@ const getDiff = function (context, currentConfig, desiredConfig, commonConfig, t if (isOnlyChange && diff.path[diff.path.length - 1].startsWith('iControl_')) { keep = false; } + if (tenantId === 'Common' && diff.kind === 'D' && diff.lhs.command === 'ltm snat-translation') { + // if the translation address matches a deleting snat pool then let the BIGIP auto delete it + if (snatPoolAddresses.has(`/Common/${diff.lhs.properties.address}`)) { + keep = false; + } + } + // TODO: remove/modify this when virtual-address metadata is handled + // filter out per-app virtual-address Deletes during Post + if (context.request.isPerApp && context.request.method === 'Post' && diff.kind === 'D' + && diff.lhs.command === 'ltm virtual-address') { + keep = false; + } if (keep) { finalDiffs.push(diff); } @@ -1760,6 +1901,171 @@ const updateWildcardMonitorCommands = function (trans) { return updatedTrans; }; +// To handle traffic-matching-criteria, we have to do things outside the transaction +// However we can't know during that processing if traffic-matching-criteria was involved +// so we need to move things back into the transaction here if necessary +const updatePostTransVirtuals = function (trans, postTrans, destinationsDeletedInTrans) { + const deleteVirtualAddressPrefix = 'tmsh::delete ltm virtual-address'; + const createVirtualAddressPrefix = 'tmsh::create ltm virtual-address'; + postTrans.forEach((commandList) => { + if (Array.isArray(commandList)) { + for (let i = commandList.length - 1; i >= 0; i -= 1) { + const command = commandList[i]; + if (command.startsWith(deleteVirtualAddressPrefix)) { + const address = command.substring(deleteVirtualAddressPrefix.length + 1); + const addressWithoutTenant = address.split('/')[2]; + if (destinationsDeletedInTrans.indexOf(addressWithoutTenant) > -1) { + trans.push(command); + commandList.splice(i, 1); + } else { + // We might be moving the virtual address from one tenant to another so + // we also need to check the transaction commands to see if we are creating + // the same address there + const isRecreate = trans.find((transCommand) => { + if (transCommand.startsWith(createVirtualAddressPrefix)) { + const createAddress = transCommand.substring(createVirtualAddressPrefix.length + 1); + let createAddressWithoutTenant = createAddress.split('/')[2]; + // trim off the rest of the create command + createAddressWithoutTenant = createAddressWithoutTenant.split(' ')[0]; + return addressWithoutTenant === createAddressWithoutTenant; + } + return false; + }); + if (isRecreate) { + trans.push(command); + commandList.splice(i, 1); + } + } + } + } + } + }); +}; + +// Finds lists in pre-trans that reference lists created in trans +// If found, moves the creation command up to pre-trans +const checkTransactionReferences = function (trans, preTrans, rollback) { + // lists referenced from other lists + const listListReferenceRegex = /(?:port|address)-lists\s+replace-all-with\s+\\{\s+(.+?)\s+\\}/; + + // Check to see if anything in pre-trans has a list that refers to a list + let listsReferenced = []; + preTrans.forEach((command) => { + if (typeof command === 'string') { + const referencedListMatch = command.match(listListReferenceRegex); + if (referencedListMatch && referencedListMatch[1] !== 'none') { + // The lists referenced may be a space-separated list + listsReferenced = listsReferenced.concat(referencedListMatch[1].split(' ')); + } + } + }); + + // Now check trans to see if any of the referenced lists are created there + if (listsReferenced.length > 0) { + let matchFound = false; + for (let i = trans.length - 1; i >= 0; i -= 1) { + const transCommand = trans[i]; + const createListMatch = transCommand.match(CREATE_LIST_REGEX); + if (createListMatch && listsReferenced.indexOf(createListMatch[1]) > -1) { + matchFound = true; + arrayUtil.insertAfterOrAtEnd(preTrans, 'tmsh::create sys folder', transCommand, 'inc'); + trans.splice(i, 1); + arrayUtil.insertBeforeOrAtEnd( + rollback, + 'delete sys folder', + `catch { tmsh::delete ${ + transCommand.split(' ').slice(1, 5).join(' ')} } e`, + 'inc' + ); + } + } + + // If we found something, repeat + if (matchFound) { + return checkTransactionReferences(trans, preTrans, rollback); + } + } + + return undefined; +}; + +// In certain cases we need to put creation of port- and address-lists and traffic-matching-criteria outside +// of the transaction. However, if we do that we also need to have any referenced lists outside +// of the transaction but we can't know during that processing if there is also a referenced list. +// So we need to move referenced lists outside of the transaction. Note that lists can reference +// other lists +const updatePortAndAddressLists = function (trans, preTrans, rollback) { + const createTmcPrefix = 'tmsh::create ltm traffic-matching-criteria'; + + // lists referenced from a traffic-matching-criteria + const tmcListReferenceRegex = /(?:destination|source)-(?:port|address)-list\s+(.+?)\s+/g; + + // between address/port and source/destination, we can't have more than 4 matches in a traffic-matching-criteria + // so add a sanity check to make sure we don't infinite loop + const maxMatches = 4; + let numMatches = 0; + + // Iterate through the pre-trans to move any directly referenced lists up + preTrans.forEach((command) => { + if (typeof command === 'string' && command.startsWith(createTmcPrefix)) { + let matches = tmcListReferenceRegex.exec(command); + while (matches !== null && numMatches <= maxMatches) { + numMatches += 1; + const listName = matches[1]; + for (let i = trans.length - 1; i >= 0; i -= 1) { + const transCommand = trans[i]; + const createListMatch = transCommand.match(CREATE_LIST_REGEX); + if (createListMatch && createListMatch[1] === listName) { + arrayUtil.insertBeforeOrAtEnd(preTrans, createTmcPrefix, transCommand, 'inc'); + trans.splice(i, 1); + arrayUtil.insertAfterOrAtBeginning( + rollback, + 'delete ltm traffic-matching-criteria', + `catch { tmsh::delete ${ + transCommand.split(' ').slice(1, 5).join(' ')} } e`, + 'inc' + ); + } + } + + matches = tmcListReferenceRegex.exec(command); + } + } + }); + + // Now that all traffic-matching-criteria commands have bee moved to pre-trans, look + // for references from lists to lists + checkTransactionReferences(trans, preTrans, rollback); +}; + +/** + * Determines if a virtual's destination matches a virtualAddress + * + * @param {String} destination - Full virtual server destination (has tenant and port). Might be an address or name. + * @param {String} virtualAddress - virtualAddress address property (does not have port) + * @param {String} virtualAddressName - Full name of the virtualAddress (had tenant) + */ +const doesDestinationMatchVirtualAddress = function (destination, virtualAddress, virtualAddressName) { + const lastDot = destination.lastIndexOf('.'); + const lastColon = destination.lastIndexOf(':'); + const portIndex = lastDot > lastColon ? lastDot : lastColon; + + const destinationWithoutPort = destination.substring(0, portIndex); + const destinationWithoutTenantOrPort = destinationWithoutPort.split('/')[2]; + let destinationAddress = destinationWithoutTenantOrPort; + if (destinationAddress.startsWith('any6')) { + destinationAddress = destinationAddress.replace('any6', '::'); + } else if (destinationAddress.startsWith('any')) { + destinationAddress = destinationAddress.replace('any', '0.0.0.0'); + } + + if (ipUtil.isIPv4(destinationAddress) || ipUtil.isIPv6(destinationAddress)) { + return destinationWithoutTenantOrPort === virtualAddress; + } + + return destinationWithoutPort === virtualAddressName; +}; + /** * Translate config differences into tmsh actions * @@ -1812,6 +2118,62 @@ const tmshUpdateScript = function (context, desiredConfig, currentConfig, config return false; } + function isNewAddressListAndTmcWithRouteDomain(diffUpdates, diffs) { + function isCreate(itemToCreateMatch, itemToDeleteMatch) { + if (!itemToCreateMatch || !itemToDeleteMatch) { + return !!itemToCreateMatch; + } + + return itemToCreateMatch[1] !== itemToDeleteMatch[1]; + } + + // See if we are creating, but not deleting, both an address list and a traffic-matching-criteria + // which references that address list + const addressListToCreateRegex = /tmsh::create .+ address-list\s+(.+?)\s+/; + const addressListToDeleteRegex = /tmsh::delete .+ address-list\s+(.+?)\s+/; + const tmcToCreateRegex = /tmsh::create ltm traffic-matching-criteria\s+(.+?)\s+/; + const tmcToDeleteRegex = /tmsh::delete ltm traffic-matching-criteria\s+(.+?)\s+/; + + const addressListToCreateMatch = diffUpdates.commands.match(addressListToCreateRegex); + const addressListToDeleteMatch = diffUpdates.commands.match(addressListToDeleteRegex); + + const tmcToCreateMatch = diffUpdates.commands.match(tmcToCreateRegex); + const tmcToDeleteMatch = diffUpdates.commands.match(tmcToDeleteRegex); + + if (isCreate(addressListToCreateMatch, addressListToDeleteMatch)) { + // Now we know we are creating an address list - check to see if there is a TMC that refers to it + const addressList = addressListToCreateMatch[1]; + const tmcDiff = diffs.find((diff) => { + if (diff.command === 'ltm traffic-matching-criteria' + && diff.rhs && diff.rhs.properties + && diff.rhs.properties['route-domain'] !== 'any') { + return diff.rhs.properties['destination-address-list'] === addressList + || diff.rhs.properties['source-address-list'] === addressList; + } + return false; + }); + + return !!tmcDiff; + } + + if (isCreate(tmcToCreateMatch, tmcToDeleteMatch)) { + // Now we know we are creating a TMC - check to see there is an address list that it refers to + const addressListDiff = diffs.find((diff) => { + if (diff.command === 'net address-list' || diff.command === 'security firewall address-list') { + // diff.path[0] is the name of the address list. check to see if the tmc create command mentions it + return tmcToCreateMatch.input.indexOf(diff.path[0]) > -1; + } + return false; + }); + + return !!addressListDiff; + } + + return false; + } + + const destinationsDeletedInTrans = []; + configDiff.forEach((diff) => { const partition = diff.path[0].split('/')[1]; // when creating nodes in common we set this during the diff @@ -1957,6 +2319,37 @@ const tmshUpdateScript = function (context, desiredConfig, currentConfig, config if (trans.indexOf(diffUpdates.commands) === -1) { trans.push(diffUpdates.commands); } + } else if (isNewAddressListAndTmcWithRouteDomain(diffUpdates, configDiff)) { + // Creating a new TMC and address list in a transaction does not work if there + // is a non-default route domain. + // Make sure we create the address-list before the TMC and vice versa on the delete. + if (diffUpdates.commands.indexOf(' address-list') > -1) { + // This is the address list command + arrayUtil.insertBeforeOrAtEnd( + preTrans, + 'traffic-matching-criteria', + diffUpdates.commands, + 'inc' + ); + arrayUtil.insertBeforeOrAtBeginning( + rollback, + 'delete sys folder', + `catch { tmsh::delete ${ + diffUpdates.commands.split(' ').slice(1, 5).join(' ')} } e`, + 'inc' + ); + } else { + // This is the TMC command + // Note: leading space distinguishes from things like destination-address-list. + arrayUtil.insertAfterOrAtEnd(preTrans, ' address-list', diffUpdates.commands, 'inc'); + arrayUtil.insertBeforeOrAtBeginning( + rollback, + 'delete net address-list', + `catch { tmsh::delete ${ + diffUpdates.commands.split(' ').slice(1, 5).join(' ')} } e`, + 'inc' + ); + } } else if (diffUpdates.commands.indexOf('create gtm wideip') > -1) { if (gtmModifyAliasPaths.indexOf(diff.path[0]) > -1 || (diffUpdates.commands.indexOf('aliases none') === -1 && gtmNeedsModifyAliasCommand(configDiff, diff))) { @@ -2026,11 +2419,68 @@ const tmshUpdateScript = function (context, desiredConfig, currentConfig, config && diff.path[2] === 'address') { // If editing a virtual-address address, throw error throw new Error(`The Service Address virtualAddress property cannot be modified. Please delete ${diff.path[0]} and recreate it.`); + } else if (diffUpdates.commands.includes('delete ltm virtual ') + && diffUpdates.commands.includes('traffic-matching-criteria')) { + // handle modifying Service when using traffic-matching-criteria + // trailing space excludes 'virtual-address' + const commands = diffUpdates.commands.split('\n'); + commands.forEach((command, i) => { + if (command.includes('delete ltm virtual ')) { + preTrans.push(commands.splice(i, 1)); + } + }); + trans.push(commands.join('\n')); } else { // put all other create commands into the cli transaction trans.push(diffUpdates.commands); } // handle delete + } else if (diffUpdates.commands.includes('delete ltm virtual ')) { + const virtualConfig = currentConfig[diff.path[0]]; + const tmc = util.getDeepValue(virtualConfig, 'properties.traffic-matching-criteria'); + if (tmc) { + // handle deleting Service (required for traffic-matching-criteria) + const commands = diffUpdates.commands.split('\n'); + commands.forEach((command, i) => { + if (command.includes('delete ltm virtual ')) { + preTrans.push(commands.splice(i, 1)); + } + }); + trans.push(commands.join('\n')); + } else { + trans.push(diffUpdates.commands); + if (virtualConfig) { + // destination is like '/Tenant/address:port'. We need to remove + // the tenant and port + const destination = virtualConfig.properties.destination; + const name = Object.keys(currentConfig).find((key) => { + const item = currentConfig[key]; + if (item.command === 'ltm virtual-address') { + // If destination is an IP, check the address + // Otherwise, check the name + return doesDestinationMatchVirtualAddress( + destination, + item.properties.address, + key.replace('Service_Address-', '') + ); + } + return false; + }); + if (name) { + const nameWithoutTenant = name.split('/')[2]; + destinationsDeletedInTrans.push(nameWithoutTenant.replace('Service_Address-', '')); + } + } + } + } else if (diffUpdates.commands.includes('delete ltm virtual-address')) { + const commands = diffUpdates.commands.split('\n'); + // handle modifying Service.virtualAddresses (required for traffic-matching-criteria) + commands.forEach((command, i) => { + if (command.includes('delete ltm virtual-address')) { + postTrans.push(commands.splice(i, 1)); + } + }); + trans.push(commands.join('\n')); } else if (createFirstDeleteLast.indexOf(component) !== -1) { // delete partition last rollback.unshift(diffUpdates.commands); @@ -2039,7 +2489,7 @@ const tmshUpdateScript = function (context, desiredConfig, currentConfig, config const removeNodes = `tmsh::cd /${partition}\n` + 'foreach {node} [tmsh::get_config /ltm node] {\n' + ' tmsh::delete ltm node [tmsh::get_name $node]\n}\n' - + 'tmsh::cd /'; + + 'tmsh::cd /Common'; postTrans.push(removeNodes); } } else if (diffUpdates.commands.indexOf('exec ng_profile') > -1) { @@ -2147,6 +2597,9 @@ const tmshUpdateScript = function (context, desiredConfig, currentConfig, config }); trans = updateWildcardMonitorCommands(trans); + updatePortAndAddressLists(trans, preTrans, rollback); + updatePostTransVirtuals(trans, postTrans, destinationsDeletedInTrans); + updates.script = preamble.concat(preTrans, trans, commit); if (preTrans2.length > 0) { updates.script = updates.script.concat(preTrans2); diff --git a/src/lib/ltmPolicySpec.json b/src/lib/ltmPolicySpec.json index 2dd9d3c0..d4d06957 100644 --- a/src/lib/ltmPolicySpec.json +++ b/src/lib/ltmPolicySpec.json @@ -101,6 +101,10 @@ " [enable*", " [from-profile STRING] ]", " [disable]]", + " [bot-defense [request*]", + " [enable*", + " [from-profile STRING] ]", + " [disable]]", " [shutdown [client-accepted* | ssl-client-hello | ssl-client-serverhello-send | ssl-server-hello | ssl-server-handshake | server-connected | proxy-request | request | proxy-connect | proxy-response | response | ws_request | ws_response]", " [connection*]" diff --git a/src/lib/map_as3.js b/src/lib/map_as3.js index ae8990fd..1869789c 100644 --- a/src/lib/map_as3.js +++ b/src/lib/map_as3.js @@ -18,9 +18,9 @@ const crypto = require('crypto'); const ipUtil = require('@f5devcentral/atg-shared-utilities').ipUtils; +const arrUtil = require('@f5devcentral/atg-shared-utilities').arrayUtils; const normalize = require('./normalize'); const util = require('./util/util'); -const arrUtil = require('./util/arrayUtil'); const PolicyParser = require('./ltmPolicyParser'); const log = require('./log'); const serviceDiscovery = require('./serviceDiscovery'); @@ -192,7 +192,7 @@ const createIRule = function createIRule(config) { .trim() .replace(/\r\n/g, '\n') // unix-style line endings .replace(/\s+\n/g, '\n') // trim whitespace on every line - .replace(/\\\n/g, '\n') // remove continuation characters + .replace(/\\\n[ \t]+/g, '') // remove continuation characters .replace(/\n\n/g, '\n \n'); // preserve double newlines } return { configs: [config] }; @@ -362,11 +362,12 @@ const isInternal = function (item) { const updatePropsIfInternal = function (item) { if (isInternal(item)) { + const sourceType = typeof item.sourceAddress; item.internal = {}; // internal virtuals allow a source address but destination is // always 0.0.0.0 with a port of 'any' item.destination = '0.0.0.0:any'; - item.virtualAddresses = typeof item.sourceAddress === 'undefined' ? ['0.0.0.0'] : [['0.0.0.0', item.sourceAddress]]; + item.virtualAddresses = sourceType === 'undefined' || sourceType === 'object' ? ['0.0.0.0'] : [['0.0.0.0', item.sourceAddress]]; // ICAP should only be on internal virtuals item = profile(item, 'profileICAP'); @@ -427,7 +428,7 @@ const makeExternalMonitorRequests = function (context, tenantId, appId, itemId, return normalize.actionableMcp(context, externalMonitorFile, 'sys file external-monitor', `${path}-script`); }; -const makeApmPolicyRequests = function (item, itemId, path, overrides, classDisplayName) { +const makeApmPolicyRequests = function (item, itemId, path, settings, classDisplayName) { if (item.url) { const urlObj = normalizeUrl(item.url); const url = urlObj.url; @@ -435,7 +436,7 @@ const makeApmPolicyRequests = function (item, itemId, path, overrides, classDisp const type = url.includes('.tar.gz') ? '.tar.gz' : '.tar'; const authentication = urlObj.authentication; - overrides.url = url; + settings.url = url; item.iControl_postFromRemote = {}; @@ -454,7 +455,7 @@ const makeApmPolicyRequests = function (item, itemId, path, overrides, classDisp item.iControl_postFromRemote.post.method = 'POST'; item.iControl_postFromRemote.post.ctype = 'application/octet-stream'; item.iControl_postFromRemote.post.why = `upload ${classDisplayName} ${itemId}`; - item.iControl_postFromRemote.post.overrides = overrides; + item.iControl_postFromRemote.post.settings = settings; if (item.ignoreChanges && urlObj.authentication && urlObj.authentication.token) { item.ignore.iControl_postFromRemote = { @@ -474,13 +475,13 @@ const makeApmPolicyRequests = function (item, itemId, path, overrides, classDisp return item; }; -const makeDataGroupTokenRequests = function (item, itemId, path, overrides, classDisplayName) { +const makeDataGroupTokenRequests = function (item, itemId, path, settings, classDisplayName) { const urlObj = normalizeUrl(item.externalFilePath); const url = urlObj.url; const rejectUnauthorized = urlObj.rejectUnauthorized; const authentication = urlObj.authentication; - overrides.externalFilePath.url = url; + settings.externalFilePath.url = url; item.iControl_postFromRemote = {}; // GET policy @@ -498,7 +499,7 @@ const makeDataGroupTokenRequests = function (item, itemId, path, overrides, clas item.iControl_postFromRemote.post.method = 'POST'; item.iControl_postFromRemote.post.ctype = 'application/octet-stream'; item.iControl_postFromRemote.post.why = `upload ${classDisplayName} ${itemId}`; - item.iControl_postFromRemote.post.overrides = overrides; + item.iControl_postFromRemote.post.settings = settings; return item; }; @@ -547,6 +548,12 @@ const updateMember = function updateMember(member) { log.error(`Invalid adminState state: ${member.adminState}`); } } + + if (member.metadata) { + Object.keys(member.metadata).forEach((key) => { + member.metadata[key].persist = member.metadata[key].persist.toString(); + }); + } }; const addressDiscovery = function addressDiscovery(context, tenantId, newAppId, item, sdRequired, resources, pool) { @@ -564,7 +571,7 @@ const addressDiscovery = function addressDiscovery(context, tenantId, newAppId, } else { def.fqdn.autopopulate = 'disabled'; } - def.metadata = [{ name: 'source', value: 'declaration' }]; + if (!sdRequired) { poolItem.members.push(normalize.actionableMcp(context, def, 'ltm pool members', null).properties); } @@ -728,7 +735,7 @@ const translate = { */ WAF_Policy(context, tenantId, appId, itemId, item) { const path = util.mcpPath(tenantId, appId, itemId); - const overrides = util.simpleCopy(item); + const settings = util.simpleCopy(item); item.ignore = item.ignore || {}; item.ignoreChanges = item.url && item.url.ignoreChanges ? true : item.ignoreChanges; @@ -739,7 +746,7 @@ const translate = { const rejectUnauthorized = urlObj.rejectUnauthorized; const authentication = urlObj.authentication; - overrides.url = url; + settings.url = url; item.iControl_postFromRemote = {}; @@ -754,11 +761,12 @@ const translate = { // post policy to bigip item.iControl_postFromRemote.post = {}; + item.iControl_postFromRemote.post.reference = path; item.iControl_postFromRemote.post.path = `/mgmt/shared/file-transfer/uploads/${path.split('/').pop()}.xml`; item.iControl_postFromRemote.post.method = 'POST'; item.iControl_postFromRemote.post.ctype = 'application/octet-stream'; item.iControl_postFromRemote.post.why = `upload asm policy ${itemId}`; - item.iControl_postFromRemote.post.overrides = overrides; + item.iControl_postFromRemote.post.settings = settings; if (item.ignoreChanges && urlObj.authentication && urlObj.authentication.token) { item.ignore.iControl_postFromRemote = { @@ -777,7 +785,7 @@ const translate = { item.iControl_post.ctype = 'application/octet-stream'; item.iControl_post.why = `upload asm policy ${itemId}`; item.iControl_post.send = item.policy || item.file; - item.iControl_post.overrides = overrides; + item.iControl_post.settings = settings; delete item.file; } @@ -796,12 +804,12 @@ const translate = { */ Access_Profile(context, tenantId, appId, itemId, item) { const path = util.mcpPath(tenantId, '', itemId); - const overrides = util.simpleCopy(item); - delete overrides.enable; + const settings = util.simpleCopy(item); + delete settings.enable; item.ignore = item.ignore || {}; item.ignoreChanges = item.url && item.url.ignoreChanges ? true : item.ignoreChanges; - item = makeApmPolicyRequests(item, itemId, path, overrides, 'Access Profile'); + item = makeApmPolicyRequests(item, itemId, path, settings, 'Access Profile'); const config = normalize.actionableMcp(context, item, 'apm profile access', path); config.properties.enable = item.enable || false; @@ -814,11 +822,11 @@ const translate = { */ Per_Request_Access_Policy(context, tenantId, appId, itemId, item) { const path = util.mcpPath(tenantId, '', itemId); - const overrides = util.simpleCopy(item); + const settings = util.simpleCopy(item); item.ignore = item.ignore || {}; item.ignoreChanges = item.url && item.url.ignoreChanges ? true : item.ignoreChanges; - item = makeApmPolicyRequests(item, itemId, path, overrides, 'Access Policy'); + item = makeApmPolicyRequests(item, itemId, path, settings, 'Access Policy'); const config = normalize.actionableMcp(context, item, 'apm policy access-policy', path); return { configs: [config] }; @@ -1942,7 +1950,7 @@ const translate = { } }); - if (item.monitors && item.monitors.length === 0) { + if (!item.monitors || item.monitors.length === 0) { delete item.monitors; delete item.minimumMonitors; } @@ -1972,6 +1980,12 @@ const translate = { delete item.members; } + if (item.metadata) { + Object.keys(item.metadata).forEach((member) => { + item.metadata[member].persist = item.metadata[member].persist.toString(); + }); + } + configs.push(normalize.actionableMcp(context, item, 'ltm pool', path)); return { configs }; }, @@ -2145,7 +2159,7 @@ const translate = { } ); // set the name to the address - // The addres property is read-only and there can be only 1 copy of the address among all the translations. + // The address property is read-only and there can be only 1 copy of the address among all the translations. // When BIGIP auto generates a translation it picks the address as the name of the object. // For the maintenance of translations moving between auto generated and user specified it is easier to always // make the translation names the same as the address. @@ -2420,6 +2434,24 @@ const translate = { const addrPath = `${util.mcpPath(tenantId, appId, itemId).substring(1).replace(/\//g, '.')}` + '.virtualAddresses'; const metadata = context.tasks[context.currentIndex].metadata; + + let destinationPortList; + let destinationAddressList; + let sourceAddressList; + if (typeof item.virtualPort === 'object') { + destinationPortList = item.virtualPort; + item.virtualPort = 0; + } + // If we're referencing an Address_List, we want the created traffic-matching-criteria to have a + // destination-address-inline of 0.0.0.0 + if (!Array.isArray(item.virtualAddresses)) { + destinationAddressList = item.virtualAddresses; + item.virtualAddresses = ['0.0.0.0']; + } + if (typeof item.sourceAddress === 'object') { + sourceAddressList = item.sourceAddress; + } + item.virtualAddresses.forEach((addr, index) => { let dst; let src; @@ -2564,9 +2596,11 @@ const translate = { declaration ); - // internal virtuals can't create virtual-addresses because the addreses are all 0.0.0.0 - // which causes an error due to duplicates - if (!isInternal(item)) { + // internal virtuals can't create virtual-addresses because the addresses are all 0.0.0.0 + // which causes an error due to duplicates. For virtuals with a destinationAddressList, + // our only virtual-address would be 'any' which we don't need as it is covered by the + // traffic-matching-criteria destination-address-inline + if (!isInternal(item) && !destinationAddressList) { configs = configs.concat(translatedServiceAddr.configs); } destIp = translatedServiceAddr.configs[0].properties.address; @@ -2626,6 +2660,35 @@ const translate = { item.mask = msk; item.remark = item.remark || appId; + + if (!util.versionLessThan(context.target.tmosVersion, '14.1') + && (destinationPortList || destinationAddressList || sourceAddressList)) { + const parsed = ipUtil.parseIpAddress(item.source); + const source = `${parsed.ip}/${parsed.netmask}`; + + const tmcObj = { + protocol: item.layer4, + destinationAddressInline: `${destIp.split('%')[0]}/${msk}`, // strip the route domain + destinationAddressList: bigipPathFromSrc(destinationAddressList), + destinationPortList: bigipPathFromSrc(destinationPortList), + sourceAddressList: bigipPathFromSrc(sourceAddressList), + sourceAddressInline: source + }; + + tmcObj.routeDomain = routeDomain ? `/Common/${routeDomain.split('%')[1]}` : 'any'; + + item.trafficMatchingCriteria = util.mcpPath(tenantId, appId, `${alias}_VS_TMC_OBJ`); + delete item.destination; + delete item.source; + + configs.push(normalize.actionableMcp( + context, + tmcObj, + 'ltm traffic-matching-criteria', + util.mcpPath(tenantId, appId, `${alias}_VS_TMC_OBJ`) + )); + } + configs.push(normalize.actionableMcp(context, item, 'ltm virtual', util.mcpPath(tenantId, appId, alias))); }); return { configs }; @@ -3011,6 +3074,14 @@ const translate = { } else { action.disable = true; } + } else if (action.type === 'botDefense') { + if (action.profile) { + action.enable = true; + action.fromProfile = bigipPath(action, 'profile'); + delete action.profile; + } else { + action.disable = true; + } } else if (action.type === 'drop') { action.type = 'shutdown'; } else if (action.type === 'httpRedirect') { @@ -3426,6 +3497,19 @@ const translate = { return { configs }; }, + /** + * Defines a Net Port List + */ + Net_Port_List(context, tenantId, appId, itemId, item) { + const path = util.mcpPath(tenantId, appId, itemId); + const configs = []; + item.ignore = item.ignore || {}; + + configs.push(normalize.actionableMcp(context, item, 'net port-list', path)); + + return { configs }; + }, + NAT_Policy(context, tenantId, appId, itemId, item) { if (item.rules) { item.rules.forEach((rule) => { @@ -3680,8 +3764,8 @@ const translate = { item.ignore.externalFilePath = item.externalFilePath; } if (util.getDeepValue(item, 'externalFilePath.authentication.method') === 'bearer-token') { - const overrides = util.simpleCopy(item); - item = makeDataGroupTokenRequests(item, itemId, path, overrides, 'Data Group'); + const settings = util.simpleCopy(item); + item = makeDataGroupTokenRequests(item, itemId, path, settings, 'Data Group'); } else { item.externalFilePath = item.externalFilePath.url || item.externalFilePath; } @@ -4401,7 +4485,8 @@ const translate = { tagDescription(item); (item.members || []).forEach((member, index) => { member.order = index; - member.name = `${bigipPath(member, 'server')}`; + member.name = `${bigipPath(member, 'server').replace('/Shared', '')}`; + member.name = member.name.includes('/') ? member.name : `/Common/${member.name}`; }); const path = util.mcpPath(tenantId, '', itemId); const config = [normalize.actionableMcp(context, item, 'gtm prober-pool', path)]; diff --git a/src/lib/map_cli.js b/src/lib/map_cli.js index 81db8e0d..d21f1db3 100644 --- a/src/lib/map_cli.js +++ b/src/lib/map_cli.js @@ -93,6 +93,8 @@ const prefix = { 'net address-list addresses': 'replace-all-with', 'net address-list address-lists': 'replace-all-with', 'net bwc policy categories': 'replace-all-with', + 'net port-list ports': 'replace-all-with', + 'net port-list port-lists': 'replace-all-with', 'net service-policy': 'replace-all-with', 'net timer-policy': 'replace-all-with', 'net timer-policy rules': 'replace-all-with', @@ -340,7 +342,8 @@ const getPolicyControls = function (policy) { asm: ['asm'], avr: ['avr'], websocket: ['websocket'], - l7dos: ['l7dos'] + l7dos: ['l7dos'], + 'bot-defense': ['bot-defense'] }; const controls = {}; @@ -650,6 +653,10 @@ const tmshCreate = function (context, diff, targetConfig, currentConfig) { case 'auth partition': regex = /\//g; diff.path[0] = diff.path[0].replace(regex, ''); + if (context.request.isPerApp && diff.kind !== 'N') { + // Per-app should only create a partition if a partition needs to be created + return commandObj; + } if (diff.kind === 'E') { commandObj.commands = [`tmsh::modify ${diff.rhsCommand} ${diff.path[0]}${stringify(diff.rhsCommand, targetConfig, escapeQuote)}`]; return commandObj; @@ -749,9 +756,6 @@ const tmshCreate = function (context, diff, targetConfig, currentConfig) { if ((typeof targetConfig.members === 'object') && (targetConfig.members !== null)) { Object.keys(targetConfig.members).forEach((member) => { targetConfig.members[member] = pushMonitors(targetConfig.members[member]); - if (typeof targetConfig.members[member].metadata === 'undefined') { - targetConfig.members[member].metadata = { source: { value: 'declaration' } }; - } }); } if (diff.kind === 'D' && diff.path.find((p) => p === 'members')) { @@ -1147,6 +1151,12 @@ const tmshDelete = function (context, diff, currentConfig) { switch (diff.lhsCommand) { case 'auth partition': + if (context.request.isPerApp) { + // Tenants should ONLY be deleted in per-app mode IF done via a DELETE + if (context.request.method === 'Post') { + return commandObj; + } + } if (diff.kind === 'E') { // Modifies are handled in tmshCreate return commandObj; diff --git a/src/lib/map_mcp.js b/src/lib/map_mcp.js index 335e24b1..d0807c1c 100644 --- a/src/lib/map_mcp.js +++ b/src/lib/map_mcp.js @@ -1052,6 +1052,26 @@ const translate = { obj.address = ipUtil.minimizeIP(obj.address); return [normalize.actionableMcp(context, obj, 'ltm snat-translation', util.mcpPath(obj.partition, obj.subPath, obj.name))]; }, + 'tm:ltm:traffic-matching-criteria:traffic-matching-criteriastate': function (context, obj) { + delete obj.partition; + // Incoming ip/cidr is converted to ip/netmask, so do the same here for idempotentcy + let addr = obj.destinationAddressInline; + if (addr) { + const parsed = ipUtil.parseIpAddress(addr); + if (parsed.ip === '0.0.0.0') { + parsed.ip = 'any'; + } + obj.destinationAddressInline = `${parsed.ip}/${parsed.netmask}`; + } + + addr = obj.sourceAddressInline; + if (addr) { + const parsed = ipUtil.parseIpAddress(addr); + obj.sourceAddressInline = `${parsed.ip}/${parsed.netmask}`; + } + + return [normalize.actionableMcp(context, obj, 'ltm traffic-matching-criteria', obj.fullPath)]; + }, 'tm:ltm:virtual:virtualstate': function (context, obj) { obj.enabled = util.isEnabledObject(obj); delete obj.disabled; @@ -1114,6 +1134,11 @@ const translate = { obj.rateLimit = parseInt(obj.rateLimit, 10); } + if (obj.trafficMatchingCriteria) { + delete obj.destination; + delete obj.source; + } + return [normalize.actionableMcp(context, obj, 'ltm virtual', path)]; }, 'tm:ltm:virtual-address:virtual-addressstate': function (context, obj) { @@ -1147,6 +1172,15 @@ const translate = { } return [normalize.actionableMcp(context, obj, 'net address-list', obj.fullPath)]; }, + 'tm:net:port-list:port-liststate': function (context, obj) { + if (obj.ports) { + obj.ports = obj.ports.map((port) => port.name); + } + if (obj.portLists) { + obj.portLists = obj.portLists.map((portList) => util.mcpPath(portList.partition, portList.subPath, portList.name)); // eslint-disable-line max-len + } + return [normalize.actionableMcp(context, obj, 'net port-list', obj.fullPath)]; + }, 'tm:pem:irule:irulestate': function (context, obj) { return [normalize.actionableMcp(context, obj, 'pem irule', obj.fullPath)]; }, diff --git a/src/lib/paths.json b/src/lib/paths.json index e1f02bb5..1e7ddcbe 100644 --- a/src/lib/paths.json +++ b/src/lib/paths.json @@ -215,6 +215,10 @@ { "endpoint": "/mgmt/tm/ltm/snat-translation" }, + { + "endpoint": "/mgmt/tm/ltm/traffic-matching-criteria", + "minimumVersion": "14.1" + }, { "endpoint": "/mgmt/tm/ltm/virtual", "expand": true @@ -264,6 +268,10 @@ "endpoint": "/mgmt/tm/net/address-list", "minimumVersion": "14.0" }, + { + "endpoint": "/mgmt/tm/net/port-list", + "minimumVersion": "14.0" + }, { "endpoint": "/mgmt/tm/security/firewall/address-list", "modules": ["afm"] diff --git a/src/lib/postValidator.js b/src/lib/postValidator.js index df99f9f5..d2bc742b 100644 --- a/src/lib/postValidator.js +++ b/src/lib/postValidator.js @@ -116,7 +116,7 @@ function service(context, declaration) { let err; serviceClasses.forEach((serviceClass) => { if (findItems(declaration, serviceClass).some(isVersionTooLow)) { - err = new Error('profileBotDefense is only available of TMOS 14.1+'); + err = new Error('profileBotDefense is only available on TMOS 14.1+'); err.statusCode = 422; } }); diff --git a/src/lib/properties.json b/src/lib/properties.json index 283eb05f..76666d68 100644 --- a/src/lib/properties.json +++ b/src/lib/properties.json @@ -266,7 +266,13 @@ { "id": "service-down-action" }, { "id": "slow-ramp-time" }, { "id": "allow-nat", "altId": "allowNATEnabled", "truth": "yes", "falsehood": "no" }, - { "id": "allow-snat", "altId": "allowSNATEnabled", "truth": "yes", "falsehood": "no" } + { "id": "allow-snat", "altId": "allowSNATEnabled", "truth": "yes", "falsehood": "no" }, + { "id": "metadata", "extend": "objArray" } + ], + "ltm pool metadata": [ + { "id": "name" }, + { "id": "value" }, + { "id": "persist" } ], "ltm pool members": [ { "id":"connection-limit" }, @@ -287,8 +293,9 @@ { "id":"autopopulate", "truth": "enabled", "falsehood": "disabled" } ], "ltm pool members metadata": [ - { "id":"name" }, - { "id":"value" } + { "id": "name" }, + { "id": "value" }, + { "id": "persist" } ], "sys config merge file": [ { "id":"filePath" }, @@ -1171,14 +1178,12 @@ { "id":"field31", "quotedString": true }, { "id":"field32", "quotedString": true } ], - "ltm profile tftp": [ { "id":"description", "altId": "remark", "quotedString": true, "default": "none" }, { "id":"idle-timeout", "intToString": true }, { "id":"log-profile", "altId": "algLogProfile", "default": "none", "requiredModules": { "anyOf": [ "cgnat" ] } }, { "id":"log-publisher", "default": "none", "requiredModules": { "anyOf": [ "cgnat" ] } } ], - "ltm rule": [ { "id":"api-anonymous", "altId": "iRule" } ], @@ -1198,6 +1203,16 @@ { "id":"traffic-group" }, { "id":"udp-idle-timeout", "intToString": true } ], + "ltm traffic-matching-criteria": [ + { "id":"partition", "minVersion": "14.1" }, + { "id":"protocol", "minVersion": "14.1" }, + { "id":"destination-address-inline", "minVersion": "14.1" }, + { "id":"destination-address-list", "minVersion": "14.1" }, + { "id":"destination-port-list", "minVersion": "14.1" }, + { "id":"source-address-inline", "minVersion": "14.1" }, + { "id":"source-address-list", "minVersion": "14.1" }, + { "id":"route-domain", "minVersion": "14.1" } + ], "ltm virtual": [ { "id":"enabled", "altId": "adminState" }, { "id":"disabled" }, @@ -1234,6 +1249,7 @@ { "id":"source-port", "truth": "change", "falsehood": "preserve", "altId": "translateClientPort" }, { "id":"translate-address", "truth": "enabled", "falsehood": "disabled", "altId": "translateServerAddress" }, { "id":"translate-port", "truth": "enabled", "falsehood": "disabled", "altId": "translateServerPort" }, + { "id":"traffic-matching-criteria", "minVersion": "14.1" }, { "id":"nat64", "truth": "enabled", "falsehood": "disabled", "altId": "nat64Enabled" }, { "id":"vlans", "extend":"array" }, { "id":"vlans-enabled" }, @@ -1339,6 +1355,11 @@ { "id":"addresses", "extend": "array"}, { "id":"address-lists", "extend": "array"} ], + "net port-list": [ + { "id":"description", "altId": "remark", "quotedString": true}, + { "id":"ports", "extend": "array"}, + { "id":"port-lists", "extend": "array"} + ], "pem reporting format-script": [ { "id":"description", "altId": "remark", "quotedString": true }, { "id":"definition" } @@ -1885,7 +1906,7 @@ { "id":"ctype" }, { "id":"send" }, { "id":"why" }, - { "id":"overrides" } + { "id":"settings" } ], "iControl_postFromRemote": [ { "id":"get", "extend": "object" }, @@ -1910,7 +1931,8 @@ { "id":"method" }, { "id":"ctype" }, { "id":"why" }, - { "id":"overrides" } + { "id":"settings" }, + { "id":"reference" } ], "pem policy": [ { "id":"description", "altId": "remark", "quotedString": true}, diff --git a/src/lib/tag/minVersionTag.js b/src/lib/tag/minVersionTag.js index 409296dc..3fd4f955 100644 --- a/src/lib/tag/minVersionTag.js +++ b/src/lib/tag/minVersionTag.js @@ -16,6 +16,8 @@ 'use strict'; +const AJV = require('ajv'); + const jsonpointer = require('jsonpointer'); const util = require('../util/util'); @@ -41,22 +43,42 @@ function process(context, declaration, minVersions, originalDeclaration) { return Promise.resolve(); } - const warnings = minVersions - .map((minVersion) => { - if (isDeviceVersionTooLow(context, minVersion.schemaData)) { - removeProperty(declaration, minVersion.instancePath); - return getWarning( - originalDeclaration, - minVersion.tenant, - minVersion.instancePath, - minVersion.schemaData, - minVersion.parentData.class, - minVersion.parentDataProperty - ); + const warnings = []; + const errors = []; + minVersions.forEach((minVersion) => { + let schemaData = typeof minVersion.schemaData === 'string' ? { version: minVersion.schemaData } : minVersion.schemaData; + schemaData = Object.assign({ strict: false }, schemaData); + + if (isDeviceVersionTooLow(context, schemaData.version)) { + removeProperty(declaration, minVersion.instancePath); + // If the setting was also in the original declaration (and not just a default that we added) + // issue error or warning + if (typeof jsonpointer.get(originalDeclaration, minVersion.instancePath) !== 'undefined') { + if (schemaData.strict) { + const error = getError( + minVersion.instancePath, + schemaData.version, + minVersion.parentData.class, + minVersion.parentDataProperty + ); + errors.push(error); + } else { + const warning = getWarning( + minVersion.tenant, + minVersion.instancePath, + schemaData.version, + minVersion.parentData.class, + minVersion.parentDataProperty + ); + warnings.push(warning); + } } - return undefined; - }) - .filter(Boolean); + } + }); + + if (errors.length > 0) { + return Promise.reject(new AJV.ValidationError(errors)); + } return Promise.resolve({ warnings }); } @@ -69,20 +91,23 @@ function removeProperty(declaration, dataPath) { jsonpointer.set(declaration, dataPath, undefined); } -function getWarning(declaration, tenant, dataPath, minVersionAllowed, propertyClass, propertyName) { - // If the setting was also in the original declaration (and not just a default that we added) - // issue a warning - let warning; - if (typeof jsonpointer.get(declaration, dataPath) !== 'undefined') { - warning = { - tenant, - dataPath: dataPath || 'unknown path', - keyword: 'f5PostProcess(minVersion)', - params: {}, - message: `${propertyClass}.${propertyName} ignored. This is only valid on BIG-IP versions ${minVersionAllowed} and above.` - }; - } - return warning; +function getWarning(tenant, dataPath, minVersionAllowed, propertyClass, propertyName) { + return { + tenant, + dataPath: dataPath || 'unknown path', + keyword: 'f5PostProcess(minVersion)', + params: {}, + message: `${propertyClass}.${propertyName} ignored. This is only valid on BIG-IP versions ${minVersionAllowed} and above.` + }; +} + +function getError(dataPath, minVersionAllowed, propertyClass, propertyName) { + return { + dataPath: dataPath || 'unknown path', + keyword: 'f5PostProcess(minVersion)', + params: {}, + message: `${propertyClass}.${propertyName} is only valid on BIG-IP versions ${minVersionAllowed} and above.` + }; } module.exports = { diff --git a/src/lib/update.js b/src/lib/update.js index 76ce0f3e..871376ac 100644 --- a/src/lib/update.js +++ b/src/lib/update.js @@ -66,11 +66,15 @@ const executeIControlCall = function (context, call) { if (call.command === 'iControl_post') { // handle simple posts to the bigip if (call.properties.why.startsWith('upload asm policy')) { - return asmUtil.applyAs3Settings(call.properties.send, call.properties.overrides) - .then((response) => { - call.properties.send = response; - return util.iControlRequest(context, call.properties); - }); + return asmUtil.applyAs3Settings( + call.properties.send, + call.properties.settings, + call.properties.reference, + context.tasks[context.currentIndex].declaration + ).then((response) => { + call.properties.send = response; + return util.iControlRequest(context, call.properties); + }); } return util.iControlRequest(context, call.properties); } @@ -103,7 +107,9 @@ const executeIControlCall = function (context, call) { return asmUtil.applyAs3Settings( response, - call.properties.post.overrides + call.properties.post.settings, + call.properties.post.reference, + context.tasks[context.currentIndex].declaration ); }) .then((response) => { diff --git a/src/lib/util/arrayUtil.js b/src/lib/util/arrayUtil.js deleted file mode 100644 index 1db3cc64..00000000 --- a/src/lib/util/arrayUtil.js +++ /dev/null @@ -1,63 +0,0 @@ -/** - * Copyright 2023 F5 Networks, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* Borrowed and modified from f5-icontrollx-dev-kit (github.com/f5devcentral/f5-icontrollx-dev-kit) */ -/* eslint-disable object-shorthand */ - -'use strict'; - -const ensureArray = function (input) { - if (typeof input === 'undefined') { - return []; - } - return (Array.isArray(input)) ? input : [input]; -}; - -/** - * Checks if any member of tArray is present in array - * - * @public - * @param {array} arr1 - check base array - * @param {array} arr2 - the target array to compare with - * @returns {boolean} - true any of arr2 is in arr1, else false - */ -const doesArrayContainAnyOf = function (arr1, arr2) { - if (typeof arr1 === 'undefined' || typeof arr2 === 'undefined') { - return false; - } - return arr1.some((r) => arr2.indexOf(r) >= 0); -}; - -/** - * Checks if any member of tArray is present in array - * - * @public - * @param {array} array - check base array - * @param {value} target - the target value of any type - * @returns {boolean} - true if target is in the array, else false - */ -const doesArrayContain = function (array, target) { - if (typeof array === 'undefined') { - return false; - } - return array.indexOf(target) !== -1; -}; - -module.exports = { - ensureArray, - doesArrayContainAnyOf, - doesArrayContain -}; diff --git a/src/lib/util/asmUtil.js b/src/lib/util/asmUtil.js index 8851a6a6..ebb42253 100644 --- a/src/lib/util/asmUtil.js +++ b/src/lib/util/asmUtil.js @@ -17,6 +17,9 @@ 'use strict'; const xml2js = require('xml2js'); +const jsonpointer = require('jsonpointer'); +const expandUtil = require('./expandUtil'); +const util = require('./util'); function convertJsonToXml(jsonObject) { const builder = new xml2js.Builder({ @@ -87,7 +90,8 @@ function mapSettings(jsonObject, settings) { 'url', 'file', 'ignoreChanges', - 'policy' + 'policy', + 'expand' ]; Object.keys(settings) .filter((key) => ignoredKeys.indexOf(key) < 0) @@ -102,6 +106,39 @@ function mapSettings(jsonObject, settings) { return jsonObject; } +function expandStrings(jsonPointers, jsonObject, instancePath, declaration) { + (jsonPointers || []).forEach((pointer) => { + const value = jsonpointer.get(jsonObject, pointer); + if (typeof value === 'undefined') { + throw new Error(`Could not expand string in ${instancePath}. JSON pointer "${pointer}" references a nonexistent value in the policy`); + } + const policyPointer = `${instancePath}/policy`; + // copy decl to avoid modifying original + const declCopy = util.simpleCopy(declaration); + // Add the full WAF policy JSON object to the WAF_Policy instance in the declaration. We do this so that + // expandUtil can traverse the WAF Policy data as if it was originally part of the declaration, allowing any + // string expansion to autofill declaration related data such as application name, class name, etc + jsonpointer.set(declCopy, policyPointer, jsonObject); + expandString(declCopy, `${policyPointer}${pointer}`, value); + }); + return jsonObject; +} + +function expandString(declaration, pointer, value) { + const valueType = typeof value; + if (valueType === 'string') { + const lastSlashIdx = pointer.lastIndexOf('/'); + const parentDataProperty = pointer.substring(lastSlashIdx + 1); + const parentData = jsonpointer.get(declaration, pointer.substring(0, lastSlashIdx)); + expandUtil.backquoteExpand(value, pointer, parentData, declaration, parentData, parentDataProperty); + } else if (valueType === 'object' && value !== null) { + Object.keys(value).forEach((key) => { + const refKey = key.replace('~', '~0').replace('/', '~1'); + expandString(declaration, `${pointer}/${refKey}`, value[key]); + }); + } +} + function isJson(string) { try { JSON.parse(string); @@ -111,13 +148,18 @@ function isJson(string) { return true; } -function applyAs3Settings(xmlString, settings) { +function applyAs3Settings(xmlString, settings, instancePath, declaration) { if (!xmlString) { return Promise.reject(new Error('Missing required xmlString argument')); } if (isJson(xmlString)) { - return Promise.resolve(xmlString); + return Promise.resolve() + .then(() => { + const jsonObject = JSON.parse(xmlString); + const newJsonObject = expandStrings(settings.expand, jsonObject, instancePath, declaration); + return JSON.stringify(newJsonObject); + }); } return Promise.resolve() diff --git a/src/lib/util/perAppUtil.js b/src/lib/util/perAppUtil.js new file mode 100644 index 00000000..b101f141 --- /dev/null +++ b/src/lib/util/perAppUtil.js @@ -0,0 +1,106 @@ +/** + * Copyright 2023 F5 Networks, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +const uuid = require('uuid'); + +/** + * Takes a per-app declaration from requestContext and returns a per-tenant conversion + * Eng Note: This was specifically written to run BEFORE as3request.validateAndWrap() + * + * @param {object} perAppDeclaration - Per-app declaration to be converted + * @param {object} perAppInfo - Per-app info for use in the conversion + * @returns {object} + */ +const convertToPerTenant = (perAppDeclaration, perAppInfo) => { + if (!perAppInfo || !perAppDeclaration) { + // perAppInfo and perAppDeclaration are required + return perAppDeclaration || {}; + } + + if (perAppDeclaration.class === 'ADC' || typeof perAppDeclaration[perAppInfo.tenant] !== 'undefined') { + // perAppDeclaration is likely already converted to perTenant + return perAppDeclaration; + } + + const perTenantDecl = { + class: 'ADC', + schemaVersion: '3.0.0', + id: `autogen_${uuid.v4()}` + }; + + perTenantDecl[perAppInfo.tenant] = { + class: 'Tenant' + }; + + perAppInfo.apps.forEach((app) => { + perTenantDecl[perAppInfo.tenant][app] = perAppDeclaration[app]; + }); + + return perTenantDecl; +}; + +/** + * Takes a per-tenant declaration from requestContext and returns a per-app conversion + * Eng Note: This was specifically written to run BEFORE restOperation.complete() + * + * @param {object} perTenDeclaration - Per-tenant declaration to be converted + * @param {object} perAppInfo - Per-app info for use in the conversion + * @returns {object} + */ +const convertToPerApp = (perTenDeclaration, perAppInfo) => { + if (!perAppInfo || !perTenDeclaration) { + // perAppInfo and perTenDeclaration are required + return perTenDeclaration || {}; + } + + // Due to the timing of these function calls, it is possible the declaration is + // actually an error message. In which case, just return it. + if (perTenDeclaration.message || perTenDeclaration.code) { + return perTenDeclaration; + } + + if (typeof perTenDeclaration[perAppInfo.tenant] === 'undefined') { + // if the tenant is already missing from the declaration it is likely already per-app return + return perTenDeclaration; + } + + const perAppDecl = {}; + perAppInfo.apps.forEach((app) => { + perAppDecl[app] = perTenDeclaration[perAppInfo.tenant][app]; + }); + + return perAppDecl; +}; + +const isPerAppPath = (path) => { + if (!path) { return false; } // No path provided + + const splitPath = path.split('/'); + if (splitPath.length < 6 || splitPath.length > 7) { return false; } // Path too short/long for per-app + if (splitPath[5].indexOf('applications') === -1) { return false; } // Path missing key value + if (splitPath[4].indexOf(',') > -1) { return false; } // Tenants cannot be list + if (splitPath.length === 7 && splitPath[6].indexOf(',') > -1) { return false; } // Apps cannot be list + + return true; +}; + +module.exports = { + convertToPerApp, + convertToPerTenant, + isPerAppPath +}; diff --git a/src/lib/util/restUtil.js b/src/lib/util/restUtil.js index 6f7f5fbf..78d5eed9 100644 --- a/src/lib/util/restUtil.js +++ b/src/lib/util/restUtil.js @@ -20,6 +20,7 @@ const log = require('../log'); const util = require('./util'); const Config = require('../config'); const STATUS_CODES = require('../constants').STATUS_CODES; +const perAppUtil = require('./perAppUtil'); /** * builds an operation result @@ -105,6 +106,16 @@ function formatResult(result) { } } +/** + * This function finishes a multi-declaration request the user + * submitted and returns a formatted result + * Eng Note: Per-App API should never hit this function, as + * multi-declaration is incompatible with the API + * + * @param {object} restOperation - RestOperation object + * @param {object} result - Response back to user + * @param {boolean} [format] - determines the format response + */ const completeRequestMultiStatus = function (restOperation, results, format) { if (format) { const statusCode = getMultiStatusCode(results); @@ -120,11 +131,28 @@ const completeRequestMultiStatus = function (restOperation, results, format) { checkWebhook(restOperation, results.body || results); }; -const completeRequest = function (restOperation, result) { +/** + * This function finishes the request the user made and returns + * the results. + * + * @param {object} restOperation - RestOperation object + * @param {object} result - Response back to user + * @param {object} [perAppInfo] - Holds tenant, application, and original + * declaration for per-app requests. + * Eng Note: perAppInfo should be provided when NOT expecting an error + */ +const completeRequest = function (restOperation, result, perAppInfo) { formatResult(result); + const body = util.simpleCopy(result.body); + + if (perAppInfo && restOperation.method === 'Post' && !body.errors) { + // ONLY transform non-error per-app Post declarations + body.declaration = perAppUtil.convertToPerApp(body.declaration, perAppInfo); + } + restOperation.setStatusCode(result.code); - restOperation.setBody(result.body); + restOperation.setBody(body); restOperation.complete(); checkWebhook(restOperation, result); diff --git a/src/lib/util/util.js b/src/lib/util/util.js index dde3b85b..563a1a35 100644 --- a/src/lib/util/util.js +++ b/src/lib/util/util.js @@ -840,11 +840,13 @@ class Util { * * @public * @param {object} context - info needed to access target BIG-IP + * @param {string} [tenant] - optional tenant to limit query to * @returns {Promise} */ - static getVirtualAddressList(context) { + static getVirtualAddressList(context, tenant) { + const filter = tenant ? `$filter=partition+eq+${tenant}&` : ''; const opts = { - path: '/mgmt/tm/ltm/virtual-address?$select=fullPath,partition,address,metadata', + path: `/mgmt/tm/ltm/virtual-address?${filter}$select=fullPath,partition,address,metadata`, why: 'query target BIG-IP current ltm virtual-address list' }; @@ -872,6 +874,57 @@ class Util { }); } // getVirtualAddressList() + /** + * return a promise to discover all the ltm address-list + * objects on a BIG-IP. Promise resolves to an array + * (possibly empty) of objects describing address-lists, + * or rejects with error. + * + * virtualAddressObj: + * address: "address" + * fullPath: "/P/F/N" + * partition: "P" + * + * @public + * @param {object} context - info needed to access target BIG-IP + * @param {string} [tenant] - optional tenant to limit query to + * @returns {Promise} + */ + static getAddressListList(context, tenant) { + if (this.versionLessThan(this.getDeepValue(context, 'target.tmosVersion'), '14.1')) { + return Promise.resolve([]); + } + + const filter = tenant ? `$filter=partition+eq+${tenant}&` : ''; + const opts = { + path: `/mgmt/tm/net/address-list?${filter}$select=fullPath,partition,addresses,addressLists`, + why: 'query target BIG-IP current ltm virtual-address list' + }; + + return this.iControlRequest(context, opts) + .then((resp) => { + const list = []; + + if (!Object.prototype.hasOwnProperty.call(resp, 'items') + || !Array.isArray(resp.items) || (resp.items.length < 1)) { + return list; + } + + resp.items.forEach((item) => { + const addressList = { + fullPath: item.fullPath, + partition: item.partition, + addresses: item.addresses, + addressLists: item.addressLists || [] + }; + + list.push(addressList); + }); + + return list; + }); + } + /** * return a promise to discover all the apm profile access * objects on a BIG-IP. Promise resolves to an array diff --git a/src/nodejs/restWorker.js b/src/nodejs/restWorker.js index 5e564378..9e867b1c 100644 --- a/src/nodejs/restWorker.js +++ b/src/nodejs/restWorker.js @@ -180,7 +180,6 @@ class RestWorker { if (path) { const pathParts = path.split('?')[0].split('/'); - if (pathParts[0] === '') { pathParts.shift(); } @@ -198,11 +197,23 @@ class RestWorker { } if (endpoint === 'declare') { - validPathLengths.push(4); // tenant name + validPathLengths.push(4); // tenant(s) name(s) if ((pathParts.length === 5 || pathParts.length === 6) && pathParts[4] === 'applications') { - validPathLengths.push(5); // 'applications' - validPathLengths.push(6); // application name + switch (restOperation.method) { + case 'Post': + validPathLengths.push(5); // 'applications' + break; + case 'Get': + validPathLengths.push(5); // 'applications' + validPathLengths.push(6); // application name + break; + case 'Put': + case 'Delete': + validPathLengths.push(6); // requires application name + break; + default: + } } } diff --git a/src/schema/latest/core-schema.json b/src/schema/latest/core-schema.json index 14c6e1c6..09ab90ef 100644 --- a/src/schema/latest/core-schema.json +++ b/src/schema/latest/core-schema.json @@ -30,7 +30,7 @@ "description": "Version of ADC Declaration schema this declaration uses", "type": "string", "$comment": "IMPORTANT: In enum array, please put current schema version first, oldest-supported version last. Keep enum array sorted most-recent-first.", - "enum": [ "3.45.0", "3.44.0", "3.43.0", "3.42.0", "3.41.0", "3.40.0", "3.39.0", "3.38.0", "3.37.0", "3.36.0", "3.35.0", "3.34.0", "3.33.0", "3.32.0", "3.31.0", "3.30.0", "3.29.0", "3.28.0", "3.27.0", "3.26.0", "3.25.0", "3.24.0", "3.23.0", "3.22.0", "3.21.0", "3.20.0", "3.19.0", "3.18.0", "3.17.0", "3.16.0", "3.15.0", "3.14.0", "3.13.0", "3.12.0", "3.11.0", "3.10.0", "3.9.0", "3.8.0", "3.7.0", "3.6.0", "3.5.0", "3.4.0", "3.3.0", "3.2.0", "3.1.0", "3.0.0" ] + "enum": [ "3.46.0", "3.45.0", "3.44.0", "3.43.0", "3.42.0", "3.41.0", "3.40.0", "3.39.0", "3.38.0", "3.37.0", "3.36.0", "3.35.0", "3.34.0", "3.33.0", "3.32.0", "3.31.0", "3.30.0", "3.29.0", "3.28.0", "3.27.0", "3.26.0", "3.25.0", "3.24.0", "3.23.0", "3.22.0", "3.21.0", "3.20.0", "3.19.0", "3.18.0", "3.17.0", "3.16.0", "3.15.0", "3.14.0", "3.13.0", "3.12.0", "3.11.0", "3.10.0", "3.9.0", "3.8.0", "3.7.0", "3.6.0", "3.5.0", "3.4.0", "3.3.0", "3.2.0", "3.1.0", "3.0.0" ] }, "id": { "title": "Declaration ID", @@ -503,8 +503,28 @@ }, "virtualPort": { "title": "Virtual server TCP port", - "description": "Default 80 is well-known HTTP port", - "type": "integer", + "description": "Default 80 is well-known HTTP port. Accepts either an integer or a reference to a Firewall_Port_List that contains the ports on which to listen. Firewall_Port_List is only supported on BIG-IP 14.1 and later. If a Firewall_Port_List is provided, BIG-IP AS3 will create a traffic-matching-criteria for the virtual.", + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Port_List" + }, + { + "f5PostProcess": { + "tag": "minVersion", + "data": { + "version": "14.1", + "strict": true + } + } + } + ] + } + ], "default": 80 } }, @@ -561,8 +581,28 @@ }, "virtualPort": { "title": "Virtual server TCP port", - "description": "Default 443 is well-known HTTPS port", - "type": "integer", + "description": "Default 443 is well-known HTTPS port. Accepts either an integer or a reference to a Firewall_Port_List that contains the ports on which to listen. Firewall_Port_List is only supported on BIG-IP 14.1 and later. If a Firewall_Port_List is provided, BIG-IP AS3 will create a traffic-matching-criteria for the virtual.", + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Port_List" + }, + { + "f5PostProcess": { + "tag": "minVersion", + "data": { + "version": "14.1", + "strict": true + } + } + } + ] + } + ], "default": 443 }, "redirect80": { @@ -959,8 +999,28 @@ }, "virtualPort": { "title": "virtual server TCP port", - "description": "virtual server TCP port", - "type": "integer", + "description": "Accepts either an integer or a reference to a Firewall_Port_List that contains the ports on which to listen. Firewall_Port_List is only supported on BIG-IP 14.1 and later. If a Firewall_Port_List is provided, BIG-IP AS3 will create a traffic-matching-criteria for the virtual.", + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Port_List" + }, + { + "f5PostProcess": { + "tag": "minVersion", + "data": { + "version": "14.1", + "strict": true + } + } + } + ] + } + ], "minimum": 0, "maximum": 65535 }, @@ -1249,8 +1309,28 @@ }, "virtualPort": { "title": "Virtual server UDP port", - "description": "Virtual server UDP port", - "type": "integer", + "description": "Accepts either an integer or a reference to a Firewall_Port_List that contains the ports on which to listen. Firewall_Port_List is only supported on BIG-IP 14.1 and later. If a Firewall_Port_List is provided, BIG-IP AS3 will create a traffic-matching-criteria for the virtual.", + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Port_List" + }, + { + "f5PostProcess": { + "tag": "minVersion", + "data": { + "version": "14.1", + "strict": true + } + } + } + ] + } + ], "minimum": 0, "maximum": 65535 }, @@ -1396,8 +1476,28 @@ }, "virtualPort": { "title": "virtual server SCTP port", - "description": "virtual server port", - "type": "integer", + "description": "Accepts either an integer or a reference to a Firewall_Port_List that contains the ports on which to listen. Firewall_Port_List is only supported on BIG-IP 14.1 and later. If a Firewall_Port_List is provided, BIG-IP AS3 will create a traffic-matching-criteria for the virtual.", + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Port_List" + }, + { + "f5PostProcess": { + "tag": "minVersion", + "data": { + "version": "14.1", + "strict": true + } + } + } + ] + } + ], "minimum": 0, "maximum": 65535 }, @@ -1416,7 +1516,8 @@ "allOf": [ { "$ref": "#/definitions/Service_Core" } ], - "required": [ "class", "virtualPort" ] + + "required": [ "class", "virtualPort"] }, @@ -1491,8 +1592,28 @@ "properties": { "virtualPort": { "title": "virtual server TCP port", - "description": "virtual server port", - "type": "integer", + "description": "Accepts either an integer or a reference to a Firewall_Port_List that contains the ports on which to listen. Firewall_Port_List is only supported on BIG-IP 14.1 and later. If a Firewall_Port_List is provided, BIG-IP AS3 will create a traffic-matching-criteria for the virtual.", + "oneOf": [ + { + "type": "integer" + }, + { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Port_List" + }, + { + "f5PostProcess": { + "tag": "minVersion", + "data": { + "version": "14.1", + "strict": true + } + } + } + ] + } + ], "minimum": 0, "maximum": 65535 }, @@ -1642,37 +1763,57 @@ "virtualAddresses": { "title": "Virtual addresses", - "description": "Virtual server will listen to each IP address in list. To accept connections only from certain subnet(s), replace IP address with array [IP-address, accept-from-subnet]. IP address can also be replaced by a reference to a Service_Address.", - "type": "array", - "f5PostProcess": { - "tag": "virtualAddress" - }, - "items": { - "if": { "type": "string" }, - "then": { "format": "f5ip" }, - "else": { - "if": { "type": "array" }, - "then": { - "type": "array", - "items": { - "title": "Virtual address", - "if": { "type": "string" }, - "then": { "format": "f5ip" }, + "description": "Accepts either an array or a reference to an Address_List which contains destination addresses to which this virtual will listen. To accept connections only from certain subnet(s), replace IP address in the provided array with array [IP-address, accept-from-subnet]. IP address in the provided array can also be replaced by a reference to a Service_Address. A reference to an Address_List is only supported on BIG-IP 14.1 and later. If an Address_List is provided, BIG-IP AS3 will create a traffic-matching-criteria for the virtual.", + "oneOf": [ + { + "type": "array", + "f5PostProcess": { + "tag": "virtualAddress" + }, + "items": { + "if": { "type": "string" }, + "then": { "format": "f5ip" }, + "else": { + "if": { "type": "array" }, + "then": { + "type": "array", + "items": { + "title": "Virtual address", + "if": { "type": "string" }, + "then": { "format": "f5ip" }, + "else": { + "$ref": "#/definitions/Pointer_Service_Address" + } + }, + "minItems": 2, + "maxItems": 2, + "uniqueItems": true + }, "else": { "$ref": "#/definitions/Pointer_Service_Address" } - }, - "minItems": 2, - "maxItems": 2, - "uniqueItems": true + } }, - "else": { - "$ref": "#/definitions/Pointer_Service_Address" - } + "minItems": 1, + "uniqueItems": true + }, + { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Address_List" + }, + { + "f5PostProcess": { + "tag": "minVersion", + "data": { + "version": "14.1", + "strict": true + } + } + } + ] } - }, - "minItems": 1, - "uniqueItems": true + ] }, "serviceDownImmediateAction": { "title": "Service Down Immediate Action", @@ -1693,9 +1834,29 @@ }, "sourceAddress": { "title": "Source address", - "description": "Accept connections only from these subnet(s). Only allowed if virtualType is internal, otherwise use virtualAddresses.", - "type": "string", - "format": "f5ip" + "description": "Accepts either a string or a reference to an Address_List which contains source addresses from which this virtual will listen. A reference to an Address_List is only supported on BIG-IP 14.1 and later. If an Address_List is provided, BIG-IP AS3 will create a traffic-matching-criteria for the virtual.", + "oneOf": [ + { + "type": "string", + "format": "f5ip" + }, + { + "allOf": [ + { + "$ref": "#/definitions/Pointer_Address_List" + }, + { + "f5PostProcess": { + "tag": "minVersion", + "data": { + "version": "14.1", + "strict": true + } + } + } + ] + } + ] }, "enable": { "title": "Enable", @@ -2252,10 +2413,7 @@ } }, "then": { - "required": [ "virtualAddresses" ], - "not": { - "required": [ "sourceAddress" ] - } + "required": [ "virtualAddresses" ] } }, { "$ref": "#/definitions/Include" } @@ -2502,57 +2660,9 @@ "required": [ "class", "address" ] }, - "iRule": { - "title": "iRule", - "description": "An iRule", - "type": "object", - - "properties": { - "class": { - "title": "Class", - "type": "string", - "const": "iRule" - }, - "label": { "$ref": "#/definitions/Label" }, - "remark": { "$ref": "#/definitions/Remark" }, - - "expand": { - "title": "Expand", - "description": "If true (default), expand backquoted variables in iRule", - "type": "boolean", - "default": true - }, - "iRule": { - "$ref": "#/definitions/iRule_Core" - } - }, - "additionalProperties": false, - "required": [ "class", "iRule" ] - }, - - "iRule_Core": { - "title": "iRule Core definition", - "description": "Reference to an iRule or text of an iRule", - "allOf": [ - { "$ref": "#/definitions/F5string" }, - { - "f5PostProcess": { - "tag": "expand", - "data": { "when": "1/expand" } - } - }, - { - "f5PostProcess": { - "tag": "fetch", - "data": "string" - } - } - ] - }, - "WAF_Policy": { "title": "WAF_Policy", - "description": "A Web Application Firewall Policy", + "description": "A Web Application Firewall Policy. Supports both traditional and advanced WAF policies. Advanced WAF policies require TMOS version 16.0 or newer.", "type": "object", "f5PostProcess": { "tag": "modules", @@ -2619,7 +2729,7 @@ "enforcementMode": { "title": "Enforcement Mode", - "description": "Overrides the enforcement mode setting of the WAF policy", + "description": "Overrides the enforcement mode setting of the WAF policy. Ignored on Advanced WAF policies", "type": "string", "enum": [ "blocking", @@ -2628,7 +2738,7 @@ }, "serverTechnologies": { "title": "Server Technologies", - "description": "Define server technologies for the WAF Policy, such as Java Servlets or Apache Struts", + "description": "Define server technologies for the WAF Policy, such as Java Servlets or Apache Struts. Ignored on Advanced WAF policies", "type": "array", "items": { "title": "Server Technology", @@ -2638,7 +2748,7 @@ }, "disabledSignatures": { "title": "Disabled attack signatures", - "description": "Disable various attack signatures by ID.", + "description": "Disable various attack signatures by ID. Ignored on Advanced WAF policies", "type": "array", "items": { "title": "Attack Signature ID", @@ -2647,6 +2757,18 @@ "maximum": 399999999 }, "uniqueItems": true + }, + "expand": { + "title": "Expand", + "description": "Performs AS3 string expansion on specified values within the WAF Policy. WAF Policies that are not in JSON format will be ignored", + "type": "array", + "items": { + "title": "JSON pointer", + "description": "A JSON pointer to a value within the WAF Policy that requires AS3 string expansion. Pointing to a parent property results in AS3 traversing the sub-properties and expanding any strings that it may find", + "type": "string" + }, + "uniqueItems": true + } }, "additionalProperties": false, @@ -3267,6 +3389,9 @@ "tag": "node" } }, + "metadata": { + "$ref": "#/definitions/Metadata" + }, "reselectTries": { "title": "Reselect tries", "description": "Maximum number of attempts to find a responsive member for a connection", @@ -3673,6 +3798,9 @@ "minimum": 0, "maximum": 63 }, + "metadata": { + "$ref": "#/definitions/Metadata" + }, "adminState": { "title": "Administration State", "description": "Setting adminState to enable will create the node in an operational state. Set to disable to disallow new connections but allow existing connections to drain. Set to offline to force immediate termination of all connections.", @@ -7249,9 +7377,16 @@ }, "routeDomain": { "description": "The route domain that will be used for outbound connect requests", - "type": "integer", - "minimum": 0, - "maximum": 65534, + "oneOf": [ + { + "type": "integer", + "minimum": 0, + "maximum": 65534 + }, + { + "type": "string" + } + ], "default": 0 }, "tunnelName": { @@ -7919,114 +8054,6 @@ } }, - - "L4_Profile": { - "title": "L4_Profile", - "description": "Configures a Fast Layer 4 profile", - "type": "object", - - "properties": { - "class": { - "title": "Class", - "type": "string", - "const": "L4_Profile" - }, - "label": { "$ref": "#/definitions/Label" }, - "remark": { "$ref": "#/definitions/Remark" }, - - "clientTimeout": { - "title": "Client timeout", - "description": "Number of seconds allowed for a client to transmit enough data to select a server when you have late binding enabled. Value -1 means indefinite (not recommended)", - "type": "integer", - "minimum": -1, - "maximum": 86400, - "default": 30 - }, - "idleTimeout": { - "title": "Idle timeout", - "description": "Number of seconds (default 300; may not be 0) connection may remain idle before it becomes eligible for deletion. Value -1 (not recommended) means infinite", - "type": "integer", - "anyOf": [ - { - "minimum": 1, - "maximum": 86400 - }, - { "const": -1 } - ], - "default": 300 - }, - "keepAliveInterval": { - "title": "Keep-alive interval", - "description": "Number of seconds between keep-alive probes. A value of 0 seconds disables the feature.", - "type": "integer", - "minimum": 0, - "maximum": 4294967295, - "default": 0 - }, - "looseClose": { - "title": "Loose close", - "description": "When true, system closes a loosely-initiated connection when the system receives the first FIN packet from either the client or the server (default false).", - "type": "boolean", - "default": false - }, - "looseInitialization": { - "title": "Loose initialization", - "description": "When true, system initializes a connection when it receives any TCP packet, rather than requiring a SYN packet for connection initiation (default false).", - "type": "boolean", - "default": false - }, - "maxSegmentSize": { - "title": "MSS", - "description": "Sets MSS advertised to peer. Value 0 (default) will set MSS automatically in proportion to interface MTU. Default 0 is usually the best choice", - "type": "integer", - "anyOf": [ - { - "minimum": 256, - "maximum": 9162 - }, - { "const": 0 } - ], - "default": 0 - }, - "resetOnTimeout": { - "title": "Reset on timeout", - "description": "If true (default), connections which time out will be reset (that is, the system sends an RST packet to the peer) before the system expunges them", - "type": "boolean", - "default": true - }, - "synCookieAllowlist": { - "title": "Syn Cookie Allowlist", - "description": "Specifies whether or not to use a SYN Cookie Allowlist when doing software SYN Cookies. This means not doing a SYN Cookie for the same src IP address if it has been done already in the previous tm.flowstate.timeout (30) seconds. The default value is disabled.", - "type": "boolean", - "default": false - }, - "synCookieEnable": { - "title": "SYN cookie enable", - "description": "Enables syn-cookies capability on this virtual server. If true (default), the system may use SYN cookies to avert connection-table overflow (for example, from DoS attacks)", - "type": "boolean", - "default": true - }, - "tcpCloseTimeout": { - "title": "TCP Close timeout", - "description": "Specifies an TCP close timeout in seconds. Value -1 means indefinite (not recommended)", - "type": "integer", - "minimum": -1, - "maximum": 86400, - "default": 5 - }, - "tcpHandshakeTimeout": { - "title": "TCP Handshake timeout", - "description": "Specifies a TCP handshake timeout in seconds. The default value is 5 seconds. Value -1 means indefinite (not recommended)", - "type": "integer", - "minimum": -1, - "maximum": 86400, - "default": 5 - } - }, - "additionalProperties": false, - "required": [ "class" ] - }, - "Classification_Profile": { "title": "Classification_Profile", "description": "Configures a classification profile", diff --git a/src/schema/latest/def-afm-schema.json b/src/schema/latest/def-afm-schema.json index 9d961229..27457c1d 100644 --- a/src/schema/latest/def-afm-schema.json +++ b/src/schema/latest/def-afm-schema.json @@ -1091,7 +1091,7 @@ "type": { "description": "The name of the service type", "type": "string", - "enum": ["dhcp", "dns", "gtp", "imap", "mqtt", "netbios_ns", "nntp", "pop3", "sip", "snmp", "ssl", "telnet", "wins", "diameter", "ftp", "http", "irc", "mysql", "netbios_ssn", "other", "radius", "smtp", "ssh", "sunrpc", "tftp", "coap", "oracle", "pfcp"] + "enum": ["boxp", "coap", "dhcp", "diameter", "dns", "ftp", "gtp", "http", "imap", "ipsec", "irc", "mqtt", "mysql", "netbios_ns", "netbios_ssn", "nntp", "oracle", "other", "pfcp", "pop3", "radius", "rdp", "rmi", "rsh", "sip", "smtp", "snmp", "ssh", "ssl", "sunrpc", "telnet", "tftp", "thrift", "wins"] }, "compliance": { "description": "A list of compliance checks to attach to the Protocol Inspection Profile", diff --git a/src/schema/latest/def-gslb-domain-schema.json b/src/schema/latest/def-gslb-domain-schema.json index 0b6ae0f3..5044ce3e 100644 --- a/src/schema/latest/def-gslb-domain-schema.json +++ b/src/schema/latest/def-gslb-domain-schema.json @@ -273,7 +273,7 @@ "default": true }, "iRule": { - "$ref": "#/definitions/iRule_Core" + "$ref": "#/definitions/IRule_Core" } }, "additionalProperties": false, diff --git a/src/schema/latest/def-log-schema.json b/src/schema/latest/def-log-schema.json index 5ddc35da..c5ac426f 100644 --- a/src/schema/latest/def-log-schema.json +++ b/src/schema/latest/def-log-schema.json @@ -1927,217 +1927,6 @@ "additionalProperties": false }, - "Log_Destination": { - "title": "Log_Destination", - "description": "Configures a log destination", - "type": "object", - - "properties": { - "class": { - "title": "Class", - "type": "string", - "const": "Log_Destination" - }, - "label": { - "$ref": "#/definitions/Label" - }, - "remark": { - "$ref": "#/definitions/Remark" - }, - "type": { - "description": "The type of the log destination", - "type": "string", - "enum": [ - "management-port", - "remote-high-speed-log", - "remote-syslog", - "splunk" - ] - } - }, - "required": ["class", "type"], - "allOf": [ - { - "if": { "properties": { "type": { "const": "management-port" } } }, - "then": { "$ref": "#/definitions/Log_Destination_Management_Port" } - }, - { - "if": { "properties": { "type": { "const": "remote-syslog" } } }, - "then": { "$ref": "#/definitions/Log_Destination_Remote_Syslog" } - }, - { - "if": { "properties": { "type": { "const": "remote-high-speed-log" } } }, - "then": { "$ref": "#/definitions/Log_Destination_Remote_High_Speed_Log" } - }, - { - "if": { "properties": { "type": { "const": "splunk" } } }, - "then": { "$ref": "#/definitions/Log_Destination_Splunk" } - } - ] - }, - - "Log_Destination_Management_Port": { - "description": "Sends received messages to a specified IP address and port through the management interface", - "type": "object", - "properties": { - "address": { - "description": "Specifies the IP address that will receive messages from the specified local Log Destination", - "type": "string", - "format": "f5ip" - }, - "port": { - "description": "Specifies the port of the IP address that will receive messages from the specified local Log Destination ", - "type": "integer", - "minimum": 0, - "maximum": 65535 - }, - "protocol": { - "description": "Specifies the protocol for the system to use to send logs to the specified location", - "type": "string", - "enum": [ - "tcp", - "udp" - ], - "default": "tcp" - } - }, - "required": [ - "address", - "port" - ] - }, - - "Log_Destination_Remote_Syslog": { - "description": "Configures Remote Syslog destinations to format log messages into Syslog format and forward them to a Remote High-Speed Log destination", - "type": "object", - "properties": { - "format": { - "description": "Specifies the method to use to format the logs", - "type": "string", - "enum": [ - "legacy-bigip", - "rfc3164", - "rfc5424" - ], - "default": "rfc3164" - }, - "defaultFacility": { - "description": "Specifies the facility given to log messages received that do not already have a facility listed", - "type": "string", - "enum": [ - "local0", - "local1", - "local2", - "local3", - "local4", - "local5", - "local6", - "local7" - ], - "default": "local0" - }, - "defaultSeverity": { - "description": "Specifies the severity given to log messages received that do not already have a severity listed", - "type": "string", - "enum": [ - "alert", - "crit", - "debug", - "emerg", - "err", - "info", - "notice", - "warn" - ], - "default": "info" - }, - "remoteHighSpeedLog": { - "description": "Specifies a remote high-speed log destination, which the system uses to forward the logs to a pool of remote log servers", - "type": "object", - "properties": { - "use": { - "title": "Use", - "description": "BIG-IP AS3 pointer to remote high speed log declaration", - "type": "string", - "minLength": 1, - "f5PostProcess": { - "tag": "pointer", - "data": { - "properties": { - "class": { - "const": "Log_Destination" - }, - "type": { - "const": "remote-high-speed-log" - } - }, - "required": ["class"] - } - } - }, - "bigip": { - "title": "BIG-IP remote high speed log", - "description": "Pathname of existing BIG-IP remote high speed log", - "type": "string", - "format": "f5bigip" - } - }, - "additionalProperties": false, - "minProperties": 1, - "maxProperties": 1, - "f5PostProcess": { - "tag": "bigComponent", - "data": ["query sys log-config destination remote-high-speed-log"] - } - } - }, - "required": ["remoteHighSpeedLog"] - }, - - "Log_Destination_Remote_High_Speed_Log": { - "description": "Sends received messages to a specified pool", - "type": "object", - "properties": { - "distribution": { - "description": "Specifies the distribution method used to send messages to pool members", - "type": "string", - "enum": [ - "adaptive", - "balanced", - "replicated" - ], - "default": "adaptive" - }, - "protocol": { - "description": "Specifies the protocol for the system to use to send logs to the pool", - "type": "string", - "enum": [ - "tcp", - "udp" - ], - "default": "tcp" - }, - "pool": { - "$ref": "#/definitions/Pointer_Pool" - } - }, - "required": ["pool"] - }, - - "Log_Destination_Splunk": { - "description": "Configures Splunk formatting destinations to format incoming log messages into Splunk format", - "type": "object", - "properties": { - "forwardTo": { - "description": "Specifies the log destination to which logs are forwarded", - "allOf": [ - { "$ref": "#/definitions/Pointer_Log_Destination" } - ] - } - }, - "required": ["forwardTo"] - }, - "Traffic_Log_Profile": { "title": "Traffic_Log_Profile", "description": "A traffic log profile", diff --git a/src/schema/latest/def-ltm-policy-schema.json b/src/schema/latest/def-ltm-policy-schema.json index 8613ada9..afb1f8d6 100644 --- a/src/schema/latest/def-ltm-policy-schema.json +++ b/src/schema/latest/def-ltm-policy-schema.json @@ -156,6 +156,7 @@ "httpHeader", "httpRedirect", "httpUri", + "botDefense", "waf", "forward", "drop", @@ -176,6 +177,10 @@ "if": { "properties": { "type": { "const": "waf" } } }, "then": { "$ref": "#/definitions/Policy_Action_WAF" } }, + { + "if": { "properties": { "type": { "const": "botDefense" } } }, + "then": { "$ref": "#/definitions/Policy_Action_Bot_Defense" } + }, { "if": { "properties": { "type": { "const": "forward" } } }, "then": { "$ref": "#/definitions/Policy_Action_Forward" } @@ -201,7 +206,7 @@ "then": { "$ref": "#/definitions/Policy_Action_HTTP_Cookie" } }, { - "if": { "properties": { "type": { "const": "serverSsl" } } }, + "if": { "properties": { "type": { "const": "clientSsl" } } }, "then": { "$ref": "#/definitions/Policy_Action_Client_SSL" } }, { @@ -267,6 +272,27 @@ "required": [] }, + "Policy_Action_Bot_Defense": { + "type": "object", + "description": "Enable or disable Unified Bot Defense processing", + "properties": { + "event": { + "type": "string", + "description": "When to run this event in the request-response cycle", + "enum": [ + "client-accepted", + "proxy-request", + "request" + ], + "default": "request" + }, + "profile": { + "$ref": "#/definitions/Pointer_Bot_Defense_Profile" + } + }, + "required": [] + }, + "Policy_Action_Drop": { "type": "object", "description": "Reset connection", diff --git a/src/schema/latest/def-net-schema.json b/src/schema/latest/def-net-schema.json index 874c12c1..613bf71a 100644 --- a/src/schema/latest/def-net-schema.json +++ b/src/schema/latest/def-net-schema.json @@ -288,6 +288,42 @@ { "required": [ "addressLists" ] } ], "additionalProperties": false + }, + "Net_Port_List": { + "title": "Net_Port_List", + "description": "You can use the port-list component to define reusable lists of ports. This property requires a BIG-IP version of 14.1 or higher.", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "Net_Port_List" + }, + "label": { "$ref": "#/definitions/Label" }, + "remark": { "$ref": "#/definitions/Remark" }, + "ports": { + "type": "array", + "description": "A list of ports and port ranges (for example, 80, \"8080-8090\").", + "items": { + "type": ["integer", "string"] + }, + "minItems": 1 + }, + "portLists": { + "type": "array", + "description": "A list of other port lists (each by BIG-IP AS3 pointer or BIG-IP pathname).", + "items": { + "$ref": "#/definitions/Pointer_Net_Port_List" + }, + "minItems": 1 + } + }, + "required": ["class"], + "anyOf": [ + { "required": [ "ports" ] }, + { "required": [ "portLists" ] } + ], + "additionalProperties": false } } } diff --git a/src/schema/latest/def-pem-schema.json b/src/schema/latest/def-pem-schema.json index 72f780b1..5bd972f7 100644 --- a/src/schema/latest/def-pem-schema.json +++ b/src/schema/latest/def-pem-schema.json @@ -1040,7 +1040,7 @@ "default": true }, "iRule": { - "$ref": "#/definitions/iRule_Core" + "$ref": "#/definitions/IRule_Core" } }, "additionalProperties": false, diff --git a/src/schema/latest/pointers.json b/src/schema/latest/pointers.json index c9681a7c..df7201ba 100644 --- a/src/schema/latest/pointers.json +++ b/src/schema/latest/pointers.json @@ -226,6 +226,11 @@ "tmshPath": "security firewall policy", "class": "Firewall_Policy" }, + "Firewall_Port_List": { + "name": "firewall port list", + "tmsh path": "security firewall port-list", + "class": "Firewall_Port_List" + }, "Firewall_Rule_List": { "name": "firewall rule list", "tmshPath": "security firewall rule-list", @@ -383,6 +388,11 @@ "tmshPath": "net address-list", "class": "Net_Address_List" }, + "Net_Port_List": { + "name": "net port list", + "tmshPath": "net port-list", + "class": "Net_Port_List" + }, "Persist_Profile": { "name": "Persist Profile", "class": "Persist", @@ -422,11 +432,6 @@ "class": "IP_Other_Profile", "tmshPath": "ltm profile ipother" }, - "L4_Profile": { - "name": "fast L4 profile", - "class": "L4_Profile", - "tmshPath": "ltm profile fastl4" - }, "Radius_Profile": { "name": "radius profile", "class": "Radius_Profile", @@ -495,6 +500,11 @@ "class": "TLS_Client", "tmshPath": "ltm profile server-ssl" }, + "Port_List": { + "name": "firewall port list or net port list", + "tmshPath": ["security firewall port-list", "net port-list"], + "class": ["Firewall_Port_List", "Net_Port_List"] + }, "Request_Adapt_Profile": { "name": "Request Adapt Profile", "class": "Adapt_Profile", diff --git a/test/README.md b/test/README.md index 429bc1c7..ed71f2c1 100644 --- a/test/README.md +++ b/test/README.md @@ -69,12 +69,6 @@ If you need BIG-IP test devices to test with, visit: * `test/common/env/terraform/plans/azure/README.md` for Azure. * `test/common/env/terraform/plans/openstack/README.md` for openstack(VIO). -### Collection Tests -Location: `test/integration/bigip/collections` - -This subset of BIG-IP integration tests is a collection of [Postman collections](https://www.getpostman.com/docs/v6/postman/collections/creating_collections) that are run on a specified BIG-IP. -As an alternative to running these tests with Mocha, the Postman collections can be used directly with [Postman](https://www.getpostman.com/) and the [newman npm package](https://www.npmjs.com/package/newman). The long term plan for these tests are to migrate them from newman to Mocha and then move them to Misc Tests. - ### Misc Tests Location: `test/integration/bigip/misc` diff --git a/test/common/checkLib.js b/test/common/checkLib.js deleted file mode 100644 index 5687d958..00000000 --- a/test/common/checkLib.js +++ /dev/null @@ -1,63 +0,0 @@ -/** - * Copyright 2023 F5 Networks, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -'use strict'; - -class CheckLib { - static addStatusCodeCheck(events, statusCode) { - if (!events.test) { - events.test = []; - } - - events.test.push( - `pm.test("Status code is ${statusCode}", function () {`, - ` pm.response.to.have.status(${statusCode});`, - '});\n' - ); - } - - static addMessageCheck(events, message) { - if (!events.test) { - events.test = []; - } - - events.test.push( - 'pm.test("Response contains error message", function () {', - ` pm.expect(pm.response.text()).to.include('${message}');`, - '});\n' - ); - } - - static addMultiMessageCheck(events, items, statusCodes) { - if (!events.test) { - events.test = []; - } - events.test.push('const jsonData = pm.response.json();'); - items.forEach((msg, index) => { - const statusCode = statusCodes[index]; - events.test.push( - 'pm.test("Response contains error message", function () {', - ` pm.expect(jsonData.items[${index}].message).to.include('${msg}');`, - '});\n', - 'pm.test("Response contains statusCode", function () {', - ` pm.expect(jsonData.items[${index}].code).to.eql(${statusCode});`, - '});\n' - ); - }); - } -} - -module.exports = CheckLib; diff --git a/test/common/env/terraform/plans/azure/main.tf b/test/common/env/terraform/plans/azure/main.tf index 7241854f..2e2db5f3 100644 --- a/test/common/env/terraform/plans/azure/main.tf +++ b/test/common/env/terraform/plans/azure/main.tf @@ -119,6 +119,11 @@ resource "azurerm_virtual_machine" "vm" { identity { type = "SystemAssigned" } + + timeouts { + create = "1h" + delete = "1h" + } } # TODO: Make this logic smarter to handle 2 NICs case. diff --git a/test/common/env/terraform/plans/openstack/main.tf b/test/common/env/terraform/plans/openstack/main.tf index 39ffcca2..e59b613a 100644 --- a/test/common/env/terraform/plans/openstack/main.tf +++ b/test/common/env/terraform/plans/openstack/main.tf @@ -40,7 +40,7 @@ resource "openstack_compute_instance_v2" "openstack-instance" { } timeouts { - create = "2h" - delete = "2h" + create = "1h" + delete = "1h" } } diff --git a/test/common/newman.js b/test/common/newman.js deleted file mode 100644 index d19d4c41..00000000 --- a/test/common/newman.js +++ /dev/null @@ -1,157 +0,0 @@ -/** - * Copyright 2023 F5 Networks, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -'use strict'; - -const newman = require('newman'); -const path = require('path'); -const fs = require('fs'); -const logger = require('./Logger'); - -const DEFAULT_OPTIONS = { - insecure: true, - delayRequest: 1000, - timeout: 600000 -}; - -function createNewmanCallback(callback) { - return (error, summary) => { - if (error) { - callback(error); - return; - } - const failures = summary.run.failures; - if (failures.length > 0) { - const errors = failures - .map((failure) => { - const name = failure.source.name; - const message = failure.error.message; - return `${name}: ${message}`; - }) - .join('\n'); - callback(new Error(errors)); - return; - } - - callback(); - }; -} - -function generateNewmanGlobals(_variables) { - const variables = Object.assign({ - host: process.env.AS3_HOST, - username: process.env.AS3_USERNAME, - password: process.env.AS3_PASSWORD, - forge_p12: `https://${process.env.TEST_RESOURCES_URL}/certs/forge_p12.p12`, - policy_12_0: `https://${process.env.TEST_RESOURCES_URL}/asm-policy/wordpress_template_12.0.xml`, - policy_12_1: `https://${process.env.TEST_RESOURCES_URL}/asm-policy/sharepoint_template_12.1.xml` - }, _variables); - const globals = { - id: 'globals', - name: 'Postman Globals', - values: Object.keys(variables) - .map((key) => ({ - key, - value: variables[key], - enabled: true, - type: 'text' - })) - }; - return globals; -} - -function runNewman(collection, options, callback) { - try { - fs.unlinkSync(path.join(__dirname, `../../test/logs/${collection.info.name}.log`)); - } catch (err) { - // the file was not found - } - logger.remove(logger.transports[1]); - logger.addTransport(path.join(__dirname, `../../test/logs/${collection.info.name}.log`)); - logger.transports[1].level = process.env.FILE_VERBOSITY || 'verbose'; - - if (process.env.CONSOLE_VERBOSITY && process.env.CONSOLE_VERBOSITY !== '') { - logger.transports[0].level = process.env.CONSOLE_VERBOSITY; - } else { - logger.transports[0].silent = true; - } - - const runner = newman.run({ - collection, - globals: options.globals || generateNewmanGlobals(), - insecure: options.insecure || DEFAULT_OPTIONS.insecure, - delayRequest: options.delayRequest || DEFAULT_OPTIONS.delayRequest, - timeout: options.timeout || DEFAULT_OPTIONS.timeout - }, createNewmanCallback(callback)); - - runner.on('start', () => { - logger.info(`Running Collection: ${collection.info.name}`); - }); - - runner.on('beforeItem', (err, obj) => { - logger.info(`Running Item: ${obj.item.name}`); - }); - - runner.on('beforeRequest', (err, obj) => { - logger.info(`Request: \n${obj.request.method} ${obj.request.url}`); - if (obj.request.body.raw) { - logger.verbose(`Body: \n${obj.request.body.raw}`); - } - }); - - runner.on('request', (err, obj) => { - if (err) { - err.message = `Error recieved in a request: ${err.message}`; - throw err; - } - - let response = obj.response; - if (obj.response && obj.response.stream) { - response = obj.response.stream; - } - try { - response = JSON.parse(response); - } catch (e) { - logger.verbose(`Unable to parse response stream: ${e}`); - if (response) { - response = response.toString(); // Convert string or buffer to string - } else { - e.message += `Unable to retrieve response stream from request object: ${JSON.stringify(obj)}`; - throw e; - } - } - logger.info(`Response: \n${JSON.stringify(response.results || response, null, 3)}`); - }); - - runner.on('assertion', (err, obj) => { - if (err || obj.error) { - logger.error(`Request Encountered a Test Assertion: \n${JSON.stringify(obj.error.message, null, 3)}`); - } - }); - runner.on('console', (err, obj) => { - logger.info(`Test Log: \n${JSON.stringify(obj.messages, null, 3)}`); - }); - runner.on('done', () => { - logger.info(`Completed Running Collection: ${collection.info.name}`); - }); -} - -module.exports = { - createNewmanCallback, - generateNewmanGlobals, - runNewman, - DEFAULT_OPTIONS -}; diff --git a/test/common/random.js b/test/common/random.js deleted file mode 100644 index b6b01710..00000000 --- a/test/common/random.js +++ /dev/null @@ -1,69 +0,0 @@ -/** - * Copyright 2023 F5 Networks, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -'use strict'; - -const TestCollection = require('./testCollection'); -const resourceGenerator = require('./resourceGenerator'); -const newmanUtils = require('./newman'); - -function getRandomInt(min, max) { - return Math.floor(Math.random() * (max - min + 1)) + min; -} - -describe('Random', function () { - this.timeout(30000); - this.slow(20000); - - const iterations = 20; - - it('Service_Address', (done) => { - const collection = new TestCollection('Random Servive_Address'); - for (let i = 0; i < iterations; i += 1) { - const declaration = resourceGenerator.createDeclaration('TEST_Service_Address', ''); - declaration.tenant.application.TestAddress = resourceGenerator.createResource('Service_Address'); - declaration.tenant.application.serviceMain.virtualAddresses = [{ use: 'TestAddress' }]; - collection.addDeclarePostItem('random Service_Address', declaration); - } - newmanUtils.runNewman(collection, newmanUtils.DEFAULT_OPTIONS, done); - }); - - it('Tenant', (done) => { - const collection = new TestCollection('Random Tenant'); - for (let i = 0; i < iterations; i += 1) { - const tenantCount = getRandomInt(1, 10); - - const declaration = resourceGenerator.createDeclaration('TEST_Tenant', ''); - delete declaration.tenant; - for (let j = 0; j < tenantCount; j += 1) { - const name = resourceGenerator.createName(); - declaration[name] = resourceGenerator.createResource('Tenant'); - } - collection.addDeclarePostItem('random Tenants', declaration); - } - newmanUtils.runNewman(collection, newmanUtils.DEFAULT_OPTIONS, done); - }); - - it('Endpoint_Policy', (done) => { - const collection = new TestCollection('Random Endpoint_Policy'); - for (let i = 0; i < iterations; i += 1) { - const declaration = resourceGenerator.createDeclaration('TEST_Endpoint_Policy', ''); - declaration.tenant.application.TestPolicy = resourceGenerator.createResource('Endpoint_Policy'); - collection.addDeclarePostItem('random Endpoint_Policy', declaration); - } - newmanUtils.runNewman(collection, newmanUtils.DEFAULT_OPTIONS, done); - }); -}); diff --git a/test/common/testCollection.js b/test/common/testCollection.js deleted file mode 100644 index 0fcce306..00000000 --- a/test/common/testCollection.js +++ /dev/null @@ -1,164 +0,0 @@ -/** - * Copyright 2023 F5 Networks, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -'use strict'; - -const CheckLib = require('./checkLib'); - -class TestCollection { - constructor(name) { - this.info = { - id: 'debug', - name, - schema: 'https://schema.getpostman.com/json/collection/v2.1.0/collection.json' - }; - this.changeCredentials(); - this.item = []; - - this.addDeleteItem('Pre-test'); - } - - changeCredentials() { - this.auth = { - type: 'basic', - basic: [ - { - key: 'password', - value: '{{password}}', - type: 'string' - }, - { - key: 'username', - value: '{{username}}', - type: 'string' - } - ] - }; - } - - /* eslint-disable-next-line class-methods-use-this */ - createRequest(requestOptions) { - const endpoint = requestOptions.endpoint || ''; - const body = {}; - if (requestOptions.body) { - body.mode = 'raw'; - body.raw = JSON.stringify(requestOptions.body); - } - const request = { - method: requestOptions.method || 'GET', - body, - url: `https://{{host}}/${endpoint}`, - header: requestOptions.headers - }; - return request; - } - - /* eslint-disable-next-line class-methods-use-this */ - createEvents(events) { - const event = Object.keys(events) - .map((key) => ({ - listen: key, - script: { - type: 'text/javascript', - exec: events[key] - } - })); - return event; - } - - addItem(_options) { - const options = _options || {}; - const item = { - name: options.name || 'Request', - description: options.description || '' - }; - item.request = this.createRequest(options.request || {}); - item.event = this.createEvents(options.events || {}); - this.item.push(item); - } - - addDeleteItem(description) { - this.addItem({ - name: `${description} delete`, - request: { - method: 'DELETE', - endpoint: 'mgmt/shared/appsvcs/declare/', - body: {} - }, - events: { - test: [ - 'pm.test("Status code is 200", function() {', - ' pm.response.to.have.status(200);', - '});' - ] - } - }); - } - - addDeclarePostItem(description, body) { - const item = { - name: `Test declare POST with ${description}`, - request: { - method: 'POST', - endpoint: 'mgmt/shared/appsvcs/declare', - body - }, - events: {} - }; - CheckLib.addStatusCodeCheck(item.events, 200); - this.addItem(item); - } - - addNonSuccessItem(description, body, subpath, method, statusCode, errorMessage, statusCodes) { - if (!method) { - method = 'POST'; - } - - subpath = subpath ? `/${subpath}` : ''; - body = method === 'GET' || method === 'DELETE' ? undefined : body; - const item = { - name: `Test declare/${subpath} - ${description}`, - request: { - method, - endpoint: `mgmt/shared/appsvcs/declare${subpath}`, - body, - headers: [ - { - key: 'Content-Type', - value: 'application/json', - type: 'text' - } - ] - }, - events: {} - }; - CheckLib.addStatusCodeCheck(item.events, statusCode); - - if (statusCodes) { - CheckLib.addMultiMessageCheck(item.events, errorMessage, statusCodes); - } else { - CheckLib.addMessageCheck(item.events, errorMessage); - } - - this.addItem(item); - } - - serialize() { - return JSON.stringify(this, null, 2); - } -} - -module.exports = TestCollection; diff --git a/test/integration/bigip/collections/_prepare.environment.collection.json b/test/integration/bigip/collections/_prepare.environment.collection.json deleted file mode 100644 index 24086554..00000000 --- a/test/integration/bigip/collections/_prepare.environment.collection.json +++ /dev/null @@ -1,187 +0,0 @@ -{ - "info": { - "_postman_id": "86b59c1b-9798-4abc-85cf-5e9a7effe69f", - "name": "BigstartRestartTest", - "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" - }, - "item": [ - { - "name": "Bigstart Restart", - "event": [ - { - "listen": "test", - "script": { - "id": "1f133fa7-13ff-4821-8b4e-31f6daf4a6d9", - "exec": [ - "postman.setEnvironmentVariable(\"nextRequest\", 'Check Bigstart Restart');", - "postman.setNextRequest('Delay');" - ], - "type": "text/javascript" - } - } - ], - "request": { - "auth": { - "type": "basic", - "basic": [ - { - "key": "password", - "value": "{{password}}", - "type": "string" - }, - { - "key": "username", - "value": "{{username}}", - "type": "string" - } - ] - }, - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json" - } - ], - "body": { - "mode": "raw", - "raw": "{\n\t\"command\":\"run\",\n\t\"utilCmdArgs\":\"-c \\\"bigstart restart restnoded restjavad icr_eventd\\\"\"\n}" - }, - "url": { - "raw": "https://{{host}}/mgmt/tm/util/bash", - "protocol": "https", - "host": [ - "{{host}}" - ], - "path": [ - "mgmt", - "tm", - "util", - "bash" - ] - } - }, - "response": [] - }, - { - "name": "Delay", - "event": [ - { - "listen": "test", - "script": { - "id": "01863881-51b6-49f2-81f4-0f45d6525656", - "type": "text/javascript", - "exec": [ - "var next = postman.getEnvironmentVariable('nextRequest');", - "", - "if(next !== ''){", - " postman.setNextRequest(next);", - "}" - ] - } - } - ], - "request": { - "auth": { - "type": "noauth" - }, - "method": "GET", - "header": [ - { - "key": "Content-Type", - "value": "application/json" - } - ], - "body": { - "mode": "raw", - "raw": "" - }, - "url": { - "raw": "https://postman-echo.com/delay/20", - "protocol": "https", - "host": [ - "postman-echo", - "com" - ], - "path": [ - "delay", - "20" - ] - } - }, - "response": [] - }, - { - "name": "Check Bigstart Restart", - "event": [ - { - "listen": "test", - "script": { - "id": "0d1294f3-e271-4a35-a635-c9a12a806592", - "type": "text/javascript", - "exec": [ - "if (pm.response.code === 200) {", - " postman.clearEnvironmentVariable('nextRequest');", - " postman.setNextRequest('POST to Selftest');", - "} else {", - " postman.setNextRequest('Delay');", - "}" - ] - } - } - ], - "request": { - "auth": { - "type": "basic", - "basic": [ - { - "key": "password", - "value": "{{password}}", - "type": "string" - }, - { - "key": "username", - "value": "{{username}}", - "type": "string" - } - ] - }, - "method": "GET", - "header": [], - "body": { - "mode": "raw", - "raw": "" - }, - "url": { - "raw": "https://{{host}}/mgmt/shared/appsvcs/info", - "protocol": "https", - "host": [ - "{{host}}" - ], - "path": [ - "mgmt", - "shared", - "appsvcs", - "info" - ] - } - }, - "response": [] - } - ], - "auth": { - "type": "basic", - "basic": [ - { - "key": "password", - "value": "{{password}}", - "type": "string" - }, - { - "key": "username", - "value": "{{username}}", - "type": "string" - } - ] - } -} \ No newline at end of file diff --git a/test/integration/bigip/collections/as3.request.multi.decl.collection.json b/test/integration/bigip/collections/as3.request.multi.decl.collection.json deleted file mode 100644 index 5f2c45ac..00000000 --- a/test/integration/bigip/collections/as3.request.multi.decl.collection.json +++ /dev/null @@ -1,1198 +0,0 @@ -{ - "info": { - "_postman_id": "0d4c2aca-d25d-4da1-b1da-6bbe22ca9ae3", - "name": "AS3 Request Multi Decl Tests", - "description": "Tests that verify that handling AS3-Request Schema (aka wrapper) works as intended", - "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" - }, - "item": [ - { - "name": "Delete all Tenants (Begin)", - "event": [ - { - "listen": "test", - "script": { - "id": "651d8734-0996-444c-93e9-2910297e2d73", - "exec": [ - "let utils = eval(pm.globals.get('utils'))();", - "pm = utils.utils.getPM();", - "", - "pm.test(\"Status code is 200\", function () {", - " pm.response.to.have.status(200);", - "});", - "", - "pm.test(\"Status code for each tenant is 200\", function () {", - " var jsonData = pm.response.json();", - " jsonData.results.forEach((r) => pm.expect(r.code).to.eql(200));", - "});" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "DELETE", - "header": [], - "body": { - "mode": "raw", - "raw": "" - }, - "url": { - "raw": "https://{{host}}/mgmt/shared/appsvcs/declare", - "protocol": "https", - "host": [ - "{{host}}" - ], - "path": [ - "mgmt", - "shared", - "appsvcs", - "declare" - ] - } - }, - "response": [] - }, - { - "name": "Delay 2 sec", - "event": [ - { - "listen": "test", - "script": { - "id": "651d8734-0996-444c-93e9-2910297e2d73", - "exec": [ - "" - ], - "type": "text/javascript" - } - } - ], - "protocolProfileBehavior": { - "disableBodyPruning": true - }, - "request": { - "auth": { - "type": "noauth" - }, - "method": "GET", - "header": [], - "body": { - "mode": "raw", - "raw": "" - }, - "url": { - "raw": "https://postman-echo.com/delay/2", - "protocol": "https", - "host": [ - "postman-echo", - "com" - ], - "path": [ - "delay", - "2" - ] - } - }, - "response": [] - }, - { - "name": "Deploy Multiple Declaration - [ADC]", - "event": [ - { - "listen": "test", - "script": { - "id": "cf130b4c-d35b-416f-9df1-3150132d14ba", - "exec": [ - "let utils = eval(pm.globals.get('utils'))();", - "pm = utils.utils.getPM();", - "", - "pm.test(\"Status code is 207\", function () {", - " pm.response.to.have.status(207);", - "});", - "", - "pm.test(\"Tenant1 Deploy should succeed\", function () {", - " const jsonData = pm.response.json();", - " const tenant1 = jsonData.items[0].results.find(r => r.tenant === 'AS3Request_Tenant1');", - " pm.expect(tenant1.code).to.eql(200);", - " pm.expect(tenant1.message).to.eql('success');", - "});", - "", - "pm.test(\"Tenant2 Deploy should fail\", function () {", - " const jsonData = pm.response.json();", - " const tenant2 = jsonData.items[1].results.find(r => r.tenant === 'AS3Request_Tenant2');", - " pm.expect(tenant2.code).to.eql(422);", - " pm.expect(tenant2.message).to.eql('declaration failed');", - " pm.expect(tenant2.response.indexOf('the IP address 198.19.192.114 already exists.')).to.not.eql(-1);", - "});" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json" - } - ], - "body": { - "mode": "raw", - "raw": " [\n {\n \"AS3Request_Tenant1\": {\n \"class\": \"Tenant\",\n \"App1\": {\n \"class\": \"Application\",\n \"template\": \"http\",\n \"serviceMain\": {\n \"class\": \"Service_HTTP\",\n \"virtualAddresses\": [\n \"198.19.192.114\"\n ],\n \"pool\": \"web_pool1\"\n },\n \"web_pool1\": {\n \"class\": \"Pool\",\n \"monitors\": [\n \"http\"\n ],\n \"members\": [\n {\n \"servicePort\": 80,\n \"serverAddresses\": [\n \"198.19.192.72\",\n \"198.19.192.73\"\n ]\n }\n ]\n }\n }\n },\n \"class\": \"ADC\",\n \"schemaVersion\": \"3.0.0\",\n \"id\": \"AS3Request_Tenant1\",\n \"updateMode\": \"selective\",\n \"controls\": {\n \"trace\": true,\n \"logLevel\": \"debug\"\n \n }\n },\n {\n \"AS3Request_Tenant2\": {\n \"class\": \"Tenant\",\n \"App1\": {\n \"class\": \"Application\",\n \"template\": \"http\",\n \"serviceMain\": {\n \"class\": \"Service_HTTP\",\n \"virtualAddresses\": [\n \"198.19.192.114\"\n ],\n \"pool\": \"web_pool1\"\n },\n \"web_pool1\": {\n \"class\": \"Pool\",\n \"monitors\": [\n \"http\"\n ],\n \"members\": [\n {\n \"servicePort\": 80,\n \"serverAddresses\": [\n \"198.19.192.172\",\n \"198.19.192.173\"\n ]\n }\n ]\n }\n }\n },\n \"class\": \"ADC\",\n \"schemaVersion\": \"3.0.0\",\n \"id\": \"AS3Request_Tenant2\",\n \"updateMode\": \"selective\",\n \"controls\": {\n \"trace\": true,\n \"logLevel\": \"debug\"\n \n }\n }\n ]\n\n" - }, - "url": { - "raw": "https://{{host}}/mgmt/shared/appsvcs/declare", - "protocol": "https", - "host": [ - "{{host}}" - ], - "path": [ - "mgmt", - "shared", - "appsvcs", - "declare" - ] - } - }, - "response": [] - }, - { - "name": "Deploy Multiple Declaration - [AS3]", - "event": [ - { - "listen": "test", - "script": { - "id": "cf130b4c-d35b-416f-9df1-3150132d14ba", - "exec": [ - "let utils = eval(pm.globals.get('utils'))();", - "pm = utils.utils.getPM();", - "", - "pm.test(\"Status code is 207\", function () {", - " pm.response.to.have.status(207);", - "});", - "", - "pm.test(\"Tenant1 Deploy should succeed, no change\", function () {", - " const jsonData = pm.response.json();", - " const tenant1 = jsonData.items[0].results.find(r => r.tenant === 'AS3Request_Tenant1');", - " pm.expect(tenant1.code).to.eql(200);", - " pm.expect(tenant1.message).to.eql('no change');", - "});", - "", - "pm.test(\"Tenant2 Deploy should fail\", function () {", - " const jsonData = pm.response.json();", - " const tenant2 = jsonData.items[1].results.find(r => r.tenant === 'AS3Request_Tenant2');", - " pm.expect(tenant2.code).to.eql(422);", - " pm.expect(tenant2.message).to.eql('declaration failed');", - " pm.expect(tenant2.response.indexOf('the IP address 198.19.192.114 already exists.')).to.not.eql(-1);", - "});" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json" - } - ], - "body": { - "mode": "raw", - "raw": "[\n {\n \"class\": \"AS3\",\n \"action\": \"deploy\",\n \"declaration\": {\n \"AS3Request_Tenant1\": {\n \"class\": \"Tenant\",\n \"App1\": {\n \"class\": \"Application\",\n \"template\": \"http\",\n \"serviceMain\": {\n \"class\": \"Service_HTTP\",\n \"virtualAddresses\": [\n \"198.19.192.114\"\n ],\n \"pool\": \"web_pool1\"\n },\n \"web_pool1\": {\n \"class\": \"Pool\",\n \"monitors\": [\n \"http\"\n ],\n \"members\": [\n {\n \"servicePort\": 80,\n \"serverAddresses\": [\n \"198.19.192.72\",\n \"198.19.192.73\"\n ]\n }\n ]\n }\n }\n },\n \"class\": \"ADC\",\n \"schemaVersion\": \"3.0.0\",\n \"id\": \"AS3Request_Tenant1\",\n \"updateMode\": \"selective\",\n \"controls\": {\n \"trace\": true,\n \"logLevel\": \"debug\"\n }\n }\n },\n {\n \"class\": \"AS3\",\n \"action\": \"deploy\",\n \"declaration\": {\n \"AS3Request_Tenant2\": {\n \"class\": \"Tenant\",\n \"App1\": {\n \"class\": \"Application\",\n \"template\": \"http\",\n \"serviceMain\": {\n \"class\": \"Service_HTTP\",\n \"virtualAddresses\": [\n \"198.19.192.114\"\n ],\n \"pool\": \"web_pool1\"\n },\n \"web_pool1\": {\n \"class\": \"Pool\",\n \"monitors\": [\n \"http\"\n ],\n \"members\": [\n {\n \"servicePort\": 80,\n \"serverAddresses\": [\n \"198.19.192.172\",\n \"198.19.192.173\"\n ]\n }\n ]\n }\n }\n },\n \"class\": \"ADC\",\n \"schemaVersion\": \"3.0.0\",\n \"id\": \"AS3Request_Tenant2\",\n \"updateMode\": \"selective\",\n \"controls\": {\n \"trace\": true,\n \"logLevel\": \"debug\"\n }\n }\n }\n]" - }, - "url": { - "raw": "https://{{host}}/mgmt/shared/appsvcs/declare", - "protocol": "https", - "host": [ - "{{host}}" - ], - "path": [ - "mgmt", - "shared", - "appsvcs", - "declare" - ] - } - }, - "response": [] - }, - { - "name": "Delete all Tenants", - "event": [ - { - "listen": "test", - "script": { - "id": "651d8734-0996-444c-93e9-2910297e2d73", - "exec": [ - "let utils = eval(pm.globals.get('utils'))();", - "pm = utils.utils.getPM();", - "", - "pm.test(\"Status code is 200\", function () {", - " pm.response.to.have.status(200);", - "});", - "", - "pm.test(\"Status code for each tenant is 200\", function () {", - " var jsonData = pm.response.json();", - " jsonData.results.forEach((r) => pm.expect(r.code).to.eql(200));", - "});" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "DELETE", - "header": [], - "body": { - "mode": "raw", - "raw": "" - }, - "url": { - "raw": "https://{{host}}/mgmt/shared/appsvcs/declare", - "protocol": "https", - "host": [ - "{{host}}" - ], - "path": [ - "mgmt", - "shared", - "appsvcs", - "declare" - ] - } - }, - "response": [] - }, - { - "name": "Delay 2 sec", - "event": [ - { - "listen": "test", - "script": { - "id": "651d8734-0996-444c-93e9-2910297e2d73", - "exec": [ - "" - ], - "type": "text/javascript" - } - } - ], - "protocolProfileBehavior": { - "disableBodyPruning": true - }, - "request": { - "auth": { - "type": "noauth" - }, - "method": "GET", - "header": [], - "body": { - "mode": "raw", - "raw": "" - }, - "url": { - "raw": "https://postman-echo.com/delay/2", - "protocol": "https", - "host": [ - "postman-echo", - "com" - ], - "path": [ - "delay", - "2" - ] - } - }, - "response": [] - }, - { - "name": "Gather pending async tasks", - "event": [ - { - "listen": "test", - "script": { - "id": "c9e10511-7753-4013-907d-71a4d970bd06", - "exec": [ - "let utils = eval(pm.globals.get('utils'))();", - "pm = utils.utils.getPM();", - "", - "var data = pm.response.json();", - "if (Array.isArray(data)) {", - " pm.environment.set(\"previousTasks\", data.map(task => task.record));", - "} else {", - " pm.environment.set(\"previousTasks\", []);", - "}" - ], - "type": "text/javascript" - } - } - ], - "protocolProfileBehavior": { - "disableBodyPruning": true - }, - "request": { - "method": "GET", - "header": [], - "body": { - "mode": "raw", - "raw": "" - }, - "url": { - "raw": "https://{{host}}/mgmt/shared/appsvcs/task", - "protocol": "https", - "host": [ - "{{host}}" - ], - "path": [ - "mgmt", - "shared", - "appsvcs", - "task" - ] - } - }, - "response": [] - }, - { - "name": "Delete pre-existing asnyc task", - "event": [ - { - "listen": "prerequest", - "script": { - "id": "3640c8cb-73ea-48ca-91aa-79780f3d94ef", - "exec": [ - "console.log(pm.environment.get('previousTasks'));", - "if (pm.environment.get('previousTasks').length) {", - " postman.setNextRequest('Delete pre-existing asnyc task');", - " pm.environment.set('taskId', pm.environment.get('previousTasks').pop());", - "}" - ], - "type": "text/javascript" - } - }, - { - "listen": "test", - "script": { - "id": "d78bbea9-3e3a-4cd8-b026-ab02fe975e80", - "exec": [ - "let utils = eval(pm.globals.get('utils'))();", - "pm = utils.utils.getPM();", - "", - "var tasks = pm.environment.get('previousTasks');", - "var task = tasks.pop();", - "pm.environment.set('previousTasks', tasks);" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "DELETE", - "header": [], - "body": { - "mode": "raw", - "raw": "" - }, - "url": { - "raw": "https://{{host}}/mgmt/tm/ltm/data-group/internal/~Common~____appsvcs_request_{{taskId}}", - "protocol": "https", - "host": [ - "{{host}}" - ], - "path": [ - "mgmt", - "tm", - "ltm", - "data-group", - "internal", - "~Common~____appsvcs_request_{{taskId}}" - ] - } - }, - "response": [] - }, - { - "name": "Delay 2 sec", - "event": [ - { - "listen": "test", - "script": { - "id": "651d8734-0996-444c-93e9-2910297e2d73", - "exec": [ - "" - ], - "type": "text/javascript" - } - } - ], - "protocolProfileBehavior": { - "disableBodyPruning": true - }, - "request": { - "auth": { - "type": "noauth" - }, - "method": "GET", - "header": [], - "body": { - "mode": "raw", - "raw": "" - }, - "url": { - "raw": "https://postman-echo.com/delay/2", - "protocol": "https", - "host": [ - "postman-echo", - "com" - ], - "path": [ - "delay", - "2" - ] - } - }, - "response": [] - }, - { - "name": "GET async starting state", - "event": [ - { - "listen": "test", - "script": { - "id": "a5c8959b-2d14-4f4d-9021-bff7fef3c7e6", - "exec": [ - "let utils = eval(pm.globals.get('utils'))();", - "pm = utils.utils.getPM();", - "", - "const jsonData = pm.response.json();", - "console.log(JSON.stringify(jsonData));" - ], - "type": "text/javascript" - } - } - ], - "protocolProfileBehavior": { - "disableBodyPruning": true - }, - "request": { - "method": "GET", - "header": [], - "body": { - "mode": "raw", - "raw": "" - }, - "url": { - "raw": "https://{{host}}/mgmt/shared/appsvcs/task", - "protocol": "https", - "host": [ - "{{host}}" - ], - "path": [ - "mgmt", - "shared", - "appsvcs", - "task" - ] - } - }, - "response": [] - }, - { - "name": "Deploy Multiple Declaration - ASYNC", - "event": [ - { - "listen": "test", - "script": { - "id": "085563a1-5c03-4e3a-8aa3-96c127d27d79", - "exec": [ - "let utils = eval(pm.globals.get('utils'))();", - "pm = utils.utils.getPM();", - "", - "pm.test(\"Status code is 202\", function () {", - " pm.response.to.have.status(202);", - "});", - "", - "pm.test(\"Tenant1 Deploy should submit decl\", function () {", - " const jsonData = pm.response.json();", - " const tenant1 = jsonData.items[0];", - " pm.expect(tenant1.results[0].message).to.eql(\"Declaration successfully submitted\");", - " pm.environment.set(\"tenant1Task\", tenant1.id);", - "});", - "", - "pm.test(\"Tenant2 Deploy should submit decl\", function () {", - " const jsonData = pm.response.json();", - " const tenant2 = jsonData.items[1];", - " pm.expect(tenant2.results[0].message).to.eql(\"Declaration successfully submitted\");", - " pm.environment.set(\"tenant2Task\", tenant2.id);", - "});" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json" - } - ], - "body": { - "mode": "raw", - "raw": "[\n {\n \"AS3Request_Tenant1\": {\n \"class\": \"Tenant\",\n \"App1\": {\n \"class\": \"Application\",\n \"template\": \"http\",\n \"serviceMain\": {\n \"class\": \"Service_HTTP\",\n \"virtualAddresses\": [\n \"198.19.192.14\"\n ],\n \"pool\": \"web_pool1\"\n },\n \"web_pool1\": {\n \"class\": \"Pool\",\n \"monitors\": [\n \"http\"\n ],\n \"members\": [\n {\n \"servicePort\": 80,\n \"serverAddresses\": [\n \"198.19.192.72\",\n \"198.19.192.73\"\n ]\n }\n ]\n }\n }\n },\n \"class\": \"ADC\",\n \"schemaVersion\": \"3.0.0\",\n \"id\": \"AS3Request_Tenant1\",\n \"updateMode\": \"selective\",\n \"controls\": {\n \"trace\": true,\n \"logLevel\": \"debug\"\n }\n },\n {\n \"AS3Request_Tenant2\": {\n \"class\": \"Tenant\",\n \"App1\": {\n \"class\": \"Application\",\n \"template\": \"http\",\n \"serviceMain\": {\n \"class\": \"Service_HTTP\",\n \"virtualAddresses\": [\n \"198.19.192.114\"\n ],\n \"pool\": \"web_pool1\"\n },\n \"web_pool1\": {\n \"class\": \"Pool\",\n \"monitors\": [\n \"http\"\n ],\n \"members\": [\n {\n \"servicePort\": 80,\n \"serverAddresses\": [\n \"198.19.192.172\",\n \"198.19.192.173\"\n ]\n }\n ]\n }\n }\n },\n \"class\": \"ADC\",\n \"schemaVersion\": \"3.0.0\",\n \"id\": \"AS3Request_Tenant2\",\n \"updateMode\": \"selective\",\n \"controls\": {\n \"trace\": true,\n \"logLevel\": \"debug\"\n }\n }\n]" - }, - "url": { - "raw": "https://{{host}}/mgmt/shared/appsvcs/declare?async=true", - "protocol": "https", - "host": [ - "{{host}}" - ], - "path": [ - "mgmt", - "shared", - "appsvcs", - "declare" - ], - "query": [ - { - "key": "async", - "value": "true" - } - ] - }, - "description": "Redeploys previous declaration of explicit proxy. Verifies no change." - }, - "response": [] - }, - { - "name": "Delay 20 sec", - "event": [ - { - "listen": "test", - "script": { - "id": "651d8734-0996-444c-93e9-2910297e2d73", - "exec": [ - " // postman max is 10 sec", - " setTimeout(function(){}, 10000);" - ], - "type": "text/javascript" - } - } - ], - "protocolProfileBehavior": { - "disableBodyPruning": true - }, - "request": { - "auth": { - "type": "noauth" - }, - "method": "GET", - "header": [], - "body": { - "mode": "raw", - "raw": "" - }, - "url": { - "raw": "https://postman-echo.com/delay/10", - "protocol": "https", - "host": [ - "postman-echo", - "com" - ], - "path": [ - "delay", - "10" - ] - } - }, - "response": [] - }, - { - "name": "GET Multiple Declaration - Tenant1 ASYNC Result", - "event": [ - { - "listen": "test", - "script": { - "id": "085563a1-5c03-4e3a-8aa3-96c127d27d79", - "exec": [ - "let utils = eval(pm.globals.get('utils'))();", - "pm = utils.utils.getPM();", - "", - "pm.test(\"Status code is 200\", function () {", - " pm.response.to.have.status(200);", - "});", - "", - "pm.test(\"Tenant1 Async result should succeed\", function () {", - " const jsonData = pm.response.json();", - " const tenant1 = jsonData.results.find(r => r.tenant === 'AS3Request_Tenant1');", - " pm.expect(tenant1.code).to.eql(200);", - " pm.expect(tenant1.message).to.eql('success');", - "});" - ], - "type": "text/javascript" - } - } - ], - "protocolProfileBehavior": { - "disableBodyPruning": true - }, - "request": { - "method": "GET", - "header": [ - { - "key": "Content-Type", - "value": "application/json" - } - ], - "body": { - "mode": "raw", - "raw": "" - }, - "url": { - "raw": "https://{{host}}/mgmt/shared/appsvcs/task/{{tenant1Task}}", - "protocol": "https", - "host": [ - "{{host}}" - ], - "path": [ - "mgmt", - "shared", - "appsvcs", - "task", - "{{tenant1Task}}" - ] - }, - "description": "Redeploys previous declaration of explicit proxy. Verifies no change." - }, - "response": [] - }, - { - "name": "GET Multiple Declaration - Tenant2 ASYNC Result", - "event": [ - { - "listen": "test", - "script": { - "id": "085563a1-5c03-4e3a-8aa3-96c127d27d79", - "exec": [ - "let utils = eval(pm.globals.get('utils'))();", - "pm = utils.utils.getPM();", - "", - "pm.test(\"Status code is 200\", function () {", - " pm.response.to.have.status(200);", - "});", - "", - "pm.test(\"Tenant2 Async result should succeed\", function () {", - " const jsonData = pm.response.json();", - " const tenant2 = jsonData.results.find(r => r.tenant === 'AS3Request_Tenant2');", - " pm.expect(tenant2.code).to.eql(200);", - " pm.expect(tenant2.message).to.eql('success');", - "});" - ], - "type": "text/javascript" - } - } - ], - "protocolProfileBehavior": { - "disableBodyPruning": true - }, - "request": { - "method": "GET", - "header": [ - { - "key": "Content-Type", - "value": "application/json" - } - ], - "body": { - "mode": "raw", - "raw": "" - }, - "url": { - "raw": "https://{{host}}/mgmt/shared/appsvcs/task/{{tenant2Task}}", - "protocol": "https", - "host": [ - "{{host}}" - ], - "path": [ - "mgmt", - "shared", - "appsvcs", - "task", - "{{tenant2Task}}" - ] - }, - "description": "Redeploys previous declaration of explicit proxy. Verifies no change." - }, - "response": [] - }, - { - "name": "Delete all Tenants", - "event": [ - { - "listen": "test", - "script": { - "id": "651d8734-0996-444c-93e9-2910297e2d73", - "exec": [ - "let utils = eval(pm.globals.get('utils'))();", - "pm = utils.utils.getPM();", - "", - "pm.test(\"Status code is 200\", function () {", - " pm.response.to.have.status(200);", - "});", - "", - "pm.test(\"Status code for each tenant is 200\", function () {", - " var jsonData = pm.response.json();", - " jsonData.results.forEach((r) => pm.expect(r.code).to.eql(200));", - "});" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "DELETE", - "header": [], - "body": { - "mode": "raw", - "raw": "" - }, - "url": { - "raw": "https://{{host}}/mgmt/shared/appsvcs/declare", - "protocol": "https", - "host": [ - "{{host}}" - ], - "path": [ - "mgmt", - "shared", - "appsvcs", - "declare" - ] - } - }, - "response": [] - }, - { - "name": "Delay 2 sec", - "event": [ - { - "listen": "test", - "script": { - "id": "651d8734-0996-444c-93e9-2910297e2d73", - "exec": [ - "" - ], - "type": "text/javascript" - } - } - ], - "protocolProfileBehavior": { - "disableBodyPruning": true - }, - "request": { - "auth": { - "type": "noauth" - }, - "method": "GET", - "header": [], - "body": { - "mode": "raw", - "raw": "" - }, - "url": { - "raw": "https://postman-echo.com/delay/2", - "protocol": "https", - "host": [ - "postman-echo", - "com" - ], - "path": [ - "delay", - "2" - ] - } - }, - "response": [] - }, - { - "name": "Deploy Auto Async On Timeout", - "event": [ - { - "listen": "test", - "script": { - "id": "cf130b4c-d35b-416f-9df1-3150132d14ba", - "exec": [ - "let utils = eval(pm.globals.get('utils'))();", - "pm = utils.utils.getPM();", - "", - "pm.test(\"Status code is 202\", function () {", - " pm.response.to.have.status(202);", - "});", - "", - "", - "pm.test(\"Request should auto async on timeout (45s)\", function () {", - " const jsonData = pm.response.json();", - " pm.expect(jsonData.code).to.eql(202);", - " jsonData.items.forEach((msg,index) => {", - " pm.expect(msg.results[0].message).to.eql('Declaration successfully submitted');", - " pm.expect(msg.selfLink).to.include(msg.id);", - " pm.environment.set(`decl${index + 1}Task`, msg.id);", - " });", - "", - "});", - "", - "pm.environment.set('isDecl1Complete', false);", - "pm.environment.set('isDecl2Complete', false);" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json" - } - ], - "body": { - "mode": "raw", - "raw": "[\n {\n \"AS3Request_Tenant1\": {\n \"class\": \"Tenant\",\n \"App1\": {\n \"class\": \"Application\",\n \"template\": \"http\",\n \"serviceMain\": {\n \"class\": \"Service_HTTP\",\n \"virtualAddresses\": [\n \"198.19.192.114\"\n ],\n \"pool\": \"web_pool1\"\n },\n \"web_pool1\": {\n \"class\": \"Pool\",\n \"monitors\": [\n \"http\"\n ],\n \"members\": [\n {\n \"servicePort\": 80,\n \"serverAddresses\": [\n \"198.19.192.72\",\n \"198.19.192.73\"\n ]\n }\n ]\n }\n }\n },\n \"class\": \"ADC\",\n \"schemaVersion\": \"3.0.0\",\n \"id\": \"AS3Request_Tenant1\",\n \"updateMode\": \"selective\",\n \"controls\": {\n \"trace\": true,\n \"logLevel\": \"debug\"\n }\n },\n {\n \"class\": \"ADC\",\n \"schemaVersion\": \"3.0.0\",\n \"id\": \"AS3Request_Tenant3\",\n \"updateMode\": \"selective\",\n \"controls\": {\n \"trace\": true,\n \"logLevel\": \"debug\"\n },\n \"AS3Request_Tenant5\": {\n \"class\": \"Tenant\",\n \"App1\": {\n \"class\": \"Application\",\n \"template\": \"http\",\n \"serviceMain\": {\n \"class\": \"Service_HTTP\",\n \"virtualAddresses\": [\n \"198.19.192.15\"\n ],\n \"pool\": \"web_pool1\"\n },\n \"web_pool1\": {\n \"class\": \"Pool\",\n \"monitors\": [\n \"http\"\n ],\n \"members\": [\n {\n \"servicePort\": 80,\n \"serverAddresses\": [\n \"198.19.192.14\",\n \"198.19.192.15\"\n ]\n }\n ]\n }\n }\n },\n \"AS3Request_Tenant6\": {\n \"class\": \"Tenant\",\n \"Application\": {\n \"class\": \"Application\",\n \"template\": \"generic\",\n \"testItem\": {\n \"class\": \"Service_HTTP\",\n \"policyEndpoint\": \"endpointPolicy\",\n \"virtualAddresses\": [\n \"10.1.40.60\"\n ]\n },\n \"endpointPolicy\": {\n \"class\": \"Endpoint_Policy\",\n \"rules\": [\n {\n \"name\": \"enableWAF\",\n \"conditions\": [],\n \"actions\": [\n {\n \"type\": \"waf\",\n \"policy\": {\n \"use\": \"wafPolicy\"\n }\n }\n ]\n },\n {\n \"name\": \"disable\",\n \"conditions\": [],\n \"actions\": [\n {\n \"type\": \"waf\"\n }\n ]\n }\n ]\n },\n \"wafPolicy\": {\n \"class\": \"WAF_Policy\",\n \"url\": \"{{policy_12_0}}\",\n \"ignoreChanges\": true\n },\n \"wafPolicy2\": {\n \"class\": \"WAF_Policy\",\n \"url\": \"{{policy_12_0}}\",\n \"ignoreChanges\": true\n }\n }\n },\n \"AS3Request_Tenant7\": {\n \"class\": \"Tenant\",\n \"Application\": {\n \"class\": \"Application\",\n \"template\": \"generic\",\n \"testItem\": {\n \"class\": \"Service_HTTP\",\n \"policyEndpoint\": \"endpointPolicy\",\n \"virtualAddresses\": [\n \"10.1.40.70\"\n ]\n },\n \"endpointPolicy\": {\n \"class\": \"Endpoint_Policy\",\n \"rules\": [\n {\n \"name\": \"enableWAF\",\n \"conditions\": [],\n \"actions\": [\n {\n \"type\": \"waf\",\n \"policy\": {\n \"use\": \"wafPolicy\"\n }\n }\n ]\n },\n {\n \"name\": \"disable\",\n \"conditions\": [],\n \"actions\": [\n {\n \"type\": \"waf\"\n }\n ]\n }\n ]\n },\n \"wafPolicy\": {\n \"class\": \"WAF_Policy\",\n \"url\": \"{{policy_12_1}}\",\n \"ignoreChanges\": true\n }\n }\n }\n }\n]" - }, - "url": { - "raw": "https://{{host}}/mgmt/shared/appsvcs/declare", - "protocol": "https", - "host": [ - "{{host}}" - ], - "path": [ - "mgmt", - "shared", - "appsvcs", - "declare" - ] - } - }, - "response": [] - }, - { - "name": "Delay", - "event": [ - { - "listen": "test", - "script": { - "id": "651d8734-0996-444c-93e9-2910297e2d73", - "exec": [ - "if (!pm.environment.get('isDecl1Complete')) {", - " postman.setNextRequest('GET Multiple Declaration - Decl1 Auto ASYNC Result');", - "} else {", - " postman.setNextRequest('GET Multiple Declaration - Decl2 Auto ASYNC Result');", - "}" - ], - "type": "text/javascript" - } - } - ], - "protocolProfileBehavior": { - "disableBodyPruning": true - }, - "request": { - "auth": { - "type": "noauth" - }, - "method": "GET", - "header": [], - "body": { - "mode": "raw", - "raw": "" - }, - "url": { - "raw": "https://postman-echo.com/delay/10", - "protocol": "https", - "host": [ - "postman-echo", - "com" - ], - "path": [ - "delay", - "10" - ] - } - }, - "response": [] - }, - { - "name": "GET Multiple Declaration - Decl1 Auto ASYNC Result", - "event": [ - { - "listen": "test", - "script": { - "id": "085563a1-5c03-4e3a-8aa3-96c127d27d79", - "exec": [ - "let utils = eval(pm.globals.get('utils'))();", - "pm = utils.utils.getPM();", - "", - "pm.test(\"Status code is 200\", function () {", - " pm.response.to.have.status(200);", - "});", - "", - "if (pm.response.json().results[0].message !== 'in progress') {", - " pm.environment.set('isDecl1Complete', true);", - " pm.test(\"Is Decl1 Async finished\", function () {", - " const jsonData = pm.response.json().results;", - " jsonData.forEach((res) => {", - " pm.test(`Request was successful for ${res.tenant}`, function () {", - " pm.expect(res.code).to.equal(200);", - " });", - " });", - " });", - "}", - "", - "if (pm.environment.get('isDecl1Complete') && pm.environment.get('isDecl2Complete')) {", - " postman.setNextRequest('Delete all Tenants (End)');", - "} else if (pm.environment.get('isDecl2Complete')) {", - " postman.setNextRequest('Delay');", - "} else {", - " postman.setNextRequest('GET Multiple Declaration - Decl2 Auto ASYNC Result');", - "}" - ], - "type": "text/javascript" - } - } - ], - "protocolProfileBehavior": { - "disableBodyPruning": true - }, - "request": { - "method": "GET", - "header": [ - { - "key": "Content-Type", - "value": "application/json" - } - ], - "body": { - "mode": "raw", - "raw": "" - }, - "url": { - "raw": "https://{{host}}/mgmt/shared/appsvcs/task/{{decl1Task}}", - "protocol": "https", - "host": [ - "{{host}}" - ], - "path": [ - "mgmt", - "shared", - "appsvcs", - "task", - "{{decl1Task}}" - ] - }, - "description": "Redeploys previous declaration of explicit proxy. Verifies no change." - }, - "response": [] - }, - { - "name": "GET Multiple Declaration - Decl2 Auto ASYNC Result", - "event": [ - { - "listen": "test", - "script": { - "id": "085563a1-5c03-4e3a-8aa3-96c127d27d79", - "exec": [ - "let utils = eval(pm.globals.get('utils'))();", - "pm = utils.utils.getPM();", - "", - "pm.test(\"Status code is 200\", function () {", - " pm.response.to.have.status(200);", - "});", - "", - "if (pm.response.json().results[0].message !== 'in progress') {", - " pm.environment.set('isDecl2Complete', true);", - " pm.test(\"Is Decl2 Async finished\", function () {", - " const jsonData = pm.response.json().results;", - " jsonData.forEach((res) => {", - " pm.test(`Request was successful for ${res.tenant}`, function () {", - " pm.expect(res.code).to.equal(200);", - " });", - " });", - " });", - "}", - "", - "if (pm.environment.get('isDecl1Complete') && pm.environment.get('isDecl2Complete')) {", - " postman.setNextRequest('Delete all Tenants (End)');", - "} else {", - " postman.setNextRequest('Delay');", - "}" - ], - "type": "text/javascript" - } - } - ], - "protocolProfileBehavior": { - "disableBodyPruning": true - }, - "request": { - "method": "GET", - "header": [ - { - "key": "Content-Type", - "value": "application/json" - } - ], - "body": { - "mode": "raw", - "raw": "" - }, - "url": { - "raw": "https://{{host}}/mgmt/shared/appsvcs/task/{{decl2Task}}", - "protocol": "https", - "host": [ - "{{host}}" - ], - "path": [ - "mgmt", - "shared", - "appsvcs", - "task", - "{{decl2Task}}" - ] - }, - "description": "Redeploys previous declaration of explicit proxy. Verifies no change." - }, - "response": [] - }, - { - "name": "Delete all Tenants (End)", - "event": [ - { - "listen": "test", - "script": { - "id": "651d8734-0996-444c-93e9-2910297e2d73", - "exec": [ - "let utils = eval(pm.globals.get('utils'))();", - "pm = utils.utils.getPM();", - "", - "pm.test(\"Status code is 200\", function () {", - " pm.response.to.have.status(200);", - "});", - "", - "pm.test(\"Status code for each tenant is 200\", function () {", - " var jsonData = pm.response.json();", - " jsonData.results.forEach((r) => pm.expect(r.code).to.eql(200));", - "});" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "DELETE", - "header": [], - "body": { - "mode": "raw", - "raw": "" - }, - "url": { - "raw": "https://{{host}}/mgmt/shared/appsvcs/declare", - "protocol": "https", - "host": [ - "{{host}}" - ], - "path": [ - "mgmt", - "shared", - "appsvcs", - "declare" - ] - } - }, - "response": [] - } - ], - "auth": { - "type": "basic", - "basic": [ - { - "key": "password", - "value": "{{password}}", - "type": "string" - }, - { - "key": "username", - "value": "{{username}}", - "type": "string" - } - ] - }, - "event": [ - { - "listen": "prerequest", - "script": { - "id": "7372d2b6-cd3a-4bf4-a6d6-c90c6e49b273", - "type": "text/javascript", - "exec": [ - "pm.variables.set('retryCodes', [503]);", - "", - "const isRetrying = pm.variables.get('retrying');", - "", - "// If we are not currently retrying, reset number of retries", - "if (!isRetrying) {", - " pm.variables.set('retriesLeft', 10);", - "}", - "", - "postman.setGlobalVariable('utils', () => {", - " const isRetrying = pm.variables.get('retrying');", - " const pmProxy = {", - " get: function(pm, key) {", - " if (key == 'test') {", - " return (isRetrying ? pm.test.skip : pm.test);", - " }", - " return pm[key];", - " }", - " };", - " const getPM = () => {", - " return new Proxy(pm, pmProxy);", - " }", - " return {", - " utils: {", - " getPM", - " }", - " };", - "});" - ] - } - }, - { - "listen": "test", - "script": { - "id": "7bea9a60-11c2-471d-97ab-395fcf4fec4a", - "type": "text/javascript", - "exec": [ - "if (pm.variables.get('retryCodes').includes(pm.response.code)) {", - " pm.variables.set('retrying', true);", - " let triesLeft = pm.variables.get('retriesLeft');", - " if (triesLeft > 1) {", - " triesLeft -= 1;", - " pm.variables.set('retriesLeft', triesLeft);", - " console.log(`503 - Will Retry ${triesLeft} more times`);", - " postman.setNextRequest(pm.info.requestName);", - " } else {", - " pm.expect.fail('Max retries reached');", - " }", - "} else {", - " pm.variables.set('retrying', false);", - "}", - "" - ] - } - } - ], - "protocolProfileBehavior": {} -} \ No newline at end of file diff --git a/test/integration/bigip/collections/collections.js b/test/integration/bigip/collections/collections.js deleted file mode 100644 index b807528e..00000000 --- a/test/integration/bigip/collections/collections.js +++ /dev/null @@ -1,71 +0,0 @@ -/** - * Copyright 2023 F5 Networks, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -'use strict'; - -const fs = require('fs'); -const path = require('path'); - -const newmanUtils = require('../../../common/newman'); - -// Only run the tests in this list and in alwaysRunList -const runList = [ -]; - -// Always run the tests in this list even if not in runList -// Only used if runList is not empty -const alwaysRunList = [ - '_prepare.environment.collection' -]; - -// Skip these tests -// Only used if runList is empty -const skipList = [ - 'resumeSavedDeclaration.collection', - 'mutex.locking.collection' -]; - -describe('Collections', function () { - this.timeout('1000s'); - this.slow(180000); - - const testDir = __dirname; - const testFiles = fs.readdirSync(testDir) - .filter((fileName) => fileName.endsWith('.json')) - .map((fileName) => `${__dirname}/${fileName}`); - - testFiles.forEach((fileName) => { - const testName = path.basename(fileName, '.json'); - const collection = JSON.parse(fs.readFileSync(fileName)); - it(testName, function (done) { - if (runList.length > 0) { - if (!alwaysRunList.includes(testName) && !runList.includes(testName)) { - this.skip(); - } - } else if (skipList.includes(testName)) { - this.skip(); - } - setTimeout(() => { - const options = { - insecure: newmanUtils.DEFAULT_OPTIONS.insecure, - delayRequest: newmanUtils.DEFAULT_OPTIONS.delayRequest, - timeout: newmanUtils.DEFAULT_OPTIONS.timeout - }; - newmanUtils.runNewman(collection, options, done); - }, 2000); - }); - }); -}); diff --git a/test/integration/bigip/collections/fqdn.collection.json b/test/integration/bigip/collections/fqdn.collection.json deleted file mode 100644 index 9417cedb..00000000 --- a/test/integration/bigip/collections/fqdn.collection.json +++ /dev/null @@ -1,403 +0,0 @@ -{ - "info": { - "_postman_id": "2cc5f887-c279-4b1b-b3e8-be3cb1f1284e", - "name": "FqdnTesting", - "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" - }, - "item": [ - { - "name": "Delete all Tenants", - "event": [ - { - "listen": "test", - "script": { - "id": "0a04a88c-5bf6-4791-9428-ed6a390249f8", - "exec": [ - "let utils = eval(pm.globals.get('utils'))();", - "pm = utils.utils.getPM();", - "", - "pm.test(\"Status code is 200\", function () {", - " pm.response.to.have.status(200);", - "});", - "", - "pm.test(\"Status code for each tenant is 200\", function () {", - " var jsonData = pm.response.json();", - " jsonData.results.forEach((r) => pm.expect(r.code).to.eql(200));", - "});" - ], - "type": "text/javascript" - } - } - ], - "request": { - "auth": { - "type": "basic", - "basic": [ - { - "key": "password", - "value": "{{password}}", - "type": "string" - }, - { - "key": "username", - "value": "{{username}}", - "type": "string" - } - ] - }, - "method": "DELETE", - "header": [], - "body": { - "mode": "raw", - "raw": "" - }, - "url": { - "raw": "https://{{host}}/mgmt/shared/appsvcs/declare", - "protocol": "https", - "host": [ - "{{host}}" - ], - "path": [ - "mgmt", - "shared", - "appsvcs", - "declare" - ] - } - }, - "response": [] - }, - { - "name": "Create Tenant with FQDN Pool", - "event": [ - { - "listen": "test", - "script": { - "id": "521770a8-c9ac-4d1b-92cb-3cdef7f8c93e", - "exec": [ - "let utils = eval(pm.globals.get('utils'))();", - "pm = utils.utils.getPM();", - "", - "pm.test(\"Status code is 200\", function () {", - " pm.response.to.have.status(200);", - "});", - "", - "pm.test(\"Status code for each tenant is 200\", function () {", - " var jsonData = pm.response.json();", - " jsonData.results.forEach((r) => pm.expect(r.code).to.eql(200));", - "});" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json" - } - ], - "body": { - "mode": "raw", - "raw": "{\r\n \"class\": \"ADC\",\r\n \"schemaVersion\": \"3.0.0\",\r\n \"id\": \"urn:uuid:2c54d445-d98b-424e-8818-d291acda5980\",\r\n \"label\": \"FQDN Test\",\r\n \"remark\": \"HTTP with service-discovery pool members and iRule\",\r\n \"FQDN_Test\": {\r\n \"class\": \"Tenant\",\r\n \"A1\": {\r\n \"class\": \"Application\",\r\n \"template\": \"http\",\r\n \"serviceMain\": {\r\n \"class\": \"Service_HTTP\",\r\n \"virtualAddresses\": [\r\n \"198.19.192.230\"\r\n ],\r\n \"pool\": \"fqdn_pool\"\r\n },\r\n \"fqdn_pool\": {\r\n \"class\": \"Pool\",\r\n \"monitors\": [\r\n \"http\"\r\n ],\r\n \"members\": [\r\n {\r\n \"servicePort\": 80,\r\n \"addressDiscovery\": \"fqdn\",\r\n \"autoPopulate\": true,\r\n \"hostname\": \"test.fqdn\",\r\n \"addressFamily\": \"IPv4\",\r\n \"queryInterval\": 10,\r\n \"downInterval\": 2\r\n },\r\n {\r\n \"servicePort\": 123,\r\n \"addressDiscovery\": \"fqdn\",\r\n \"autoPopulate\": false,\r\n \"hostname\": \"test.fqdn.second\",\r\n \"addressFamily\": \"IPv4\",\r\n \"queryInterval\": 10,\r\n \"downInterval\": 2\r\n }\r\n ]\r\n }\r\n }\r\n }\r\n}\r\n" - }, - "url": { - "raw": "https://{{host}}/mgmt/shared/appsvcs/declare", - "protocol": "https", - "host": [ - "{{host}}" - ], - "path": [ - "mgmt", - "shared", - "appsvcs", - "declare" - ] - } - }, - "response": [] - }, - { - "name": "Check for Pool", - "event": [ - { - "listen": "test", - "script": { - "id": "a7d81ca9-bd02-4c8f-9db4-8bfeb07763a8", - "exec": [ - "let utils = eval(pm.globals.get('utils'))();", - "pm = utils.utils.getPM();", - "", - "pm.test(\"Check reponse\", function () {", - " pm.test(\"Status code is 200\", function () {", - " pm.response.to.have.status(200);", - " });", - "});" - ], - "type": "text/javascript" - } - } - ], - "protocolProfileBehavior": { - "disableBodyPruning": true - }, - "request": { - "method": "GET", - "header": [], - "body": { - "mode": "raw", - "raw": "" - }, - "url": { - "raw": "https://{{host}}/mgmt/tm/ltm/pool/~FQDN_Test~A1~fqdn_pool", - "protocol": "https", - "host": [ - "{{host}}" - ], - "path": [ - "mgmt", - "tm", - "ltm", - "pool", - "~FQDN_Test~A1~fqdn_pool" - ] - } - }, - "response": [] - }, - { - "name": "Check First Pool Member", - "event": [ - { - "listen": "test", - "script": { - "id": "2686862f-e772-44ea-b33d-58e4161298b0", - "exec": [ - "let utils = eval(pm.globals.get('utils'))();", - "pm = utils.utils.getPM();", - "", - "pm.test(\"Check reponse\", function () {", - " pm.test(\"Status code is 200\", function () {", - " pm.response.to.have.status(200);", - " });", - " ", - " const jsonData = pm.response.json();", - " pm.test(\"Node \\\"test.fqdn\\\" has an autopopulate of enabled\", function () {", - " pm.expect(jsonData.fqdn.autopopulate).to.equal(\"enabled\");", - " });", - "});" - ], - "type": "text/javascript" - } - } - ], - "protocolProfileBehavior": { - "disableBodyPruning": true - }, - "request": { - "method": "GET", - "header": [], - "body": { - "mode": "raw", - "raw": "" - }, - "url": { - "raw": "https://{{host}}/mgmt/tm/ltm/node/~FQDN_Test~test.fqdn", - "protocol": "https", - "host": [ - "{{host}}" - ], - "path": [ - "mgmt", - "tm", - "ltm", - "node", - "~FQDN_Test~test.fqdn" - ] - } - }, - "response": [] - }, - { - "name": "Check Second Pool Member", - "event": [ - { - "listen": "test", - "script": { - "id": "d1b59e24-b4a5-4adb-ab0a-cb579b86787e", - "exec": [ - "let utils = eval(pm.globals.get('utils'))();", - "pm = utils.utils.getPM();", - "", - "pm.test(\"Check reponse\", function () {", - " pm.test(\"Status code is 200\", function () {", - " pm.response.to.have.status(200);", - " });", - " ", - " const jsonData = pm.response.json();", - " pm.test(\"Node \\\"test.fqdn.second\\\" has an autopopulate of disabled\", function () {", - " pm.expect(jsonData.fqdn.autopopulate).to.equal(\"disabled\");", - " });", - "});" - ], - "type": "text/javascript" - } - } - ], - "protocolProfileBehavior": { - "disableBodyPruning": true - }, - "request": { - "method": "GET", - "header": [], - "body": { - "mode": "raw", - "raw": "" - }, - "url": { - "raw": "https://{{host}}/mgmt/tm/ltm/node/~FQDN_Test~test.fqdn.second", - "protocol": "https", - "host": [ - "{{host}}" - ], - "path": [ - "mgmt", - "tm", - "ltm", - "node", - "~FQDN_Test~test.fqdn.second" - ] - } - }, - "response": [] - }, - { - "name": "Delete all Tenants", - "event": [ - { - "listen": "test", - "script": { - "id": "0c183e76-7d5d-48a8-a0cc-765e976fb48b", - "exec": [ - "let utils = eval(pm.globals.get('utils'))();", - "pm = utils.utils.getPM();", - "", - "pm.test(\"Status code is 200\", function () {", - " pm.response.to.have.status(200);", - "});", - "", - "pm.test(\"Status code for each tenant is 200\", function () {", - " var jsonData = pm.response.json();", - " jsonData.results.forEach((r) => pm.expect(r.code).to.eql(200));", - "});" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "DELETE", - "header": [], - "body": { - "mode": "raw", - "raw": "" - }, - "url": { - "raw": "https://{{host}}/mgmt/shared/appsvcs/declare", - "protocol": "https", - "host": [ - "{{host}}" - ], - "path": [ - "mgmt", - "shared", - "appsvcs", - "declare" - ] - } - }, - "response": [] - } - ], - "auth": { - "type": "basic", - "basic": [ - { - "key": "password", - "value": "{{password}}", - "type": "string" - }, - { - "key": "username", - "value": "{{username}}", - "type": "string" - } - ] - }, - "event": [ - { - "listen": "prerequest", - "script": { - "id": "e4ef20bd-30a1-4ffc-bb56-cd9ed8276cf0", - "type": "text/javascript", - "exec": [ - "pm.variables.set('retryCodes', [503]);", - "", - "const isRetrying = pm.variables.get('retrying');", - "", - "// If we are not currently retrying, reset number of retries", - "if (!isRetrying) {", - " pm.variables.set('retriesLeft', 10);", - "}", - "", - "postman.setGlobalVariable('utils', () => {", - " const isRetrying = pm.variables.get('retrying');", - " const pmProxy = {", - " get: function(pm, key) {", - " if (key == 'test') {", - " return (isRetrying ? pm.test.skip : pm.test);", - " }", - " return pm[key];", - " }", - " };", - " const getPM = () => {", - " return new Proxy(pm, pmProxy);", - " }", - " return {", - " utils: {", - " getPM", - " }", - " };", - "});" - ] - } - }, - { - "listen": "test", - "script": { - "id": "6bf5ff8e-ee23-4158-9deb-5c54df2c7768", - "type": "text/javascript", - "exec": [ - "if (pm.variables.get('retryCodes').includes(pm.response.code)) {", - " pm.variables.set('retrying', true);", - " let triesLeft = pm.variables.get('retriesLeft');", - " if (triesLeft > 1) {", - " triesLeft -= 1;", - " pm.variables.set('retriesLeft', triesLeft);", - " console.log(`503 - Will Retry ${triesLeft} more times`);", - " postman.setNextRequest(pm.info.requestName);", - " } else {", - " pm.expect.fail('Max retries reached');", - " }", - "} else {", - " pm.variables.set('retrying', false);", - "}", - "" - ] - } - } - ], - "protocolProfileBehavior": {} -} \ No newline at end of file diff --git a/test/integration/bigip/misc/addressPortList.js b/test/integration/bigip/misc/addressPortList.js new file mode 100644 index 00000000..a3d17309 --- /dev/null +++ b/test/integration/bigip/misc/addressPortList.js @@ -0,0 +1,163 @@ +/** + * Copyright 2023 F5 Networks, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +const chai = require('chai'); +const chaiAsPromised = require('chai-as-promised'); + +chai.use(chaiAsPromised); +const assert = chai.assert; + +const util = require('../../../../src/lib/util/util'); + +const { + postDeclaration, + deleteDeclaration, + getPath, + assertModuleProvisioned, + getBigIpVersion, + GLOBAL_TIMEOUT +} = require('../property/propertiesCommon'); + +describe('address and port lists', function () { + this.timeout(GLOBAL_TIMEOUT); + + beforeEach('provision check and clean up', function () { + if (util.versionLessThan(getBigIpVersion(), '14.1')) { + this.skip(); + } + + assertModuleProvisioned.call(this, 'afm'); + return deleteDeclaration(); + }); + + after('clean up', function () { + return deleteDeclaration(); + }); + + it('should create traffic matching criteria for address and port lists', () => { + const decl = { + class: 'ADC', + schemaVersion: '3.45.0', + controls: { + class: 'Controls', + trace: true, + traceResponse: true, + logLevel: 'debug' + }, + TEST_Port_List: { + class: 'Tenant', + Application: { + class: 'Application', + sourceAddressList: { + class: 'Firewall_Address_List', + addresses: [ + '192.168.100.0/24', + '192.168.200.50-192.168.200.60' + ] + }, + destinationAddressList1: { + class: 'Firewall_Address_List', + addresses: [ + '192.168.40.0/24', + '192.168.50.1-192.168.50.10' + ] + }, + destinationAddressList2: { + class: 'Firewall_Address_List', + addresses: [ + '192.168.60.0/24' + ] + }, + destinationAddressList3: { + class: 'Firewall_Address_List', + addresses: [ + '192.168.10.0/24', + '192.168.20.20-192.168.20.50' + ], + addressLists: [ + { use: 'destinationAddressList1' }, + { use: 'destinationAddressList2' } + ] + }, + firewallPortList: { + class: 'Firewall_Port_List', + ports: [ + 8080, + '1-999' + ] + }, + tcpService: { + class: 'Service_TCP', + sourceAddress: { + use: 'sourceAddressList' + }, + virtualAddresses: { + use: 'destinationAddressList3' + }, + virtualPort: { + use: 'firewallPortList' + } + } + } + } + + }; + + return Promise.resolve() + .then(() => assert.isFulfilled( + postDeclaration(decl, { declarationIndex: 0 }) + )) + .then((response) => { + assert.strictEqual(response.results[0].code, 200); + }) + .then(() => getPath('/mgmt/tm/ltm/trafficMatchingCriteria')) + .then((response) => { + assert.strictEqual(response.items[0].fullPath, '/TEST_Port_List/Application/tcpService_VS_TMC_OBJ'); + assert.strictEqual(response.items[0].destinationAddressList, '/TEST_Port_List/Application/destinationAddressList3'); + assert.strictEqual(response.items[0].destinationPortList, '/TEST_Port_List/Application/firewallPortList'); + assert.strictEqual(response.items[0].destinationAddressInline, '0.0.0.0'); + assert.strictEqual(response.items[0].destinationPortInline, '0'); + }) + .then(() => getPath('/mgmt/tm/security/firewall/portList')) + .then((response) => { + const portList = response.items.find((item) => item.fullPath === '/TEST_Port_List/Application/firewallPortList'); + assert.ok(portList); + assert.deepStrictEqual( + portList.ports, + [ + { + name: '1-999' + }, + { + name: '8080' + } + ] + ); + }) + .then(() => getPath('/mgmt/tm/ltm/virtual')) + .then((response) => { + assert.strictEqual(response.items[0].fullPath, '/TEST_Port_List/Application/tcpService'); + assert.strictEqual(response.items[0].trafficMatchingCriteria, '/TEST_Port_List/Application/tcpService_VS_TMC_OBJ'); + }) + .then(() => postDeclaration(decl, { declarationIndex: 1 })) + .then((response) => { + assert.strictEqual(response.results[0].code, 200); + assert.strictEqual(response.results[0].message, 'no change'); + }); + }); +}); diff --git a/test/integration/bigip/misc/api.js b/test/integration/bigip/misc/api.js index f1ca70ad..e079eb79 100644 --- a/test/integration/bigip/misc/api.js +++ b/test/integration/bigip/misc/api.js @@ -548,7 +548,7 @@ describe('per-app API testing (__smoke)', function () { } }; - return postDeclaration(declaration); + return postDeclaration(declaration, logInfo); }); after(() => deleteDeclaration()); // No sense deleting the declaration till after the GETs are done querying it @@ -638,4 +638,368 @@ describe('per-app API testing (__smoke)', function () { 'should have failed with an invalid path, as application is an unsupported endpoint' ))); }); + + describe('POST', () => { + afterEach(() => deleteDeclaration()); + + it('should handle creating a tenant via POSTing to the applications endpoint', () => { + const declaration = { + app1: { + class: 'Application', + template: 'generic', + testItem: { + class: 'Service_TCP', + remark: 'description', + virtualPort: 123, + virtualAddresses: [ + '1.1.1.12' + ], + persistenceMethods: [ + 'source-address' + ] + } + } + }; + + return Promise.resolve() + .then(() => postDeclaration(declaration, { declarationIndex: 0 }, undefined, '/mgmt/shared/appsvcs/declare/tenant1/applications')) + .then((results) => { // Confirm results + assert.strictEqual(typeof results.results[0].lineCount, 'number'); + assert.strictEqual(typeof results.results[0].runTime, 'number'); + delete results.results[0].lineCount; + delete results.results[0].runTime; + assert.deepStrictEqual( + results.results, + [ + { + code: 200, + message: 'success', + host: 'localhost', + tenant: 'tenant1' + } + ] + ); + }) + .then(() => postDeclaration(declaration, { declarationIndex: 1 }, undefined, '/mgmt/shared/appsvcs/declare/tenant1/applications')) + .then((results) => { // Confirm results + assert.strictEqual(typeof results.results[0].runTime, 'number'); + delete results.results[0].runTime; + assert.deepStrictEqual( + results.results, + [ + { + code: 200, + message: 'no change', + host: 'localhost', + tenant: 'tenant1' + } + ] + ); + }) + .then(() => { + const options = { + path: '/mgmt/shared/appsvcs/declare/tenant1/applications/app1?async=true', + logResponse: true, + sendDelete: true + }; + return deleteDeclaration(undefined, options); + }) // DELETE specific application + .then((results) => { // Confirm no change + assert.strictEqual(typeof results.results[0].lineCount, 'number'); + assert.strictEqual(typeof results.results[0].runTime, 'number'); + delete results.results[0].lineCount; + delete results.results[0].runTime; + assert.deepStrictEqual( + results.results, + [ + { + code: 200, + message: 'success', + host: 'localhost', + tenant: 'tenant1' + } + ] + ); + }) + .then(() => assert.isFulfilled( + getPath('/mgmt/shared/appsvcs/declare/tenant1/applications/app1') + )) + .then((results) => { + // TODO: This should be a 404, but until data-groups are handled this is a little messed up + assert.deepStrictEqual(results, { + app1: { + class: 'Application', + template: 'generic', + testItem: { + class: 'Service_TCP', + remark: 'description', + virtualPort: 123, + virtualAddresses: [ + '1.1.1.12' + ], + persistenceMethods: [ + 'source-address' + ] + } + } + }); + }) + .then(() => assert.isFulfilled( + getPath('/mgmt/shared/appsvcs/declare/tenant1/applications') + )) + .then((results) => { + // TODO: This should be a 404, but until data-groups are handled this is a little messed up + assert.deepStrictEqual(results, { + app1: { + class: 'Application', + template: 'generic', + testItem: { + class: 'Service_TCP', + remark: 'description', + virtualPort: 123, + virtualAddresses: [ + '1.1.1.12' + ], + persistenceMethods: [ + 'source-address' + ] + } + } + }); + }); + }); + + it('should NOT modify applications outside the declaration', () => { + const perTenDecl = { + class: 'ADC', + schemaVersion: '3.44.0', + id: 'per-app_pools', + tenant1: { + class: 'Tenant', + app1: { + class: 'Application', + template: 'generic', + testItem: { + class: 'Service_TCP', + remark: 'description', + virtualPort: 123, + virtualAddresses: [ + '1.1.1.12' + ], + persistenceMethods: [ + 'source-address' + ] + } + }, + app2: { + class: 'Application', + template: 'generic', + pool1: { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 11 + } + } + } + }; + + const app1Decl = { + app1: { + class: 'Application', + template: 'generic', + service: { + class: 'Service_HTTP', + virtualAddresses: ['192.0.2.10'], + pool: 'pool1' + }, + pool1: { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 11 + } + } + }; + + const app2Decl = { + app2: { + class: 'Application', + template: 'generic', + pool1: { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 11 + } + } + }; + + return Promise.resolve() + .then(() => postDeclaration(perTenDecl, { declarationIndex: 0 })) + .then((results) => { + assert.strictEqual(typeof results.results[0].lineCount, 'number'); + assert.strictEqual(typeof results.results[0].runTime, 'number'); + delete results.results[0].lineCount; + delete results.results[0].runTime; + assert.deepStrictEqual( + results.results, + [ + { + code: 200, + message: 'success', + host: 'localhost', + tenant: 'tenant1' + } + ] + ); + }) + .then(() => assert.isFulfilled( + getPath('/mgmt/shared/appsvcs/declare') + )) + .then((results) => { + assert.deepStrictEqual( + results.tenant1, + { + class: 'Tenant', + app1: { + class: 'Application', + template: 'generic', + testItem: { + class: 'Service_TCP', + remark: 'description', + virtualPort: 123, + virtualAddresses: [ + '1.1.1.12' + ], + persistenceMethods: [ + 'source-address' + ] + } + }, + app2: { + class: 'Application', + template: 'generic', + pool1: { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 11 + } + } + } + ); + }) + .then(() => postDeclaration(app1Decl, { declarationIndex: 1 }, undefined, '/mgmt/shared/appsvcs/declare/tenant1/applications')) + .then((results) => { // Confirm results + assert.strictEqual(typeof results.results[0].lineCount, 'number'); + assert.strictEqual(typeof results.results[0].runTime, 'number'); + delete results.results[0].lineCount; + delete results.results[0].runTime; + assert.deepStrictEqual( + results.results, + [ + { + code: 200, + message: 'success', + host: 'localhost', + tenant: 'tenant1' + } + ] + ); + }) + .then(() => postDeclaration(app1Decl, { declarationIndex: 2 }, undefined, '/mgmt/shared/appsvcs/declare/tenant1/applications')) + .then((results) => { // Confirm results + assert.strictEqual(typeof results.results[0].runTime, 'number'); + delete results.results[0].runTime; + assert.deepStrictEqual( + results.results, + [ + { + code: 200, + message: 'no change', + host: 'localhost', + tenant: 'tenant1' + } + ] + ); + }) + .then(() => assert.isFulfilled( + getPath('/mgmt/shared/appsvcs/declare') + )) + .then((results) => { + assert.deepStrictEqual( + results.tenant1, + { + class: 'Tenant', + app1: { + class: 'Application', + template: 'generic', + service: { + class: 'Service_HTTP', + virtualAddresses: ['192.0.2.10'], + pool: 'pool1' + }, + pool1: { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 11 + } + } // NOTE: after data-groups are fixed we should see app2 + } + ); + }) + .then(() => postDeclaration(app2Decl, { declarationIndex: 3 }, undefined, '/mgmt/shared/appsvcs/declare/tenant1/applications')) + .then((results) => { // Confirm results + assert.strictEqual(typeof results.results[0].runTime, 'number'); + delete results.results[0].runTime; + assert.deepStrictEqual( + results.results, + [ + { + code: 200, + message: 'no change', + host: 'localhost', + tenant: 'tenant1' + } + ] + ); + }) + .then(() => { + const options = { + path: '/mgmt/shared/appsvcs/declare/tenant1?async=true', + logResponse: true + }; + return deleteDeclaration(undefined, options); + }) + .then((results) => { // Confirm results + assert.strictEqual(typeof results.results[0].lineCount, 'number'); + assert.strictEqual(typeof results.results[0].runTime, 'number'); + delete results.results[0].lineCount; + delete results.results[0].runTime; + assert.deepStrictEqual( + results.results, + [ + { + code: 200, + message: 'success', + host: 'localhost', + tenant: 'tenant1' + } + ] + ); + }); + }); + }); }); diff --git a/test/integration/bigip/misc/ignoreChanges.js b/test/integration/bigip/misc/ignoreChanges.js index 3d59892e..fc3d35a5 100644 --- a/test/integration/bigip/misc/ignoreChanges.js +++ b/test/integration/bigip/misc/ignoreChanges.js @@ -166,7 +166,7 @@ describe('ignoreChanges', function () { assert.strictEqual(response.results[0].tenant, 'Common'); assert.strictEqual(response.results[1].tenant, 'Common'); - decl.declaration.Common.Shared.testDatagroup.externalFilePath = 'https://test@raw.githubusercontent.com/F5Networks/f5-appsvcs-extension/master/schema/latest/as3-schema.json'; + decl.declaration.Common.Shared.testDatagroup.externalFilePath = 'https://test@raw.githubusercontent.com/F5Networks/f5-appsvcs-extension/main/schema/latest/as3-schema.json'; return postDeclaration(decl, { declarationIndex: 2 }); }) .then((response) => { @@ -249,7 +249,7 @@ describe('ignoreChanges', function () { assert.strictEqual(response.results[0].tenant, 'Common'); assert.strictEqual(response.results[1].tenant, 'Common'); - decl.declaration.Common.Shared.testDatagroup.externalFilePath = 'https://test@raw.githubusercontent.com/F5Networks/f5-appsvcs-extension/master/schema/latest/as3-schema.json'; + decl.declaration.Common.Shared.testDatagroup.externalFilePath = 'https://test@raw.githubusercontent.com/F5Networks/f5-appsvcs-extension/main/schema/latest/as3-schema.json'; return postDeclaration(decl, { declarationIndex: 2 }); }) .then((response) => { diff --git a/test/integration/bigip/property/propertiesCommon.js b/test/integration/bigip/property/propertiesCommon.js index 21b75de0..efc40587 100644 --- a/test/integration/bigip/property/propertiesCommon.js +++ b/test/integration/bigip/property/propertiesCommon.js @@ -20,11 +20,11 @@ const assert = require('assert'); const fs = require('fs'); const promiseUtil = require('@f5devcentral/atg-shared-utilities').promiseUtils; +const arrayUtil = require('@f5devcentral/atg-shared-utilities').arrayUtils; const classMap = require('../../../../src/lib/classes'); const pathMap = require('../../../../src/lib/paths.json'); const propertyMap = require('../../../../src/lib/properties.json'); const util = require('../../../../src/lib/util/util'); -const arrayUtil = require('../../../../src/lib/util/arrayUtil'); const schema = require('../../../../src/schema/latest/adc-schema.json'); const constants = require('../../../../src/lib/constants'); const requestUtil = require('../../../common/requestUtilPromise'); @@ -674,19 +674,25 @@ function postBigipItems(items, useTransaction) { * @param {string} tenant - the name of the tenant you want deleted (DO NOT INCLUDE THE FORWARD SLASH) * @param {object} [options] - options for function * @param {boolean} [options.logResponse] - whether or not to log the response from the delete operation + * @param {boolean} [options.sendDelete] - whether or not to send request as a DELETE or POST */ function deleteDeclaration(tenant, options) { logEvent('delete Declaration'); + let requestPromise; + let path = '/mgmt/shared/appsvcs/declare?async=true'; + if (tenant) { + path = `/mgmt/shared/appsvcs/declare/${tenant}?async=true`; + } else if (options && options.path) { + path = options.path; + } const reqOpts = { - path: '/mgmt/shared/appsvcs/declare?async=true', + path, host: process.env.TARGET_HOST || process.env.AS3_HOST, retryCount: 3, retryIf: (error, response) => response && response.statusCode === 503 }; - let requestPromise; - if (tenant) { - reqOpts.path = `/mgmt/shared/appsvcs/declare/${tenant}?async=true`; + if (tenant || (options && options.sendDelete)) { requestPromise = requestUtil.delete(reqOpts); } else { reqOpts.body = { diff --git a/test/integration/bigip/property/propertiesEndpointPolicy.js b/test/integration/bigip/property/propertiesEndpointPolicy.js index 1e037ff2..daf64385 100644 --- a/test/integration/bigip/property/propertiesEndpointPolicy.js +++ b/test/integration/bigip/property/propertiesEndpointPolicy.js @@ -19,6 +19,7 @@ const { assertClass, extractPolicy, + extractProfile, assertModuleProvisioned, getBigIpVersion, GLOBAL_TIMEOUT @@ -807,6 +808,55 @@ describe('Endpoint_Policy', function () { return assertClass('Endpoint_Policy', properties); }); + it('BotDefense Action', function () { + if (util.versionLessThan(getBigIpVersion(), '14.0')) { + this.skip(); + } + assertModuleProvisioned.call(this, 'asm'); + + const properties = [ + { + name: 'policyEndpoint', + inputValue: ['endpointPolicy'], + expectedValue: ['endpointPolicy'], + extractFunction: extractPolicy, + referenceObjects: { + endpointPolicy: { + class: 'Endpoint_Policy', + rules: [ + { + name: 'enableBotDefense', + conditions: [], + actions: [{ + type: 'botDefense', + profile: { bigip: '/Common/bot-defense' } + }] + }, + { + name: 'disableBotDefense', + conditions: [], + actions: [{ type: 'botDefense' }] + } + ] + } + } + }, + { + name: 'virtualAddresses', + inputValue: [['10.1.40.50']], + skipAssert: true + }, + { + name: 'profileBotDefense', + inputValue: [{ bigip: '/Common/bot-defense' }], + expectedValue: ['bot-defense'], + extractFunction: (virtual) => extractProfile(virtual, 'bot-defense') + } + ]; + + return assertClass('Service_HTTP', properties); + }); + it('WAF Action', function () { assertModuleProvisioned.call(this, 'asm'); diff --git a/test/integration/bigip/property/propertiesNetPortList.js b/test/integration/bigip/property/propertiesNetPortList.js new file mode 100644 index 00000000..b8dd3dad --- /dev/null +++ b/test/integration/bigip/property/propertiesNetPortList.js @@ -0,0 +1,78 @@ +/** + * Copyright 2023 F5 Networks, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +const { + assertClass, + getBigIpVersion, + GLOBAL_TIMEOUT +} = require('./propertiesCommon'); +const util = require('../../../../src/lib/util/util'); + +describe('Net_Port_List', function () { + this.timeout(GLOBAL_TIMEOUT); + + function assertNetPortListClass(properties, options) { + return assertClass('Net_Port_List', properties, options); + } + + it('All Properties', function () { + if (util.versionLessThan(getBigIpVersion(), '14.1')) { + this.skip(); + } + const properties = [ + { + name: 'remark', + inputValue: [undefined, 'description', undefined], + expectedValue: ['none', 'description', 'none'], + extractFunction: (o) => o.description || 'none' + }, + { + name: 'ports', + inputValue: [ + [8888], + [80, 443, '8080-8088'], + [8888] + ], + expectedValue: [ + [{ name: '8888' }], + [ + { name: '80' }, + { name: '443' }, + { name: '8080-8088' } + ], + [{ name: '8888' }] + ], + extractFunction: (o) => o.ports + }, + { + name: 'portLists', + inputValue: [undefined, [{ use: 'portList' }], undefined], + expectedValue: [undefined, 'portList', undefined], + extractFunction: (o) => ((o.portLists || [])[0] || {}).name, + referenceObjects: { + portList: { + class: 'Net_Port_List', + ports: ['1-999'] + } + } + } + ]; + + return assertNetPortListClass(properties); + }); +}); diff --git a/test/integration/bigip/property/propertiesPool.js b/test/integration/bigip/property/propertiesPool.js index 7101bcd7..269d04b2 100644 --- a/test/integration/bigip/property/propertiesPool.js +++ b/test/integration/bigip/property/propertiesPool.js @@ -60,8 +60,8 @@ describe('Pool', function () { }, { name: 'minimumMonitors', - inputValue: [undefined, 2, 'all'], - expectedValue: [undefined, '2', 'all'], + inputValue: [undefined, 2, 'all', 1], + expectedValue: [undefined, '2', 'all', undefined], extractFunction: (o) => { if (!o.monitor) { return undefined; @@ -74,11 +74,12 @@ describe('Pool', function () { }, { name: 'monitors', - inputValue: [undefined, ['https', 'http'], ['https', 'tcp', 'http']], + inputValue: [undefined, ['https', 'http'], ['https', 'tcp', 'http'], undefined], expectedValue: [ undefined, 'min 2 of { /Common/https /Common/http }', - '/Common/https and /Common/tcp and /Common/http' + '/Common/https and /Common/tcp and /Common/http', + undefined ], extractFunction: (o) => ((o.monitor) ? o.monitor.trim() : undefined) }, @@ -100,7 +101,16 @@ describe('Pool', function () { addressDiscovery: 'static', serverAddresses: ['2.2.2.2'], description: 'Test Description', - routeDomain: 1 + routeDomain: 1, + metadata: { + example: { + value: 'test' + }, + example1: { + value: '123', + persist: false + } + } } ], undefined @@ -121,9 +131,14 @@ describe('Pool', function () { logging: 'disabled', metadata: [ { - name: 'source', + name: 'example', persist: 'true', - value: 'declaration' + value: 'test' + }, + { + name: 'example1', + persist: 'false', + value: '123' } ], monitor: 'min 1 of { /Common/http }', @@ -148,6 +163,25 @@ describe('Pool', function () { return o.members; } }, + { + name: 'metadata', + inputValue: [ + undefined, + { + example: { value: 'test' }, + example1: { value: '123', persist: false } + }, + undefined + ], + expectedValue: [ + undefined, + [ + { name: 'example', persist: 'true', value: 'test' }, + { name: 'example1', persist: 'false', value: '123' } + ], + undefined + ] + }, { name: 'reselectTries', inputValue: [undefined, 10, undefined], @@ -641,14 +675,7 @@ describe('Pool', function () { rateLimit: 'disabled', ratio: 1, session: 'user-enabled', - state: 'unchecked', - metadata: [ - { - name: 'source', - persist: 'true', - value: 'declaration' - } - ] + state: 'unchecked' }, { name: '192.0.1.2:400', @@ -668,14 +695,7 @@ describe('Pool', function () { rateLimit: 'disabled', ratio: 1, session: 'user-enabled', - state: 'unchecked', - metadata: [ - { - name: 'source', - persist: 'true', - value: 'declaration' - } - ] + state: 'unchecked' }, { name: 'mynode1.example.com:400', @@ -695,14 +715,7 @@ describe('Pool', function () { rateLimit: 'disabled', ratio: 1, session: 'user-enabled', - state: 'unchecked', - metadata: [ - { - name: 'source', - persist: 'true', - value: 'declaration' - } - ] + state: 'unchecked' }, { name: 'mynode2.example.com:400', @@ -722,14 +735,7 @@ describe('Pool', function () { rateLimit: 'disabled', ratio: 1, session: 'user-enabled', - state: 'unchecked', - metadata: [ - { - name: 'source', - persist: 'true', - value: 'declaration' - } - ] + state: 'unchecked' } ], [] diff --git a/test/integration/bigip/property/propertiesSnatPool.js b/test/integration/bigip/property/propertiesSnatPool.js index 206e19e6..5308ff76 100644 --- a/test/integration/bigip/property/propertiesSnatPool.js +++ b/test/integration/bigip/property/propertiesSnatPool.js @@ -24,8 +24,8 @@ const { describe('SNAT_Pool', function () { this.timeout(GLOBAL_TIMEOUT); - function assertSnatPoolClass(properties) { - return assertClass('SNAT_Pool', properties); + function assertSnatPoolClass(properties, options) { + return assertClass('SNAT_Pool', properties, options); } function getAddresses(responseBody) { @@ -61,6 +61,15 @@ describe('SNAT_Pool', function () { 'fdf5:4153:3300::12' ]; + let commonSharedOptions; + + this.beforeEach(() => { + commonSharedOptions = { + tenantName: 'Common', + applicationName: 'Shared' + }; + }); + it('IPv4', () => { const properties = [ { @@ -73,6 +82,18 @@ describe('SNAT_Pool', function () { return assertSnatPoolClass(properties); }); + it('IPv4 in Common-Shared', () => { + const properties = [ + { + name: 'snatAddresses', + inputValue: [ipv4Addrs], + expectedValue: [ipv4Addrs], + extractFunction: getAddresses + } + ]; + return assertSnatPoolClass(properties, commonSharedOptions); + }); + it('IPv6', () => { const properties = [ { @@ -85,6 +106,18 @@ describe('SNAT_Pool', function () { return assertSnatPoolClass(properties); }); + it('IPv6 in Common-Shared', () => { + const properties = [ + { + name: 'snatAddresses', + inputValue: [ipv6Addrs], + expectedValue: [ipv6Addrs], + extractFunction: getAddresses + } + ]; + return assertSnatPoolClass(properties, commonSharedOptions); + }); + it('Mix address types', () => { const properties = [ { @@ -97,6 +130,18 @@ describe('SNAT_Pool', function () { return assertSnatPoolClass(properties); }); + it('Mix address types in Common-Shared', () => { + const properties = [ + { + name: 'snatAddresses', + inputValue: [mixAddrs], + expectedValue: [mixAddrs], + extractFunction: getAddresses + } + ]; + return assertSnatPoolClass(properties, commonSharedOptions); + }); + it('Update from IPv4 to mix', () => { const properties = [ { @@ -108,4 +153,16 @@ describe('SNAT_Pool', function () { ]; return assertSnatPoolClass(properties); }); + + it('Update from IPv4 to mix in Common-Shared', () => { + const properties = [ + { + name: 'snatAddresses', + inputValue: [ipv4Addrs, mixAddrs], + expectedValue: [ipv4Addrs, mixAddrs], + extractFunction: getAddresses + } + ]; + return assertSnatPoolClass(properties, commonSharedOptions); + }); }); diff --git a/test/integration/bigip/property/propertiesSnatTranslation.js b/test/integration/bigip/property/propertiesSnatTranslation.js index f46d8df5..d93d8a01 100644 --- a/test/integration/bigip/property/propertiesSnatTranslation.js +++ b/test/integration/bigip/property/propertiesSnatTranslation.js @@ -25,14 +25,72 @@ describe('SNAT_Translation', function () { this.timeout(GLOBAL_TIMEOUT); function assertSnatTranslationClass(properties, options) { - // SNAT_Translation is created at the Tenant level - options.mcpPath = '/TEST_SNAT_Translation/'; return assertClass('SNAT_Translation', properties, options); } it('All properties IPv4', () => { const options = { - mcpObjectName: '192.0.2.1' + mcpObjectName: '192.0.2.1', + // SNAT_Translation is created at the Tenant level + mcpPath: '/TEST_SNAT_Translation/' + }; + + const properties = [ + { + name: 'remark', + inputValue: [undefined, 'A SNAT Translation', undefined], + expectedValue: ['none', 'A SNAT Translation', 'none'], + extractFunction: (o) => o.description || 'none' + }, + { + // snat-translations have a fixed address + name: 'address', + inputValue: ['192.0.2.1'], + expectedValue: ['192.0.2.1'] + }, + { + name: 'adminState', + inputValue: [undefined, 'disable', undefined], + expectedValue: [true, false, true], + extractFunction: (o) => o.enabled === true + }, + { + name: 'ipIdleTimeout', + inputValue: [undefined, 1000, undefined], + expectedValue: ['indefinite', 1000, 'indefinite'] + }, + { + name: 'maxConnections', + inputValue: [undefined, 10000, undefined], + expectedValue: [0, 10000, 0] + }, + { + name: 'tcpIdleTimeout', + inputValue: [undefined, 2000, undefined], + expectedValue: ['indefinite', 2000, 'indefinite'] + }, + { + name: 'trafficGroup', + inputValue: [undefined, '/Common/traffic-group-local-only', undefined], + expectedValue: ['/Common/traffic-group-1', '/Common/traffic-group-local-only', '/Common/traffic-group-1'], + extractFunction: (o) => o.trafficGroup.fullPath + }, + { + name: 'udpIdleTimeout', + inputValue: [undefined, 3000, undefined], + expectedValue: ['indefinite', 3000, 'indefinite'] + } + ]; + return assertSnatTranslationClass(properties, options); + }); + + it('All properties IPv4 in Common-Shared', () => { + const options = { + mcpObjectName: '192.0.2.1', + // SNAT_Translation is created at the Tenant level + mcpPath: '/Common/', + tenantName: 'Common', + applicationName: 'Shared' }; const properties = [ @@ -86,7 +144,67 @@ describe('SNAT_Translation', function () { it('All properties IPv6', () => { const options = { - mcpObjectName: '2001:db8::1' + mcpObjectName: '2001:db8::1', + // SNAT_Translation is created at the Tenant level + mcpPath: '/TEST_SNAT_Translation/' + }; + + const properties = [ + { + name: 'remark', + inputValue: [undefined, 'A SNAT Translation', undefined], + expectedValue: ['none', 'A SNAT Translation', 'none'], + extractFunction: (o) => o.description || 'none' + }, + { + // snat-translations have a fixed address + name: 'address', + inputValue: ['2001:db8:0000:0000:0000:0000:0000:0001'], + expectedValue: ['2001:db8::1'] + }, + { + name: 'adminState', + inputValue: [undefined, 'disable', undefined], + expectedValue: [true, false, true], + extractFunction: (o) => o.enabled === true + }, + { + name: 'ipIdleTimeout', + inputValue: [undefined, 1000, undefined], + expectedValue: ['indefinite', 1000, 'indefinite'] + }, + { + name: 'maxConnections', + inputValue: [undefined, 10000, undefined], + expectedValue: [0, 10000, 0] + }, + { + name: 'tcpIdleTimeout', + inputValue: [undefined, 2000, undefined], + expectedValue: ['indefinite', 2000, 'indefinite'] + }, + { + name: 'trafficGroup', + inputValue: [undefined, '/Common/traffic-group-local-only', undefined], + expectedValue: ['/Common/traffic-group-1', '/Common/traffic-group-local-only', '/Common/traffic-group-1'], + extractFunction: (o) => o.trafficGroup.fullPath + }, + { + name: 'udpIdleTimeout', + inputValue: [undefined, 3000, undefined], + expectedValue: ['indefinite', 3000, 'indefinite'] + } + ]; + return assertSnatTranslationClass(properties, options); + }); + + it('All properties IPv6 in Common-Shared', () => { + const options = { + mcpObjectName: '2001:db8::1', + // SNAT_Translation is created at the Tenant level + mcpPath: '/Common/', + tenantName: 'Common', + applicationName: 'Shared' }; const properties = [ diff --git a/test/integration/bigip/property/propertiesSocksProfile.js b/test/integration/bigip/property/propertiesSocksProfile.js index fda22a0e..cae3e5a0 100644 --- a/test/integration/bigip/property/propertiesSocksProfile.js +++ b/test/integration/bigip/property/propertiesSocksProfile.js @@ -50,6 +50,10 @@ describe('SOCKS_Profile', function () { { endpoint: '/mgmt/tm/net/route-domain', data: { name: '2600' } + }, + { + endpoint: '/mgmt/tm/net/route-domain', + data: { name: 'id-2601', id: '2601' } } ] }; @@ -87,8 +91,8 @@ describe('SOCKS_Profile', function () { }, { name: 'routeDomain', - inputValue: [undefined, 2600, undefined], - expectedValue: ['/Common/0', '/Common/2600', '/Common/0'], + inputValue: [undefined, 2600, 'id-2601', undefined], + expectedValue: ['/Common/0', '/Common/2600', '/Common/id-2601', '/Common/0'], extractFunction: (o) => o.routeDomain.fullPath }, { diff --git a/test/integration/bigip/property/propertiesWAFPolicy.js b/test/integration/bigip/property/propertiesWAFPolicy.js index b02c5f46..e23366e6 100644 --- a/test/integration/bigip/property/propertiesWAFPolicy.js +++ b/test/integration/bigip/property/propertiesWAFPolicy.js @@ -432,4 +432,72 @@ describe('WAF Policy', function () { return assertClass('WAF_Policy', properties, assertOptions); }); }); + + it('should expand and fetch open API spec', function () { + assertModuleProvisioned.call(this, 'asm'); + + if (util.versionLessThan(getBigIpVersion(), '16.0') || process.env.TEST_IN_AZURE === 'true') { + this.skip(); + } + + const policy = { + policy: { + name: 'policy', + description: 'Test API', + template: { + name: 'POLICY_TEMPLATE_API_SECURITY' + }, + enforcementMode: 'blocking', + 'server-technologies': [ + { + serverTechnologyName: 'MySQL' + }, + { + serverTechnologyName: 'Unix/Linux' + }, + { + serverTechnologyName: 'MongoDB' + } + ], + 'signature-settings': { + signatureStaging: false + }, + 'policy-builder': { + learnOnlyFromNonBotTraffic: false + }, + 'open-api-files': [ + { + link: `https://${policyHost}/asm-policy/\`T\`_API.yaml` + } + ] + } + }; + + const properties = [ + { + name: 'policy', + inputValue: [ + { + base64: Buffer.from(JSON.stringify(policy)).toString('base64') + } + ], + expectedValue: [`/${tenantName}/Application/${getItemName({ tenantName, maxPathLength })}`], + extractFunction: (o) => o.fullPath + }, + { + name: 'expand', + inputValue: [ + ['/policy/open-api-files/0/link'] + ], + skipAssert: true + }, + { + name: 'ignoreChanges', + inputValue: [true], + skipAssert: true + } + ]; + + return assertClass('WAF_Policy', properties, assertOptions); + }); }); diff --git a/test/unit/app/app.js b/test/unit/app/app.js deleted file mode 100644 index 2e680f80..00000000 --- a/test/unit/app/app.js +++ /dev/null @@ -1,68 +0,0 @@ -/** - * Copyright 2023 F5 Networks, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -'use strict'; - -const assert = require('assert'); -const sinon = require('sinon'); -const proxyquire = require('proxyquire'); -const RestWorker = require('../../../src/nodejs/restWorker'); - -describe('app', function () { - this.timeout(10000); - let app; - let spyUse; - let spyGet; - let spyPost; - beforeEach(() => { - spyUse = sinon.spy(); - spyGet = sinon.spy(); - spyPost = sinon.spy(); - const expressMock = { - use: spyUse, - get: spyGet, - post: spyPost - }; - const stubExpress = sinon.stub().returns(expressMock); - app = proxyquire('../../../src/app/app.js', { - express: stubExpress - }); - }); - - afterEach(() => { - sinon.restore(); - }); - - it('should register routes if onStartCompleted succeeds', () => { - sinon.stub(RestWorker.prototype, 'onStartCompleted').callsArg(0); - app.start(); - assert.ok(spyGet.calledOnce); - assert.ok(spyPost.calledOnce); - }); - - it('should not setup routes if onStartCompleted fails', () => { - let loggedMessage; - sinon.stub(RestWorker.prototype, 'onStartCompleted').callsArg(1); - sinon.stub(console, 'log').callsFake((message) => { - loggedMessage = message; - }); - app.start(); - console.log.restore(); - assert.ok(spyGet.notCalled); - assert.ok(spyPost.notCalled); - assert.ok(loggedMessage.startsWith('Unable to start')); - }); -}); diff --git a/test/unit/app/restOperation.js b/test/unit/app/restOperation.js deleted file mode 100644 index 029b37a3..00000000 --- a/test/unit/app/restOperation.js +++ /dev/null @@ -1,92 +0,0 @@ -/** - * Copyright 2023 F5 Networks, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -'use strict'; - -const assert = require('assert'); -const RestOperation = require('../../../src/app/restOperation'); - -describe('restOperation', () => { - it('should return null for body when method is GET', () => { - const req = { - method: 'GET', - body: {} - }; - const restOperation = new RestOperation(req); - assert.strictEqual(restOperation.getBody(), null); - }); - - it('should return the body when method is not GET', () => { - const req = { - method: 'POST', - body: { - hello: 'world' - } - }; - const restOperation = new RestOperation(req); - assert.deepStrictEqual(restOperation.getBody(), { hello: 'world' }); - }); - - it('should lower case method names', () => { - const req = { - method: 'GET' - }; - const restOperation = new RestOperation(req); - assert.strictEqual(restOperation.method, 'Get'); - }); - - it('should return both path and pathname for uri property', () => { - const req = { - path: '/hello/world' - }; - const restOperation = new RestOperation(req); - assert.strictEqual(restOperation.uri.path, '/hello/world'); - assert.strictEqual(restOperation.uri.pathname, '/hello/world'); - }); - - it('should return both path and pathname for getUri method', () => { - const req = { - path: '/hello/world' - }; - const restOperation = new RestOperation(req); - assert.strictEqual(restOperation.getUri().path, '/hello/world'); - assert.strictEqual(restOperation.getUri().pathname, '/hello/world'); - }); - - it('should set response status', () => { - let statusCode; - const res = { - status(code) { - statusCode = code; - } - }; - const restOperation = new RestOperation(null, res); - restOperation.setStatusCode(200); - assert.strictEqual(statusCode, 200); - }); - - it('should set response body as json', () => { - let jsonBody; - const res = { - json(body) { - jsonBody = body; - } - }; - const restOperation = new RestOperation(null, res); - restOperation.setBody({ hello: 'world' }); - assert.deepStrictEqual(jsonBody, { hello: 'world' }); - }); -}); diff --git a/test/unit/examples.js b/test/unit/examples.js index bff56cf9..07e1b93c 100644 --- a/test/unit/examples.js +++ b/test/unit/examples.js @@ -57,6 +57,7 @@ describe('Examples', function () { sinon.stub(util, 'getNodelist').resolves([]); sinon.stub(util, 'getVirtualAddressList').resolves([]); sinon.stub(util, 'getAccessProfileList').resolves([]); + sinon.stub(util, 'getAddressListList').resolves([]); sinon.stub(util, 'isOneOfProvisioned').returns(true); sinon.stub(util, 'httpRequest').resolves(''); sinon.stub(util, 'versionLessThan').returns(false); diff --git a/test/unit/lib/adcParser.js b/test/unit/lib/adcParser.js index 63fe429d..d18113a1 100644 --- a/test/unit/lib/adcParser.js +++ b/test/unit/lib/adcParser.js @@ -33,6 +33,7 @@ const util = require('../../../src/lib/util/util'); const DEVICE_TYPES = require('../../../src/lib/constants').DEVICE_TYPES; const Context = require('../../../src/lib/context/context'); const Config = require('../../../src/lib/config'); +const PostProcessor = require('../../../src/lib/postProcessor'); const adcSchemaPath = `${__dirname}/../../../src/schema/latest/adc-schema.json`; const appSchemaPath = `${__dirname}/../../../src/schema/latest/app-schema.json`; @@ -46,6 +47,7 @@ describe('adcParser', function () { let logErrorSpy; let secretTagSpy; let context; + let postProcessSpy; before(() => theParser.loadSchemas([as3AdcSchema, as3AppSchema])); @@ -57,11 +59,13 @@ describe('adcParser', function () { sinon.stub(util, 'getNodelist').resolves([]); sinon.stub(util, 'getVirtualAddressList').resolves([]); sinon.stub(util, 'getAccessProfileList').resolves([]); + sinon.stub(util, 'getAddressListList').resolves([]); secretTagSpy = sinon.stub(Tag.SecretTag, 'process').resolves(); sinon.stub(Tag.LongSecretTag, 'process').resolves(); sinon.stub(Tag.FetchTag, 'process').resolves(); sinon.stub(Tag.BigComponentTag, 'process').resolves(); sinon.stub(Config, 'getAllSettings').resolves({ serviceDiscoveryEnabled: true }); + postProcessSpy = sinon.spy(PostProcessor, 'process'); }); afterEach(() => { @@ -240,10 +244,13 @@ describe('adcParser', function () { }); }); - it('should validate using the per app schema', () => { + it('should validate using the per app schema and skip PostProcessing', () => { context.request.isPerApp = true; + context.request.body = { + id: 'autogen_new-uuid-xxxx' + }; // This simulates the id added to the transformed declaration + const decl = { - id: 'id', app: { class: 'Application', service: { @@ -257,19 +264,23 @@ describe('adcParser', function () { } } }; - return parseDeclaration(decl) + const options = { + isPerApp: true + }; + + return parseDeclaration(decl, undefined, options) .then(() => { + assert.strictEqual(postProcessSpy.called, false); assert.deepStrictEqual( decl, { - id: 'id', app: { class: 'Application', service: { class: 'Service_HTTP', virtualAddresses: ['192.0.2.100'], virtualPort: 80, - pool: '/app/service/pool', + pool: 'pool', // Skipped PostProcessing persistenceMethods: ['cookie'], profileHTTP: 'basic', virtualType: 'standard', @@ -311,7 +322,11 @@ describe('adcParser', function () { it('should invalidate when using a per app declaration with the adc schema', () => { context.request.isPerApp = false; + context.request.body = { + id: 'autogen_new-uuid-xxxx' + }; // This simulates the id added to the transformed declaration const decl = { + id: 'test', // While id is not supported, this is added to simulate bad user input app: { class: 'Application', service: { @@ -325,11 +340,23 @@ describe('adcParser', function () { } } }; - return assert.isRejected(parseDeclaration(decl)); + return assert.isRejected(parseDeclaration(decl)) + .then(() => { + assert.deepStrictEqual(logWarningSpy.args[0][0], { + status: 422, + message: 'declaration is invalid', + errors: [ + '/app/service/virtualAddresses: should be object' + ] + }); + }); }); it('should invalidate when using the per app schema and an invalid property', () => { context.request.isPerApp = true; + context.request.body = { + id: 'autogen_new-uuid-xxxx' + }; // This simulates the id added to the transformed declaration const decl = { app: { class: 'Application', @@ -345,14 +372,29 @@ describe('adcParser', function () { } } }; - return assert.isRejected(parseDeclaration(decl)); + const options = { + isPerApp: true + }; + return assert.isRejected(parseDeclaration(decl, undefined, options)) + .then(() => { + assert.strictEqual(postProcessSpy.called, false); + assert.deepStrictEqual(logWarningSpy.args[0][0], { + status: 422, + message: 'declaration is invalid', + errors: [ + '/app/invalidProperty: should be object' + ] + }); + }); }); it('should invalidate when using a tenant declaration against the app schema', () => { context.request.isPerApp = true; + context.request.body = { + id: 'autogen_new-uuid-xxxx' + }; // This simulates the id added to the transformed declaration const decl = { class: 'ADC', - id: 'theId', schemaVersion: '3.45.0', tenant: { class: 'Tenant', @@ -370,12 +412,30 @@ describe('adcParser', function () { } } }; - return assert.isRejected(parseDeclaration(decl)); + const options = { + isPerApp: true + }; + return assert.isRejected(parseDeclaration(decl, undefined, options)) + .then(() => { + assert.strictEqual(logWarningSpy.called, true); + assert.deepStrictEqual(logWarningSpy.args[0][0], { + errors: [ + '/class: should be object' + ], + message: 'declaration is invalid', + status: 422 + }); + assert.strictEqual(postProcessSpy.called, false); + }); }); it('should invalidate when using a per-app declaration against the adc schema', () => { context.request.isPerApp = false; + context.request.body = { + id: 'autogen_new-uuid-xxxx' + }; // This simulates the id added to the transformed declaration const decl = { + id: 'test', // While id is not supported, this is added to simulate bad user input app: { class: 'Application', service: { @@ -389,7 +449,14 @@ describe('adcParser', function () { } } }; - return assert.isRejected(parseDeclaration(decl)); + return assert.isRejected(parseDeclaration(decl)) + .then(() => { + assert.deepStrictEqual(logWarningSpy.args[0][0], { + status: 422, + message: 'declaration is invalid', + errors: ['/app/service/virtualAddresses: should be object'] + }); + }); }); }); diff --git a/test/unit/lib/as3request.js b/test/unit/lib/as3request.js index 9ccb6494..e994ac0b 100644 --- a/test/unit/lib/as3request.js +++ b/test/unit/lib/as3request.js @@ -585,36 +585,6 @@ describe('as3request', function () { }); describe('.validateAndWrap', () => { - it('should validate and wrap per-app requests', () => { - const requestContext = { - isPerApp: true, - pathName: 'declare', - body: { - myApplication: { - class: 'Application' - } - } - }; - const results = as3Request.validateAndWrap(requestContext, {}); - assert.strictEqual(results.error, undefined); - assert.strictEqual(results.request[0].class, 'AS3'); - assert.strictEqual(results.request[0].action, 'deploy'); - }); - - it('should error if request is not per-app and is missing AS3 class', () => { - const requestContext = { - isPerApp: false, - pathName: 'declare', - body: { - myApplication: { - class: 'Application' - } - } - }; - const results = as3Request.validateAndWrap(requestContext, {}); - assert.notStrictEqual(results.error.indexOf('"missingProperty":"class"'), -1); - }); - it('should error if requestContext is not provided', () => { assert.throws( () => as3Request.validateAndWrap(undefined, {}), diff --git a/test/unit/lib/audit.js b/test/unit/lib/audit.js index e604d29d..b9d949a6 100644 --- a/test/unit/lib/audit.js +++ b/test/unit/lib/audit.js @@ -634,5 +634,61 @@ describe('audit', () => { }); }); }); + + describe('per-app mode', () => { + it('should handle per-app declaration when unchecked mode is disabled', () => { + context.log = {}; + context.control = {}; + context.tasks.push({ unchecked: false }); + context.target.deviceType = DEVICE_TYPES.BIG_IP; + context.host.parser = { + digest: sinon.stub() + }; + declaration.tenant.controls.traceResponse = true; + + return audit.auditTenant(context, 'tenant', declaration, {}, {}) + .then(() => { + assert.deepStrictEqual(context.log.tenantDesired, { desired: {} }); + assert.deepStrictEqual(context.log.tenantCurrent, { current: {} }); + assert.deepStrictEqual(context.log.tenantDiff, { diff: {} }); + }); + }); + + it('should handle per-app declaration when unchecked mode is enabled', () => { + context.log = {}; + context.control = {}; + context.tasks.push({ unchecked: true }); + context.target.deviceType = DEVICE_TYPES.BIG_IP; + context.host.parser = { + digest: sinon.stub() + }; + declaration.tenant.controls.traceResponse = true; + + return audit.auditTenant(context, 'tenant', declaration, {}, {}) + .then(() => { + assert.deepStrictEqual(context.log.tenantDesired, { desired: {} }); + assert.deepStrictEqual(context.log.tenantCurrent, { desired: {} }); + assert.deepStrictEqual(context.log.tenantDiff, { diff: {} }); + }); + }); + + it('should digest previous declaration when unchecked mode enabled', () => { + let prevDecl; + context.log = {}; + context.control = {}; + context.tasks.push({ unchecked: true }); + context.target.deviceType = DEVICE_TYPES.BIG_IP; + context.host.parser = { + digest: sinon.stub().callsFake((ctx, decl) => { + prevDecl = decl; + }) + }; + + return audit.auditTenant(context, 'tenant', declaration, {}, { prevDecl: true }) + .then(() => { + assert.deepStrictEqual(prevDecl, { prevDecl: true }); + }); + }); + }); }); }); diff --git a/test/unit/lib/context/requestContext.js b/test/unit/lib/context/requestContext.js index 379eac85..fbaca87e 100644 --- a/test/unit/lib/context/requestContext.js +++ b/test/unit/lib/context/requestContext.js @@ -472,6 +472,74 @@ describe('RequestContext', () => { }); }); }); + + describe('invalid requests on BIGIP', () => { + let path; + let hostContext; + + beforeEach(() => { + path = '/shared/appsvcs/declare'; + hostContext = new HostContext(); + + hostContext.deviceType = constants.DEVICE_TYPES.BIG_IP; + hostContext.as3VersionInfo = {}; + }); + + it('should invalidate per-app declaration POST to /declare', () => { + const restOp = new RestOperationMock(); + restOp.method = 'Post'; + + restOp.setPathName(path); + restOp.setPath(path); + restOp.setBody({ + app1: { + class: 'Application', + template: 'generic', + pool1: + { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 11, + minimumMonitors: 1 + } + } + }); + + return RequestContext.get(restOp, hostContext) + .then((ctxt) => { + assert.strictEqual(ctxt.errorCode, 422); + assert.strictEqual(ctxt.isPerApp, false); + assert.strictEqual(ctxt.method, 'Post'); + assert.strictEqual(ctxt.error, + 'Invalid request value \'[object Object]\' (path: /declaration) : should have required property \'class\' {"missingProperty":"class"}'); + assert.strictEqual(ctxt.pathName, 'declare'); + assert.strictEqual(ctxt.subPath, undefined); + assert.deepStrictEqual(ctxt.queryParams, []); + assert.deepEqual( + ctxt.body, + { + app1: { + class: 'Application', + template: 'generic', + pool1: + { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 11, + minimumMonitors: 1 + } + } + } + ); + }); + }); + }); }); describe('/declare/tenant/applications', () => { @@ -505,7 +573,7 @@ describe('RequestContext', () => { restOp.setPathName(`${path}/Tenant1/applications`); restOp.setPath(`${path}/Tenant1/applications`); - restOp.setBody(Object.assign({}, validDecl)); + restOp.setBody({}); return RequestContext.get(restOp, hostContext) .then((ctxt) => { @@ -518,7 +586,7 @@ describe('RequestContext', () => { assert.deepStrictEqual( ctxt.request.perAppInfo, { - app: undefined, // Note: this is by design + apps: [], // Note: this is by design tenant: 'Tenant1' } ); @@ -579,7 +647,7 @@ describe('RequestContext', () => { assert.deepStrictEqual( ctxt.request.perAppInfo, { - app: undefined, // Note: this is by design + apps: [], tenant: 'Tenant1' } ); @@ -615,7 +683,7 @@ describe('RequestContext', () => { isMultiDecl: false, isPerApp: true, perAppInfo: { - app: 'App1', + apps: ['App1'], tenant: 'Tenant1' }, method: 'Delete', @@ -657,6 +725,214 @@ describe('RequestContext', () => { ); }); }); + + it('should validate a per-app POST request with one app', () => { + const restOp = new RestOperationMock(); + restOp.method = 'Post'; + + restOp.setPathName(`${path}/Tenant1/applications/`); + restOp.setPath(`${path}/Tenant1/applications/`); + restOp.setBody({ + app1: { + class: 'Application', + template: 'generic', + pool1: + { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 11, + minimumMonitors: 1 + } + } + }); + + return RequestContext.get(restOp, hostContext) + .then((ctxt) => { + assert.isUndefined(ctxt.request.error); + assert.strictEqual(ctxt.request.method, 'Post'); + assert.strictEqual(ctxt.request.pathName, 'declare'); + assert.strictEqual(ctxt.request.subPath, 'Tenant1/applications'); + assert.deepStrictEqual(ctxt.request.queryParams, []); + assert.strictEqual(ctxt.request.isPerApp, true); + assert.deepStrictEqual( + ctxt.request.perAppInfo, + { + apps: ['app1'], + tenant: 'Tenant1', + decl: { + app1: { + class: 'Application', + template: 'generic', + pool1: + { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 11, + minimumMonitors: 1 + } + } + } + } + ); + assert.strictEqual(ctxt.request.body.id.match(/^autogen/).length > 0, true); + delete ctxt.request.body.id; // The id is random, no need to check the value specifically + assert.deepEqual( + ctxt.request.body, + { + class: 'ADC', + schemaVersion: '3.0.0', + Tenant1: { + class: 'Tenant', + app1: { + class: 'Application', + template: 'generic', + pool1: + { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 11, + minimumMonitors: 1 + } + } + } + } + ); + }); + }); + + it('should validate a per-app POST request with two apps', () => { + const restOp = new RestOperationMock(); + restOp.method = 'Post'; + + restOp.setPathName(`${path}/Tenant1/applications/`); + restOp.setPath(`${path}/Tenant1/applications/`); + restOp.setBody({ + app1: { + class: 'Application', + template: 'generic', + pool1: + { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 11, + minimumMonitors: 1 + } + }, + app2: { + class: 'Application', + template: 'generic', + pool1: + { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 11, + minimumMonitors: 1 + } + } + }); + + return RequestContext.get(restOp, hostContext) + .then((ctxt) => { + assert.isUndefined(ctxt.request.error); + assert.strictEqual(ctxt.request.method, 'Post'); + assert.strictEqual(ctxt.request.pathName, 'declare'); + assert.strictEqual(ctxt.request.subPath, 'Tenant1/applications'); + assert.deepStrictEqual(ctxt.request.queryParams, []); + assert.strictEqual(ctxt.request.isPerApp, true); + assert.deepStrictEqual( + ctxt.request.perAppInfo, + { + apps: ['app1', 'app2'], + tenant: 'Tenant1', + decl: { + app1: { + class: 'Application', + template: 'generic', + pool1: + { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 11, + minimumMonitors: 1 + } + }, + app2: { + class: 'Application', + template: 'generic', + pool1: + { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 11, + minimumMonitors: 1 + } + } + } + } + ); + assert.strictEqual(ctxt.request.body.id.match(/^autogen/).length > 0, true); + delete ctxt.request.body.id; // The id is random, no need to check the value specifically + assert.deepEqual( + ctxt.request.body, + { + class: 'ADC', + schemaVersion: '3.0.0', + Tenant1: { + class: 'Tenant', + app1: { + class: 'Application', + template: 'generic', + pool1: + { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 11, + minimumMonitors: 1 + } + }, + app2: { + class: 'Application', + template: 'generic', + pool1: + { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 11, + minimumMonitors: 1 + } + } + } + } + ); + }); + }); }); describe('invalid', () => { @@ -679,7 +955,7 @@ describe('RequestContext', () => { fullPath: '/shared/appsvcs/declare/tenant,tenantId2/applications/app1', isPerApp: true, perAppInfo: { - app: 'app1', + apps: ['app1'], tenant: 'tenant,tenantId2' }, pathName: 'declare', @@ -709,7 +985,7 @@ describe('RequestContext', () => { fullPath: '/shared/appsvcs/declare/tenant/applications/app1,app2', isPerApp: true, perAppInfo: { - app: 'app1,app2', + apps: ['app1,app2'], tenant: 'tenant' }, pathName: 'declare', @@ -719,6 +995,60 @@ describe('RequestContext', () => { ); }); }); + + it('should invalidate a per-app POST request with per-app array', () => { + const restOp = new RestOperationMock(); + restOp.method = 'Post'; + + restOp.setPathName(`${path}/Tenant1/applications/`); + restOp.setPath(`${path}/Tenant1/applications/`); + restOp.setBody([{ + app1: { + class: 'Application', + template: 'generic', + pool1: + { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 11, + minimumMonitors: 1 + } + } + }]); + + return RequestContext.get(restOp, hostContext) + .then((ctxt) => { + assert.strictEqual(ctxt.errorCode, 422); + assert.strictEqual(ctxt.isPerApp, true); + assert.strictEqual(ctxt.method, 'Post'); + assert.strictEqual(ctxt.error, 'declaration should be an object'); + assert.strictEqual(ctxt.pathName, 'declare'); + assert.strictEqual(ctxt.subPath, 'Tenant1/applications'); + assert.deepStrictEqual(ctxt.queryParams, []); + assert.deepEqual( + ctxt.body, + [{ + app1: { + class: 'Application', + template: 'generic', + pool1: + { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 11, + minimumMonitors: 1 + } + } + }] + ); + }); + }); }); }); }); diff --git a/test/unit/lib/declarationHandler.js b/test/unit/lib/declarationHandler.js index b227f7cc..0a42a034 100644 --- a/test/unit/lib/declarationHandler.js +++ b/test/unit/lib/declarationHandler.js @@ -314,7 +314,7 @@ describe('DeclarationHandler', () => { context.tasks[0].fullPath = 'shared/appsvcs/declare/secondTenant/applications'; context.request.isPerApp = true; context.request.perAppInfo = { - app: undefined, + apps: [], tenant: 'secondTenant' }; @@ -335,7 +335,7 @@ describe('DeclarationHandler', () => { context.tasks[0].fullPath = 'shared/appsvcs/declare/firstTenant/applications'; context.request.isPerApp = true; context.request.perAppInfo = { - app: undefined, + apps: [], tenant: 'firstTenant' }; @@ -357,7 +357,7 @@ describe('DeclarationHandler', () => { context.tasks[0].fullPath = 'shared/appsvcs/declare/firstTenant/applications/Application'; context.request.isPerApp = true; context.request.perAppInfo = { - app: 'Application', + apps: ['Application'], tenant: 'firstTenant' }; @@ -378,7 +378,7 @@ describe('DeclarationHandler', () => { context.tasks[0].fullPath = 'shared/appsvcs/declare/someTenant/applications'; context.request.isPerApp = true; context.request.perAppInfo = { - app: undefined, + apps: [], tenant: 'someTenant' }; @@ -401,7 +401,7 @@ describe('DeclarationHandler', () => { context.tasks[0].fullPath = 'shared/appsvcs/declare/firstTenant/applications/otherApplication'; context.request.isPerApp = true; context.request.perAppInfo = { - app: 'otherApplication', + apps: ['otherApplication'], tenant: 'firstTenant' }; @@ -425,7 +425,7 @@ describe('DeclarationHandler', () => { context.tasks[0].fullPath = 'shared/appsvcs/declare/firstTenant/applications/App1'; context.request.isPerApp = true; context.request.perAppInfo = { - app: 'App1', + apps: ['App1'], tenant: 'firstTenant' }; @@ -445,7 +445,7 @@ describe('DeclarationHandler', () => { context.tasks[0].fullPath = 'shared/appsvcs/declare/firstTenant/applications/App1'; context.request.isPerApp = true; context.request.perAppInfo = { - app: 'App1', + apps: ['App1'], tenant: 'firstTenant' }; @@ -1652,20 +1652,83 @@ describe('DeclarationHandler', () => { }; context.request.isPerApp = true; context.request.perAppInfo = { - app: undefined, + apps: [], tenant: 'otherTenant' }; + sinon.stub(audit, 'allTenants').resolves([ + { + code: 200, + message: 'success', + lineCount: 21, + host: 'localhost', + tenant: 'otherTenant', + runTime: 956 + } + ]); + return handler.handleCreateUpdateOrDelete(context) .then((result) => { assert.strictEqual(result.statusCode, 200); - // NOTE: Further POST development will likely change the following responses assert.strictEqual(result.body.results[0].code, 200); - assert.strictEqual(result.body.results[0].message, 'no change'); + assert.strictEqual(result.body.results[0].message, 'success'); assert.strictEqual(result.errorMessage, undefined); }); }); }); + + it('should add warnings from persistConfig', () => { + context.tasks[0].persist = true; + context.tasks[0].declaration = { + class: 'ADC', + schemaVersion: '3.0.0', + id: 'declaration_id', + tenant: { + class: 'Tenant' + } + }; + + sinon.stub(audit, 'allTenants').resolves([ + { + code: 200, + message: 'no change', + host: 'localhost', + tenant: 'tenant', + runTime: 59 + } + ]); + nock('http://localhost:8100') + .post('/mgmt/tm/task/sys/config') + .reply(200, () => ({ + selfLink: 'https://localhost/mgmt/tm/task/sys/config/42', + _taskId: 42 + })); + nock('http://localhost:8100') + .put('/mgmt/tm/task/sys/config/42') + .reply(200); + nock('http://localhost:8100') + .get('/mgmt/tm/task/sys/config/42') + .reply(404, { message: 'Task not found' }); + + return handler.handleCreateUpdateOrDelete(context) + .then((result) => { + assert.deepStrictEqual( + result.body.results, + [ + { + code: 200, + message: 'no change', + host: 'localhost', + tenant: 'tenant', + runTime: 59, + warnings: [ + 'AS3 was unable to verify that the configuration was persisted. To avoid this issue in the future, try increasing the following DB variables: icrd.timeout, restjavad.timeout, restnoded.timeout' + ] + } + ] + ); + }); + }); }); describe('.handlePatch', () => { @@ -2122,6 +2185,13 @@ describe('DeclarationHandler', () => { .reply(404, { message: 'Task not found - ID: 42 user: admin' }); } + function nockConnectionRefused(n) { + nock('http://localhost:8100') + .get('/mgmt/tm/task/sys/config/42') + .times(n) + .reply(500, { message: 'Connection refused' }); + } + function assertComplete() { const state = {}; nockCompleted(state); @@ -2232,12 +2302,27 @@ describe('DeclarationHandler', () => { }); }); - it('should update error message if task is not found', () => { - const expectedMsg = /failed to save BIG-IP config \(Record no longer exists on BIG-IP for saving configuration task \(ID: 42\)/; + it('should resolve with warning if task not found', () => { nockCreate(); nockStart(); nockTaskNotFound(); - return assert.isRejected(DeclarationHandler.persistConfig(context), expectedMsg); + return assert.isFulfilled(DeclarationHandler.persistConfig(context)) + .then((result) => { + assert.strictEqual( + result.warning, + 'AS3 was unable to verify that the configuration was persisted. To avoid this issue in the future, try increasing the following DB variables: icrd.timeout, restjavad.timeout, restnoded.timeout' + ); + }); + }); + + it('should reject if too many Connection refused errors are encountered', () => { + nockCreate(); + nockStart(); + nockConnectionRefused(121); + return assert.isRejected( + DeclarationHandler.persistConfig(context), + /Connection refused/ + ); }); }); }); diff --git a/test/unit/lib/declarationProvider.js b/test/unit/lib/declarationProvider.js index ce0417e2..40394008 100644 --- a/test/unit/lib/declarationProvider.js +++ b/test/unit/lib/declarationProvider.js @@ -162,6 +162,103 @@ describe('DeclarationProvider', () => { ); }); }); + + describe('dryRun', () => { + it('should convert "controls.internalUse.action=dryRun" to controls.dryRun', () => { + const provider = new DeclarationProvider(); + + nock('http://localhost:8100') + .get('/mgmt/cm/global/tenants') + .reply(200, { + items: [{ + name: 'tenantOne', + body: { + controls: { + class: 'Controls', + internalUse: { + action: 'dry-run' + } + } + } + }] + }); + + return Promise.resolve() + .then(() => provider.getBigiqDeclaration(context)) + .then((result) => { + assert.deepStrictEqual( + result, + { + controls: { + class: 'Controls', + dryRun: true + } + } + ); + }); + }); + + it('should issue a warning if internalUse contains unexpected keys', () => { + const provider = new DeclarationProvider(); + const logWarningSpy = sinon.stub(log, 'warning'); + + nock('http://localhost:8100') + .get('/mgmt/cm/global/tenants') + .reply(200, { + items: [{ + name: 'tenantOne', + body: { + controls: { + class: 'Controls', + internalUse: { + action: 'dry-run', + hello: 'world' + } + } + } + }] + }); + + return Promise.resolve() + .then(() => provider.getBigiqDeclaration(context)) + .then(() => { + assert.strictEqual( + logWarningSpy.args[0][0], + 'Unexpected properties in controls.internalUse: {"action":"dry-run","hello":"world"}' + ); + }); + }); + + it('should issue a warning if action is not dry-run', () => { + const provider = new DeclarationProvider(); + const logWarningSpy = sinon.stub(log, 'warning'); + + nock('http://localhost:8100') + .get('/mgmt/cm/global/tenants') + .reply(200, { + items: [{ + name: 'tenantOne', + body: { + controls: { + class: 'Controls', + internalUse: { + action: 'deploy' + } + } + } + }] + }); + + return Promise.resolve() + .then(() => provider.getBigiqDeclaration(context)) + .then(() => { + assert.strictEqual( + logWarningSpy.args[0][0], + 'Unexpected action "deploy" in controls' + ); + }); + }); + }); }); describe('.getBigipDeclaration', () => { diff --git a/test/unit/lib/declareHandler.js b/test/unit/lib/declareHandler.js index 83416d2e..bf63442c 100644 --- a/test/unit/lib/declareHandler.js +++ b/test/unit/lib/declareHandler.js @@ -1091,6 +1091,247 @@ describe('DeclareHandler', () => { }); }); }); + + describe('per-app', () => { + let restOp; + + beforeEach(() => { + sinon.stub(log, 'error'); + restOp = new RestOperationMock(); + context.request = { + method: 'Post', + action: 'deploy', + tracer: new Tracer('test tracer', { enabled: false }) + }; + context.tasks = [ + { + action: 'deploy', + declaration: { + class: 'ADC', + controls: { + class: 'Controls', + trace: false + } + } + } + ]; + }); + + it('should handle verifying if the per-app declaration is valid', () => { + sinon.stub(As3Parser.prototype, 'digest').resolves({}); + context.request.isPerApp = true; + context.request.perAppInfo = { + tenant: 'tenant1', + apps: ['app1'], + decl: { + app1: { + class: 'Application', + service: { + class: 'Service_HTTP', + virtualAddresses: ['192.0.2.100'], + virtualPort: 80, + pool: 'pool' + }, + pool: { + class: 'Pool' + } + } + } + }; + context.request.body = { + class: 'ADC', + schemaVersion: '3.0.0', + tenant1: { + class: 'Tenant', + app1: { + class: 'Application', + service: { + class: 'Service_HTTP', + virtualAddresses: ['192.0.2.100'], + virtualPort: 80, + pool: 'pool' + }, + pool: { + class: 'Pool' + } + } + } + }; + context.tasks[0].declaration = context.request.body; + + const expectedCode = STATUS_CODES.OK; + const expectedResult = { + declaration: { + class: 'ADC', + id: 'autogen_new-uuid-xxxx', + schemaVersion: '3.0.0', + tenant1: { + class: 'Tenant', + app1: { + class: 'Application', + service: { + class: 'Service_HTTP', + virtualAddresses: ['192.0.2.100'], + virtualPort: 80, + pool: 'pool' + }, + pool: { + class: 'Pool' + } + } + } + }, + results: [] + }; + + return assertResultAndRestComplete(context, restOp, expectedResult, expectedCode) + .then(() => { + assert.deepStrictEqual(context.tasks[0].tenantsInPath, []); + assert.strictEqual(typeof context.tasks[0].isPerApp, 'undefined'); + assert.strictEqual(typeof context.tasks[0].perAppInfo, 'undefined'); + }); + }); + + it('should error if the per-app declaration is a per-tenant declaration', () => { + sinon.stub(As3Parser.prototype, 'digest').rejects({ + status: 422, + message: 'declaration is invalid', + errors: ['/class: should be object'] + }); + context.request.isPerApp = true; + context.request.perAppInfo = { + tenant: 'tenant1', + apps: ['app1'], + decl: { + class: 'ADC', + id: 'autogen_new-uuid-xxxx', + schemaVersion: '3.0.0', + tenant1: { + class: 'Tenant', + app1: { + class: 'Application', + service: { + class: 'Service_HTTP', + virtualAddresses: ['192.0.2.100'], + virtualPort: 80, + pool: 'pool' + }, + pool: { + class: 'Pool' + } + } + } + } + }; + context.request.body = { + class: 'ADC', + schemaVersion: '3.0.0', + id: 'autogen_new-uuid-xxxx', + tenant1: { + class: 'Tenant', + app1: { + class: 'Application', + service: { + class: 'Service_HTTP', + virtualAddresses: ['192.0.2.100'], + virtualPort: '80', + pool: 'pool' + }, + pool: { + class: 'Pool' + } + } + } + }; + context.tasks[0].declaration = context.request.body; + + const expectedCode = STATUS_CODES.UNPROCESSABLE_ENTITY; + const expectedResult = { + code: 422, + message: 'declaration is invalid', + errors: [ + '/class: should be object' + ] + }; + + return assertResultAndRestComplete(context, restOp, expectedResult, expectedCode) + .then(() => { + assert.deepStrictEqual(context.tasks[0].tenantsInPath, undefined); + assert.strictEqual(typeof context.tasks[0].isPerApp, 'undefined'); + assert.strictEqual(typeof context.tasks[0].perAppInfo, 'undefined'); + }); + }); + + it('should error if the per-app declaration fails validation - such as string instead of integer', () => { + sinon.stub(As3Parser.prototype, 'digest').rejects({ + status: 422, + message: 'declaration is invalid', + errors: ['/app1/testItem/virtualPort: should be integer'] + }); + context.request.isPerApp = true; + context.request.perAppInfo = { + tenant: 'tenant1', + apps: ['app1'], + decl: { + class: 'ADC', + id: 'autogen_new-uuid-xxxx', + schemaVersion: '3.0.0', + tenant1: { + class: 'Tenant', + app1: { + class: 'Application', + service: { + class: 'Service_HTTP', + virtualAddresses: ['192.0.2.100'], + virtualPort: '80', + pool: 'pool' + }, + pool: { + class: 'Pool' + } + } + } + } + }; + context.request.body = { + class: 'ADC', + schemaVersion: '3.0.0', + id: 'autogen_new-uuid-xxxx', + tenant1: { + class: 'Tenant', + app1: { + class: 'Application', + service: { + class: 'Service_HTTP', + virtualAddresses: ['192.0.2.100'], + virtualPort: '80', + pool: 'pool' + }, + pool: { + class: 'Pool' + } + } + } + }; + context.tasks[0].declaration = context.request.body; + + const expectedCode = STATUS_CODES.UNPROCESSABLE_ENTITY; + const expectedResult = { + code: 422, + message: 'declaration is invalid', + errors: [ + '/app1/testItem/virtualPort: should be integer' + ] + }; + + return assertResultAndRestComplete(context, restOp, expectedResult, expectedCode) + .then(() => { + assert.deepStrictEqual(context.tasks[0].tenantsInPath, undefined); + assert.strictEqual(typeof context.tasks[0].isPerApp, 'undefined'); + assert.strictEqual(typeof context.tasks[0].perAppInfo, 'undefined'); + }); + }); + }); }); describe('body defaults and request options', () => { diff --git a/test/unit/lib/fetch.js b/test/unit/lib/fetch.js index fb4ad5f2..543fcb1c 100644 --- a/test/unit/lib/fetch.js +++ b/test/unit/lib/fetch.js @@ -90,7 +90,7 @@ describe('fetch', () => { assert.isFulfilled(fetch.getBigipConfig(context, testPath, 'Common') .then((config) => { - assert.deepEqual(config, []); + assert.deepStrictEqual(config, []); })); }); @@ -306,15 +306,16 @@ describe('fetch', () => { }); }); - it('should return net address-list before firewall address-list', () => { - // Since firewall address-list and net address-list share the same path, we benefit - // from utilizing the firewall address-list (if it is available). As such, if we order - // paths.json with net address-list first and firewall second, the net address-list will - // be overwritten, if a firewall address-list is available. + it('should return net address- and port-list before firewall address- and port-list', () => { + // Since firewall address- and port-list and net address- and port-list share the same path, we benefit + // from utilizing the firewall address- and port-list (if it is available). As such, if we order + // paths.json with net address- and port-list first and firewall second, the net address- and port-list + // will be overwritten, if a firewall address- and/or port-list is available. util.iControlRequest.restore(); sinon.stub(util, 'iControlRequest').callsFake((_context, icrOptions) => { pathsSent.push(icrOptions.path); - if (icrOptions.path === '/mgmt/tm/net/address-list?$filter=partition%20eq%20testTen') { + switch (icrOptions.path) { + case '/mgmt/tm/net/address-list?$filter=partition%20eq%20testTen': return Promise.resolve({ kind: 'tm:net:address-list:address-listcollectionstate', items: [ @@ -327,8 +328,20 @@ describe('fetch', () => { } ] }); - } - if (icrOptions.path === '/mgmt/tm/security/firewall/address-list?$filter=partition%20eq%20testTen') { + case '/mgmt/tm/net/port-list?$filter=partition%20eq%20testTen': + return Promise.resolve({ + kind: 'tm:net:port-list:port-listcollectionstate', + items: [ + { + kind: 'tm:net:port-list:port-liststate', + name: 'portListExample', + partition: 'testTen', + fullPath: '/testTen/testApp/portListExample', + ports: [80, 8080] + } + ] + }); + case '/mgmt/tm/security/firewall/address-list?$filter=partition%20eq%20testTen': return Promise.resolve({ kind: 'tm:security:firewall:address-list:address-listcollectionstate', items: [ @@ -341,8 +354,22 @@ describe('fetch', () => { } ] }); + case '/mgmt/tm/security/firewall/port-list?$filter=partition%20eq%20testTen': + return Promise.resolve({ + kind: 'tm:security:firewall:port-list:port-listcollectionstate', + items: [ + { + kind: 'tm:security:firewall:port-list:port-liststate', + name: 'portListExample', + partition: 'testTen', + fullPath: '/testTen/testApp/portListExample', + ports: [80, 8080] + } + ] + }); + default: + return Promise.resolve([]); } - return Promise.resolve([]); }); context.target = { @@ -362,27 +389,43 @@ describe('fetch', () => { fullPath: '/testTen/testApp/addressListExample', addresses: ['192.0.2.0/24'] }, + { + kind: 'tm:net:port-list:port-liststate', + name: 'portListExample', + partition: 'testTen', + fullPath: '/testTen/testApp/portListExample', + ports: [80, 8080] + }, { kind: 'tm:security:firewall:address-list:address-liststate', name: 'addressListExample', partition: 'testTen', fullPath: '/testTen/testApp/addressListExample', addresses: ['192.0.2.0/24'] + }, + { + kind: 'tm:security:firewall:port-list:port-liststate', + name: 'portListExample', + partition: 'testTen', + fullPath: '/testTen/testApp/portListExample', + ports: [80, 8080] } ] ); }); }); - it('should return firewall address-list if on BIG-IP version 13.1', () => { - // net address-lists are not on 13.1, so we need to confirm that it is not queried + it('should return firewall address- and port-list if on BIG-IP version 13.1', () => { + // net address- and port-lists are not on 13.1, so we need to confirm that it is not queried util.iControlRequest.restore(); sinon.stub(util, 'iControlRequest').callsFake((_context, icrOptions) => { pathsSent.push(icrOptions.path); - if (icrOptions.path === '/mgmt/tm/net/address-list?$filter=partition%20eq%20testTen') { - throw new Error('Should not have queried this endpoint'); - } - if (icrOptions.path === '/mgmt/tm/security/firewall/address-list?$filter=partition%20eq%20testTen') { + switch (icrOptions.path) { + case '/mgmt/tm/net/address-list?$filter=partition%20eq%20testTen': + throw new Error('Should not have queried net address-list endpoint'); + case '/mgmt/tm/net/port-list?$filter=partition%20eq%20testTen': + throw new Error('Should not have queried net port-list endpoint'); + case '/mgmt/tm/security/firewall/address-list?$filter=partition%20eq%20testTen': return Promise.resolve({ kind: 'tm:security:firewall:address-list:address-listcollectionstate', items: [ @@ -395,8 +438,22 @@ describe('fetch', () => { } ] }); + case '/mgmt/tm/security/firewall/port-list?$filter=partition%20eq%20testTen': + return Promise.resolve({ + kind: 'tm:security:firewall:port-list:port-listcollectionstate', + items: [ + { + kind: 'tm:security:firewall:port-list:port-liststate', + name: 'portListExample', + partition: 'testTen', + fullPath: '/testTen/testApp/portListExample', + addresses: [80, 8080] + } + ] + }); + default: + return Promise.resolve([]); } - return Promise.resolve([]); }); context.target = { @@ -415,6 +472,13 @@ describe('fetch', () => { partition: 'testTen', fullPath: '/testTen/testApp/addressListExample', addresses: ['192.0.2.0/24'] + }, + { + kind: 'tm:security:firewall:port-list:port-liststate', + name: 'portListExample', + partition: 'testTen', + fullPath: '/testTen/testApp/portListExample', + addresses: [80, 8080] } ] ); @@ -664,6 +728,14 @@ describe('fetch', () => { assert.strictEqual(result, true, `${item.kind} should return true`); }); }); + + it('should return true when item.kind is a snat-translation', () => { + const item = { + kind: 'tm:ltm:snat-translation:snat-translationstate' + }; + const result = fetch.isAs3Item(context, item, 'thePartition'); + assert.strictEqual(result, true, `${item.kind} should return true`); + }); }); describe('.getDiff', () => { @@ -706,7 +778,7 @@ describe('fetch', () => { method: 'POST', ctype: 'application/octet-stream', why: 'upload Access Profile accessProfile', - overrides: { + settings: { class: 'Access_Profile', url: 'https://example.com/example.tar', ignoreChanges: false @@ -724,7 +796,7 @@ describe('fetch', () => { return assert.isFulfilled(fetch.getDiff(context, currentConfig, desiredConfig, commonConfig, {}), 'Promise should not reject') .then((results) => { assert.strictEqual(results.length, 1); - assert.deepEqual(results[0], { + assert.deepStrictEqual(results[0], { kind: 'N', path: [ '/Access_Profile/accessProfile' @@ -746,7 +818,7 @@ describe('fetch', () => { method: 'POST', ctype: 'application/octet-stream', why: 'upload Access Profile accessProfile', - overrides: { + settings: { class: 'Access_Profile', url: 'https://example.com/example.tar', ignoreChanges: false @@ -787,7 +859,7 @@ describe('fetch', () => { method: 'POST', ctype: 'application/octet-stream', why: 'upload Access Policy accessPolicy', - overrides: { + settings: { class: 'Per_Request_Access_Policy', url: 'https://example.com/example.tar', ignoreChanges: false @@ -805,7 +877,7 @@ describe('fetch', () => { return assert.isFulfilled(fetch.getDiff(context, currentConfig, desiredConfig, commonConfig, {}), 'Promise should not reject') .then((results) => { assert.strictEqual(results.length, 1); - assert.deepEqual(results[0], { + assert.deepStrictEqual(results[0], { kind: 'N', path: [ '/Per_Request_Access_Policy/accessPolicy' @@ -827,7 +899,7 @@ describe('fetch', () => { method: 'POST', ctype: 'application/octet-stream', why: 'upload Access Policy accessPolicy', - overrides: { + settings: { class: 'Per_Request_Access_Policy', url: 'https://example.com/example.tar', ignoreChanges: false @@ -842,6 +914,97 @@ describe('fetch', () => { }); }); + it('should return diff deleting a snat pool in Common Shared but not the matching snat translation', () => { + // When a snat pool is deleted BIGIP will check and delete any snat translations that are no longer needed + const currentConfig = { + '/Common/Shared/CreateSnatPool3': { + command: 'ltm snatpool', + properties: { + members: { + '/Common/192.0.2.12': {}, + '/Common/192.0.2.13': {} + } + }, + ignore: [] + }, + '/Common/192.0.2.12': { + command: 'ltm snat-translation', + properties: { + address: '192.0.2.12', + arp: 'enabled', + 'connection-limit': 0, + enabled: {}, + 'ip-idle-timeout': 'indefinite', + 'tcp-idle-timeout': 'indefinite', + 'traffic-group': 'default', + 'udp-idle-timeout': 'indefinite' + }, + ignore: [] + }, + '/Common/192.0.2.13': { + command: 'ltm snat-translation', + properties: { + address: '192.0.2.13', + arp: 'enabled', + 'connection-limit': 0, + enabled: {}, + 'ip-idle-timeout': 'indefinite', + 'tcp-idle-timeout': 'indefinite', + 'traffic-group': 'default', + 'udp-idle-timeout': 'indefinite' + }, + ignore: [] + }, + '/Common/Shared/': { + command: 'sys folder', + properties: {}, + ignore: [] + } + }; + + const desiredConfig = {}; + + const commonConfig = { + nodeList: [] + }; + + return fetch.getDiff(context, currentConfig, desiredConfig, commonConfig, 'Common') + .catch(() => { + assert.fail('Promise should not reject'); + }) + .then((results) => { + assert.deepStrictEqual(results, [ + { + kind: 'D', + path: [ + '/Common/Shared/CreateSnatPool3' + ], + lhs: { + command: 'ltm snatpool', + properties: { + members: { + '/Common/192.0.2.12': {}, + '/Common/192.0.2.13': {} + } + }, + ignore: [] + } + }, + { + kind: 'D', + path: [ + '/Common/Shared/' + ], + lhs: { + command: 'sys folder', + properties: {}, + ignore: [] + } + } + ]); + }); + }); + it('should return diff but remove default-from from protocol inspection profiles', () => { const currentConfig = { '/myApp/Application1/gjd-inspect-profile': { @@ -871,7 +1034,7 @@ describe('fetch', () => { }) .then((results) => { assert.strictEqual(results.length, 1); - assert.deepEqual(results[0], { + assert.deepStrictEqual(results[0], { kind: 'E', lhs: 'on', path: ['/myApp/Application1/gjd-inspect-profile', 'properties', 'avr-stat-collect'], @@ -880,6 +1043,224 @@ describe('fetch', () => { }); }); + // TODO: remove this unit test, when virtual-address per-app meta-data handling is complete + it('should remove virtual-address deletes when hanlding a per-app POST', () => { + context.request = { + method: 'Post', + isPerApp: true, + perAppInfo: { + tenant: 'tenant1', + decl: {}, // Abbreviated for testing + apps: ['app1'] + } + }; + const currentConfig = { + '/tenant1/': + { + command: 'auth partition', + properties: { 'default-route-domain': 0 }, + ignore: [] + }, + '/tenant1/app1/testItem': + { + command: 'ltm virtual', + properties: + { + enabled: true, + 'address-status': 'yes', + 'auto-lasthop': 'default', + 'connection-limit': 0, + 'rate-limit': 'disabled', + description: '"description"', + destination: '/tenant1/192.0.2.200:123', + 'ip-protocol': 'tcp', + 'last-hop-pool': 'none', + mask: '255.255.255.255', + mirror: 'disabled', + persist: { + '/Common/source_addr': { + default: 'yes' + } + }, + policies: {}, + profiles: {}, + 'service-down-immediate-action': 'none', + source: '0.0.0.0/0', + 'source-address-translation': { + type: 'automap' + }, + rules: {}, + 'security-log-profiles': {}, + 'source-port': 'preserve', + 'translate-address': 'enabled', + 'translate-port': 'enabled', + nat64: 'disabled', + vlans: {}, + 'vlans-disabled': ' ', + metadata: {}, + 'clone-pools': {}, + 'throughput-capacity': 'infinite' + }, + ignore: [] + }, + '/tenant1/Service_Address-192.0.2.200': + { + command: 'ltm virtual-address', + properties: + { + address: '192.0.2.200', + arp: 'enabled', + 'icmp-echo': 'enabled', + mask: '255.255.255.255', + 'route-advertisement': 'disabled', + spanning: 'disabled', + 'traffic-group': 'default' + }, + ignore: [] + }, + '/tenant1/Service_Address-192.0.2.1': + { + command: 'ltm virtual-address', + properties: + { + address: '192.0.2.1', + arp: 'enabled', + 'icmp-echo': 'enabled', + mask: '255.255.255.255', + 'route-advertisement': 'disabled', + spanning: 'disabled', + 'traffic-group': 'default' + }, + ignore: [] + }, + '/tenant1/app1/': { + command: 'sys folder', properties: {}, ignore: [] + } + }; + const desiredConfig = { + '/tenant1/app1/': { command: 'sys folder', properties: {}, ignore: [] }, + '/tenant1/Service_Address-192.0.2.100': + { + command: 'ltm virtual-address', + properties: + { + address: '192.0.2.100', + arp: 'enabled', + 'icmp-echo': 'enabled', + mask: '255.255.255.255', + 'route-advertisement': 'disabled', + spanning: 'disabled', + 'traffic-group': 'default' + }, + ignore: [] + }, + '/tenant1/app1/testItem': + { + command: 'ltm virtual', + properties: + { + enabled: true, + 'address-status': 'yes', + 'auto-lasthop': 'default', + 'connection-limit': 0, + 'rate-limit': 'disabled', + description: '"description"', + destination: '/tenant1/192.0.2.100:123', + 'ip-protocol': 'tcp', + 'last-hop-pool': 'none', + mask: '255.255.255.255', + mirror: 'disabled', + persist: { + '/Common/source_addr': { + default: 'yes' + } + }, + policies: {}, + profiles: {}, + 'service-down-immediate-action': 'none', + source: '0.0.0.0/0', + 'source-address-translation': { + type: 'automap' + }, + rules: {}, + 'security-log-profiles': {}, + 'source-port': 'preserve', + 'translate-address': 'enabled', + 'translate-port': 'enabled', + nat64: 'disabled', + vlans: {}, + 'vlans-disabled': ' ', + metadata: {}, + 'clone-pools': {}, + 'throughput-capacity': 'infinite' + }, + ignore: [] + }, + '/tenant1/': + { + command: 'auth partition', + properties: { 'default-route-domain': 0 }, + ignore: [] + } + }; + const commonConfig = { + nodeList: [ + { + fullPath: '/tenant1/192.0.2.10', + partition: 'tenant1', + ephemeral: false, + metadata: undefined, + commonNode: false, + domain: '', + key: '192.0.2.10' + }, + { + fullPath: '/tenant1/192.0.2.20', + partition: 'tenant1', + ephemeral: false, + metadata: undefined, + commonNode: false, + domain: '', + key: '192.0.2.20' + }], + virtualAddressList: [] + }; + return fetch.getDiff(context, currentConfig, desiredConfig, commonConfig, {}) + .catch(() => { + assert.fail('Promise should not reject'); + }) + .then((results) => { + // Should be empty if attempting to Delete + assert.strictEqual(results.length, 2); + assert.deepStrictEqual(results, + [ + { + kind: 'E', + path: ['/tenant1/app1/testItem', 'properties', 'destination'], + lhs: '/tenant1/192.0.2.200:123', + rhs: '/tenant1/192.0.2.100:123' + }, + { + kind: 'N', + path: ['/tenant1/Service_Address-192.0.2.100'], + rhs: { + command: 'ltm virtual-address', + properties: { + address: '192.0.2.100', + arp: 'enabled', + 'icmp-echo': 'enabled', + mask: '255.255.255.255', + 'route-advertisement': 'disabled', + spanning: 'disabled', + 'traffic-group': 'default' + }, + ignore: [] + } + } + ]); + }); + }); + describe('iRule order', () => { it('should return a diff when iRule order changes', () => { const currentConfig = { @@ -916,7 +1297,7 @@ describe('fetch', () => { }) .then((results) => { assert.strictEqual(results.length, 2); - assert.deepEqual( + assert.deepStrictEqual( results[0], { kind: 'E', @@ -931,7 +1312,7 @@ describe('fetch', () => { rhs: 'rule1' } ); - assert.deepEqual( + assert.deepStrictEqual( results[1], { kind: 'E', @@ -1024,7 +1405,7 @@ describe('fetch', () => { }) .then((results) => { assert.strictEqual(results.length, 2); - assert.deepEqual( + assert.deepStrictEqual( results[0], { kind: 'E', @@ -1039,7 +1420,7 @@ describe('fetch', () => { rhs: 'rule1' } ); - assert.deepEqual( + assert.deepStrictEqual( results[1], { kind: 'E', @@ -1936,68 +2317,180 @@ describe('fetch', () => { ); }); }); - }); - describe('.maintainCommonNodes', () => { - const getNodeList = (refVal, includeSdMetadata) => { - const nodeList = [ - { - fullPath: '/Common/10.10.0.10', - partition: 'Common' - }, - { - fullPath: '/Common/192.0.2.10', - partition: 'Common', - address: '192.0.2.10', - ephemeral: false, - metadata: [ - { name: 'references', persist: true, value: refVal }, - { name: 'foo', value: 'bar' } - ], - domain: '', - key: '192.0.2.10', - commonNode: true + it('should be able to convert from firewall port-list to net port-list', () => { + const currentConfig = { + 'testTenant/testApp/testAL': { + command: 'security firewall port-list', + properties: { + ports: { + 8080: {} + }, + 'port-lists': {} + }, + ignore: [] } - ]; - - if (includeSdMetadata) { - nodeList[1].metadata.push( - { name: 'appsvcs-discovery', value: true } - ); - } - return nodeList; - }; - - it('should update metadata for new Common node', () => { - const currentConfig = {}; + }; const desiredConfig = { - '/Common/192.0.2.10': { - command: 'ltm node', - ignore: [], + 'testTenant/testApp/testAL': { + command: 'net port-list', properties: { - address: '192.0.2.10', - metadata: { references: { value: 0 } } - } + ports: { + 80: {} + }, + 'port-lists': {} + }, + ignore: [] } }; - const commonConfig = { nodeList: getNodeList(0) }; - const expectedDiffs = [{ - kind: 'N', - path: ['/Common/192.0.2.10'], - rhs: util.simpleCopy(desiredConfig['/Common/192.0.2.10']) - }]; - expectedDiffs[0].rhs.properties.metadata.references.value = 1; - - const expectedNodeList = util.simpleCopy(commonConfig.nodeList); - expectedNodeList[1].metadata[0].value = 1; - - return fetch.getDiff(context, currentConfig, desiredConfig, commonConfig, {}) + return fetch.getDiff(context, currentConfig, desiredConfig, { nodeList: [] }, {}) .then((diff) => { - assert.deepStrictEqual(diff.map((d) => Object.assign({}, d)), expectedDiffs); - assert.deepStrictEqual(commonConfig.nodeList, expectedNodeList); - }); - }); + assert.deepStrictEqual( + diff, + [ + { + kind: 'D', + path: [ + 'testTenant/testApp/testAL', + 'properties', + 'ports', + '8080' + ], + lhs: {} + }, + { + kind: 'N', + path: [ + 'testTenant/testApp/testAL', + 'properties', + 'ports', + '80' + ], + rhs: {} + } + ] + ); + }); + }); + + it('should be able to convert from net port-list to firewall port-list', () => { + const currentConfig = { + 'testTenant/testApp/testAL': { + command: 'net port-list', + properties: { + ports: { + 8080: {} + }, + 'port-lists': {} + }, + ignore: [] + } + }; + const desiredConfig = { + 'testTenant/testApp/testAL': { + command: 'security firewall port-list', + properties: { + ports: { + 80: {} + }, + 'port-lists': {} + }, + ignore: [] + } + }; + + return fetch.getDiff(context, currentConfig, desiredConfig, { nodeList: [] }, {}) + .then((diff) => { + assert.deepStrictEqual( + diff, + [ + { + kind: 'D', + path: [ + 'testTenant/testApp/testAL', + 'properties', + 'ports', + '8080' + ], + lhs: {} + }, + { + kind: 'N', + path: [ + 'testTenant/testApp/testAL', + 'properties', + 'ports', + '80' + ], + rhs: {} + } + ] + ); + }); + }); + }); + + describe('.maintainCommonNodes', () => { + const getNodeList = (refVal, includeSdMetadata) => { + const nodeList = [ + { + fullPath: '/Common/10.10.0.10', + partition: 'Common' + }, + { + fullPath: '/Common/192.0.2.10', + partition: 'Common', + address: '192.0.2.10', + ephemeral: false, + metadata: [ + { name: 'references', persist: true, value: refVal }, + { name: 'foo', value: 'bar' } + ], + domain: '', + key: '192.0.2.10', + commonNode: true + } + ]; + + if (includeSdMetadata) { + nodeList[1].metadata.push( + { name: 'appsvcs-discovery', value: true } + ); + } + return nodeList; + }; + + it('should update metadata for new Common node', () => { + const currentConfig = {}; + const desiredConfig = { + '/Common/192.0.2.10': { + command: 'ltm node', + ignore: [], + properties: { + address: '192.0.2.10', + metadata: { references: { value: 0 } } + } + } + }; + const commonConfig = { nodeList: getNodeList(0) }; + + const expectedDiffs = [{ + kind: 'N', + path: ['/Common/192.0.2.10'], + rhs: util.simpleCopy(desiredConfig['/Common/192.0.2.10']) + }]; + expectedDiffs[0].rhs.properties.metadata.references.value = 1; + + const expectedNodeList = util.simpleCopy(commonConfig.nodeList); + expectedNodeList[1].metadata[0].value = 1; + + return fetch.getDiff(context, currentConfig, desiredConfig, commonConfig, {}) + .then((diff) => { + assert.deepStrictEqual(diff.map((d) => Object.assign({}, d)), expectedDiffs); + assert.deepStrictEqual(commonConfig.nodeList, expectedNodeList); + }); + }); it('should replace diff and update metadata for Common node with multiple refs', () => { const currentConfig = {}; @@ -2455,7 +2948,7 @@ describe('fetch', () => { method: 'POST', ctype: 'application/octet-stream', why: 'upload Access Profile accessProfile', - overrides: { + settings: { class: 'Access_Profile', url: 'https://example.com/iam_policy.tar', ignoreChanges: true @@ -2513,7 +3006,7 @@ describe('fetch', () => { method: 'POST', ctype: 'application/octet-stream', why: 'upload Access Profile accessProfile', - overrides: { + settings: { class: 'Access_Profile', url: 'https://example.com/iam_policy.tar', ignoreChanges: true @@ -2577,7 +3070,7 @@ describe('fetch', () => { method: 'POST', ctype: 'application/octet-stream', why: 'upload Access Profile accessProfileTar', - overrides: { + settings: { class: 'Access_Profile', url: 'https://example.com/access_profile.tar', ignoreChanges: true @@ -2603,7 +3096,7 @@ describe('fetch', () => { method: 'POST', ctype: 'application/octet-stream', why: 'upload Access Profile accessProfileTarGz', - overrides: { + settings: { class: 'Access_Profile', url: 'https://example.com/access_profile.tar.gz', ignoreChanges: true @@ -2629,7 +3122,7 @@ describe('fetch', () => { method: 'POST', ctype: 'application/octet-stream', why: 'upload Access Policy perRequestPolicyTar', - overrides: { + settings: { class: 'Per_Request_Access_Policy', url: 'https://example.com/perRequestPolicy.tar', ignoreChanges: true @@ -2655,7 +3148,7 @@ describe('fetch', () => { method: 'POST', ctype: 'application/octet-stream', why: 'upload Access Policy perRequestPolicyTarGz', - overrides: { + settings: { class: 'Per_Request_Access_Policy', url: 'https://example.com/perRequestPolicy.tar.gz', ignoreChanges: true @@ -2713,7 +3206,7 @@ describe('fetch', () => { method: 'POST', ctype: 'application/octet-stream', why: 'upload Access Profile accessProfileTar', - overrides: { + settings: { class: 'Access_Profile', url: 'https://example.com/access_policy.tar', ignoreChanges: true @@ -2749,7 +3242,7 @@ describe('fetch', () => { method: 'POST', ctype: 'application/octet-stream', why: 'upload Access Profile accessProfileTarGz', - overrides: { + settings: { class: 'Access_Profile', url: 'https://example.com/access_profile.gz', ignoreChanges: true @@ -2785,7 +3278,7 @@ describe('fetch', () => { method: 'POST', ctype: 'application/octet-stream', why: 'upload Access Policy perRequestPolicyTar', - overrides: { + settings: { class: 'Per_Request_Access_Policy', url: 'https://example.com/perRequestPolicy.tar', ignoreChanges: true @@ -2821,7 +3314,7 @@ describe('fetch', () => { method: 'POST', ctype: 'application/octet-stream', why: 'upload Access Policy perRequestPolicyTarGz', - overrides: { + settings: { class: 'Per_Request_Access_Policy', url: 'https://example.com/perRequestPolicy.tar.gz', ignoreChanges: true @@ -2885,7 +3378,7 @@ describe('fetch', () => { method: 'POST', ctype: 'application/octet-stream', why: 'upload Access Policy perRequestPolicyTarGz', - overrides: { + settings: { class: 'Per_Request_Access_Policy', url: 'https://example.com/per_request_policy.tar.gz', ignoreChanges: true @@ -2943,7 +3436,7 @@ describe('fetch', () => { method: 'POST', ctype: 'application/octet-stream', why: 'upload Access Policy perRequestPolicyTarGz', - overrides: { + settings: { class: 'Per_Request_Access_Policy', url: 'https://example.com/per_request_policy.tar.gz', ignoreChanges: true @@ -3906,118 +4399,696 @@ describe('fetch', () => { 'cli script __appsvcs_update {\nproc script::run {} {\nif {[catch {\ntmsh::modify ltm data-group internal __appsvcs_update records none\n} err]} {\ntmsh::create ltm data-group internal __appsvcs_update type string records none\n}\nif { [catch {\ntmsh::modify security firewall rule-list /TEST_Firewall_Rule_List/Application/testFirewallRule rules modify \\{ theRule \\{ source \\{ address-lists none port-lists none \\} destination \\{ address-lists none port-lists none \\} \\} \\}\ntmsh::begin_transaction\ntmsh::delete security firewall rule-list /TEST_Firewall_Rule_List/Application/testFirewallRule\ntmsh::modify auth partition TEST_Firewall_Rule_List description \\"Updated by AS3 at [clock format [clock seconds] -gmt true -format {%a, %d %b %Y %T %Z}]\\"\ntmsh::commit_transaction\n} err] } {\ncatch { tmsh::cancel_transaction } e\nregsub -all {"} $err {\\"} err\ntmsh::modify ltm data-group internal __appsvcs_update records add \\{ error \\{ data \\"$err\\" \\} \\}\ncatch { tmsh::modify security firewall rule-list /TEST_Firewall_Rule_List/Application/testFirewallRule rules modify \\{ theRule \\{ source \\{ address-lists replace-all-with \\{/TEST_Firewall_Rule_List/Application/addList \\} port-lists replace-all-with \\{/TEST_Firewall_Rule_List/Application/portList \\} \\} destination \\{ address-lists replace-all-with \\{/TEST_Firewall_Rule_List/Application/addList \\} port-lists replace-all-with \\{/TEST_Firewall_Rule_List/Application/portList \\} \\} \\} \\} } e\n}}\n}' ); }); - }); - describe('pem policy', () => { - it('should properly setup preTrans, trans, and rollback during a delete', () => { + it('should delete virtuals with transaction-matching-criteria outside of transaction', () => { const desiredConfig = {}; const currentConfig = { - '/TEST_Pem_Policy/App/testPemPolicy': { - command: 'pem policy', + '/portList/': { + command: 'auth partition', + properties: {} + }, + '/portList/Application/tcpService_VS_TMC_OBJ': { + command: 'ltm traffic-matching-criteria', + properties: {} + }, + '/portList/Application/tcpService': { + command: 'ltm virtual', properties: { - rules: { - theRule: { - 'tcp-optimization-downlink': '/TEST_Pem_Policy/App/testTcpProfile', - 'tcp-optimization-uplink': '/TEST_Pem_Policy/App/testTcpProfile', - 'dscp-marking-downlink': 'pass-through', - 'dscp-marking-uplink': 'pass-through', - precedence: 1 - } - } - }, - ignore: [] + 'traffic-matching-criteria': '/portList/Application/tcpService_VS_TMC_OBJ' + } + }, + '/portList/Service_Address-192.0.2.1': { + command: 'ltm virtual-address', + properties: {} + }, + '/portList/Application/': { + command: 'sys folder', + properties: {} + }, + '/portList/Application/firewallPortList1': { + command: 'security firewall port-list', + properties: {} } }; const configDiff = [ { kind: 'D', path: [ - '/TEST_Pem_Policy/App/testPemPolicy' + '/portList/' ], lhs: { - command: 'pem policy', - properties: { - rules: { - theRule: { - 'tcp-optimization-downlink': '/TEST_Pem_Policy/App/testTcpProfile', - 'tcp-optimization-uplink': '/TEST_Pem_Policy/App/testTcpProfile', - 'dscp-marking-downlink': 'pass-through', - 'dscp-marking-uplink': 'pass-through', - precedence: 1 - } - } - } + command: 'auth partition', + properties: {} }, - tags: [ - 'tmsh' + command: 'auth partition' + }, + { + kind: 'D', + path: [ + '/portList/Application/tcpService_VS_TMC_OBJ' ], - command: 'pem policy' - } - ]; - const result = fetch.tmshUpdateScript(context, desiredConfig, currentConfig, configDiff); - assert.strictEqual( - result.script, - 'cli script __appsvcs_update {\nproc script::run {} {\nif {[catch {\ntmsh::modify ltm data-group internal __appsvcs_update records none\n} err]} {\ntmsh::create ltm data-group internal __appsvcs_update type string records none\n}\nif { [catch {\ntmsh::modify pem policy /TEST_Pem_Policy/App/testPemPolicy rules modify \\{ theRule \\{ tcp-optimization-downlink none tcp-optimization-uplink none \\} \\}\ntmsh::begin_transaction\ntmsh::delete pem policy /TEST_Pem_Policy/App/testPemPolicy\ntmsh::modify auth partition TEST_Pem_Policy description \\"Updated by AS3 at [clock format [clock seconds] -gmt true -format {%a, %d %b %Y %T %Z}]\\"\ntmsh::commit_transaction\n} err] } {\ncatch { tmsh::cancel_transaction } e\nregsub -all {"} $err {\\"} err\ntmsh::modify ltm data-group internal __appsvcs_update records add \\{ error \\{ data \\"$err\\" \\} \\}\ncatch { tmsh::modify pem policy /TEST_Pem_Policy/App/testPemPolicy rules modify \\{ theRule \\{ tcp-optimization-downlink /TEST_Pem_Policy/App/testTcpProfile tcp-optimization-uplink /TEST_Pem_Policy/App/testTcpProfile \\} \\} } e\n}}\n}' - ); - }); - }); - describe('sys log-config publisher', () => { - it('should properly modify the log publisher to empty destinations', () => { - const desiredConfig = { - '/TEST_Sys_Log_Config/App/logPublisher': { - command: 'sys log-config publisher', - properties: { - description: 'none', - destinations: {} - } - } - }; - const currentConfig = { - '/TEST_Sys_Log_Config/App/logPublisher': { - command: 'sys log-config publisher', - properties: { - description: 'Something Else', - destinations: { - '/TEST_Sys_Log_Config/App/logDestinationSyslog': {} - } - } - } - }; - const configDiff = [ + lhs: { + command: 'ltm traffic-matching-criteria', + properties: {} + }, + command: 'ltm traffic-matching-criteria' + }, { - kind: 'E', + kind: 'D', path: [ - '/TEST_Sys_Log_Config/App/logPublisher', - 'properties', - 'description' + '/portList/Application/tcpService' ], - lhs: 'Something Else', - rhs: 'none', - tags: ['tmsh'], - command: 'sys log-config publisher' + lhs: { + command: 'ltm virtual', + properties: {} + }, + command: 'ltm virtual' }, { kind: 'D', path: [ - '/TEST_Sys_Log_Config/App/logPublisher', - 'properties', - 'destinations', - '/TEST_Sys_Log_Config/App/logDest' + '/portList/Service_Address-192.0.2.1' ], - lhs: {}, - tags: ['tmsh'], - command: 'sys log-config publisher' + lhs: { + command: 'ltm virtual-address', + properties: {} + }, + command: 'ltm virtual-address' + }, + { + kind: 'D', + path: [ + '/portList/Application/' + ], + lhs: { + command: 'sys folder', + properties: {} + }, + command: 'sys folder' + }, + { + kind: 'D', + path: [ + '/portList/Application/firewallPortList1' + ], + lhs: { + command: 'security firewall port-list', + properties: {} + }, + command: 'security firewall port-list' } ]; + const result = fetch.tmshUpdateScript(context, desiredConfig, currentConfig, configDiff); assert.strictEqual( result.script, - 'cli script __appsvcs_update {\nproc script::run {} {\nif {[catch {\ntmsh::modify ltm data-group internal __appsvcs_update records none\n} err]} {\ntmsh::create ltm data-group internal __appsvcs_update type string records none\n}\nif { [catch {\ntmsh::begin_transaction\ntmsh::modify sys log-config publisher /TEST_Sys_Log_Config/App/logPublisher destinations none\ntmsh::delete sys log-config publisher /TEST_Sys_Log_Config/App/logPublisher\ntmsh::create sys log-config publisher /TEST_Sys_Log_Config/App/logPublisher description none destinations none\ntmsh::modify auth partition TEST_Sys_Log_Config description \\"Updated by AS3 at [clock format [clock seconds] -gmt true -format {%a, %d %b %Y %T %Z}]\\"\ntmsh::commit_transaction\n} err] } {\ncatch { tmsh::cancel_transaction } e\nregsub -all {"} $err {\\"} err\ntmsh::modify ltm data-group internal __appsvcs_update records add \\{ error \\{ data \\"$err\\" \\} \\}\n}}\n}' + 'cli script __appsvcs_update {\nproc script::run {} {\nif {[catch {\ntmsh::modify ltm data-group internal __appsvcs_update records none\n} err]} {\ntmsh::create ltm data-group internal __appsvcs_update type string records none\n}\nif { [catch {\ntmsh::delete ltm virtual /portList/Application/tcpService\ntmsh::begin_transaction\ntmsh::modify auth partition portList description \\"Updated by AS3 at [clock format [clock seconds] -gmt true -format {%a, %d %b %Y %T %Z}]\\"\ntmsh::delete ltm traffic-matching-criteria /portList/Application/tcpService_VS_TMC_OBJ\n\n\ntmsh::delete security firewall port-list /portList/Application/firewallPortList1\ntmsh::commit_transaction\ntmsh::delete ltm virtual-address /portList/192.0.2.1\ntmsh::delete sys folder /portList/Application/\ntmsh::delete sys folder /portList/\n} err] } {\ncatch { tmsh::cancel_transaction } e\nregsub -all {"} $err {\\"} err\ntmsh::modify ltm data-group internal __appsvcs_update records add \\{ error \\{ data \\"$err\\" \\} \\}\n}}\n}' ); }); - it('should properly delete the log publisher', () => { - const desiredConfig = {}; - const currentConfig = { + + it('should find referenced address lists inside the transaction and move them out if necessary', () => { + const desiredConfig = { + '/Tenant/Application/': { + command: 'sys folder', + properties: {}, + ignore: [] + }, + '/Tenant/Application/sourceAddressList': { + command: 'security firewall address-list', + properties: { + addresses: { + '192.168.100.0/24': {}, + '192.168.200.50-192.168.200.60': {} + }, + fqdns: {}, + geo: {}, + 'address-lists': {} + }, + ignore: [] + }, + '/Tenant/Application/destinationAddressList1': { + command: 'security firewall address-list', + properties: { + addresses: { + '192.168.40.0/24': {}, + '192.168.50.1-192.168.50.10': {} + }, + fqdns: {}, + geo: {}, + 'address-lists': {} + }, + ignore: [] + }, + '/Tenant/Application/destinationAddressList2': { + command: 'security firewall address-list', + properties: { + addresses: { + '192.168.60.0/24': {} + }, + fqdns: {}, + geo: {}, + 'address-lists': {} + }, + ignore: [] + }, + '/Tenant/Application/destinationAddressList3': { + command: 'security firewall address-list', + properties: { + addresses: { + '192.168.10.0/24': {}, + '192.168.20.20-192.168.20.50': {} + }, + fqdns: {}, + geo: {}, + 'address-lists': { + '/Tenant/Application/destinationAddressList1': {}, + '/Tenant/Application/destinationAddressList2': {} + } + }, + ignore: [] + }, + '/Tenant/Application/tcpService_VS_TMC_OBJ': { + command: 'ltm traffic-matching-criteria', + properties: { + protocol: 'tcp', + 'destination-address-inline': 'any/any', + 'destination-address-list': '/Tenant/Application/destinationAddressList3', + 'source-address-inline': '0.0.0.0/any', + 'source-address-list': '/Tenant/Application/sourceAddressList', + 'route-domain': 'any' + }, + ignore: [] + }, + '/Tenant/Application/tcpService': { + command: 'ltm virtual', + properties: { + enabled: true, + description: 'Application', + profiles: { + '/Common/f5-tcp-progressive': { + context: 'all' + } + }, + 'traffic-matching-criteria': '/Tenant/Application/tcpService_VS_TMC_OBJ' + }, + ignore: [] + }, + '/Tenant/': { + command: 'auth partition', + properties: { + 'default-route-domain': 0 + }, + ignore: [] + } + }; + + const currentConfig = {}; + + const configDiff = [ + { + kind: 'N', + path: [ + '/Tenant/Application/' + ], + rhs: { + command: 'sys folder', + properties: {}, + ignore: [] + }, + tags: [ + 'tmsh' + ], + command: 'sys folder' + }, + { + kind: 'N', + path: [ + '/Tenant/Application/sourceAddressList' + ], + rhs: { + command: 'security firewall address-list', + properties: { + addresses: { + '192.168.100.0/24': {}, + '192.168.200.50-192.168.200.60': {} + }, + fqdns: {}, + geo: {}, + 'address-lists': {} + }, + ignore: [] + }, + tags: [ + 'tmsh' + ], + command: 'security firewall address-list' + }, + { + kind: 'N', + path: [ + '/Tenant/Application/destinationAddressList1' + ], + rhs: { + command: 'security firewall address-list', + properties: { + addresses: { + '192.168.40.0/24': {}, + '192.168.50.1-192.168.50.10': {} + }, + fqdns: {}, + geo: {}, + 'address-lists': {} + }, + ignore: [] + }, + tags: [ + 'tmsh' + ], + command: 'security firewall address-list' + }, + { + kind: 'N', + path: [ + '/Tenant/Application/destinationAddressList2' + ], + rhs: { + command: 'security firewall address-list', + properties: { + addresses: { + '192.168.60.0/24': {} + }, + fqdns: {}, + geo: {}, + 'address-lists': {} + }, + ignore: [] + }, + tags: [ + 'tmsh' + ], + command: 'security firewall address-list' + }, + { + kind: 'N', + path: [ + '/Tenant/Application/destinationAddressList3' + ], + rhs: { + command: 'security firewall address-list', + properties: { + addresses: { + '192.168.10.0/24': {}, + '192.168.20.20-192.168.20.50': {} + }, + fqdns: {}, + geo: {}, + 'address-lists': { + '/Tenant/Application/destinationAddressList1': {}, + '/Tenant/Application/destinationAddressList2': {} + } + }, + ignore: [] + }, + tags: [ + 'tmsh' + ], + command: 'security firewall address-list' + }, + { + kind: 'N', + path: [ + '/Tenant/Application/tcpService_VS_TMC_OBJ' + ], + rhs: { + command: 'ltm traffic-matching-criteria', + properties: { + protocol: 'tcp', + 'destination-address-inline': 'any/any', + 'destination-address-list': '/Tenant/Application/destinationAddressList3', + 'source-address-inline': '0.0.0.0/any', + 'source-address-list': '/Tenant/Application/sourceAddressList', + 'route-domain': 'any' + }, + ignore: [] + }, + tags: [ + 'tmsh' + ], + command: 'ltm traffic-matching-criteria' + }, + { + kind: 'N', + path: [ + '/Tenant/Application/tcpService' + ], + rhs: { + command: 'ltm virtual', + properties: { + enabled: true, + description: 'Application', + profiles: { + '/Common/f5-tcp-progressive': { + context: 'all' + } + }, + 'traffic-matching-criteria': '/Tenant/Application/tcpService_VS_TMC_OBJ' + }, + ignore: [] + }, + tags: [ + 'tmsh' + ], + command: 'ltm virtual' + }, + { + kind: 'N', + path: [ + '/Tenant/' + ], + rhs: { + command: 'auth partition', + properties: { + 'default-route-domain': 0 + }, + ignore: [] + }, + tags: [ + 'tmsh' + ], + command: 'auth partition' + } + ]; + + const result = fetch.tmshUpdateScript(context, desiredConfig, currentConfig, configDiff); + assert.strictEqual( + result.script, + 'cli script __appsvcs_update {\nproc script::run {} {\nif {[catch {\ntmsh::modify ltm data-group internal __appsvcs_update records none\n} err]} {\ntmsh::create ltm data-group internal __appsvcs_update type string records none\n}\nif { [catch {\ntmsh::create auth partition Tenant default-route-domain 0\ntmsh::create sys folder /Tenant/Application/\ntmsh::create security firewall address-list /Tenant/Application/destinationAddressList1 addresses replace-all-with \\{ 192.168.40.0/24 192.168.50.1-192.168.50.10 \\} fqdns none geo none address-lists none\ntmsh::create security firewall address-list /Tenant/Application/destinationAddressList2 addresses replace-all-with \\{ 192.168.60.0/24 \\} fqdns none geo none address-lists none\ntmsh::create security firewall address-list /Tenant/Application/destinationAddressList3 addresses replace-all-with \\{ 192.168.10.0/24 192.168.20.20-192.168.20.50 \\} fqdns none geo none address-lists replace-all-with \\{ /Tenant/Application/destinationAddressList1 /Tenant/Application/destinationAddressList2 \\}\ntmsh::create security firewall address-list /Tenant/Application/sourceAddressList addresses replace-all-with \\{ 192.168.100.0/24 192.168.200.50-192.168.200.60 \\} fqdns none geo none address-lists none\ntmsh::create ltm traffic-matching-criteria /Tenant/Application/tcpService_VS_TMC_OBJ protocol tcp destination-address-inline any/any destination-address-list /Tenant/Application/destinationAddressList3 source-address-inline 0.0.0.0/any source-address-list /Tenant/Application/sourceAddressList route-domain any\ntmsh::begin_transaction\ntmsh::modify auth partition Tenant description \\"Updated by AS3 at [clock format [clock seconds] -gmt true -format {%a, %d %b %Y %T %Z}]\\"\ntmsh::create ltm virtual /Tenant/Application/tcpService enabled description Application profiles replace-all-with \\{ /Common/f5-tcp-progressive \\{ context all \\} \\} traffic-matching-criteria /Tenant/Application/tcpService_VS_TMC_OBJ\ntmsh::commit_transaction\ncatch { tmsh::delete ltm traffic-matching-criteria /Tenant/Application/tcpService_VS_TMC_OBJ protocol } e\ncatch { tmsh::delete security firewall address-list /Tenant/Application/sourceAddressList } e\ncatch { tmsh::delete security firewall address-list /Tenant/Application/destinationAddressList3 } e\n} err] } {\ncatch { tmsh::cancel_transaction } e\nregsub -all {"} $err {\\"} err\ntmsh::modify ltm data-group internal __appsvcs_update records add \\{ error \\{ data \\"$err\\" \\} \\}\ncatch { tmsh::delete security firewall address-list /Tenant/Application/destinationAddressList2 } e\ncatch { tmsh::delete security firewall address-list /Tenant/Application/destinationAddressList1 } e\ncatch { tmsh::delete sys folder /Tenant/Application/ } e\ncatch { tmsh::delete auth partition Tenant } e\n}}\n}' + ); + }); + + describe('no traffic-matching-criteria', () => { + let desiredConfig; + let currentConfig; + let configDiff; + + beforeEach(() => { + desiredConfig = {}; + currentConfig = { + '/portList/': { + command: 'auth partition', + properties: {} + }, + '/portList/Application/': { + command: 'sys folder', + properties: {} + } + }; + configDiff = [ + { + kind: 'D', + path: [ + '/portList/' + ], + lhs: { + command: 'auth partition', + properties: {} + }, + command: 'auth partition' + }, + { + kind: 'D', + path: [ + '/portList/Application/' + ], + lhs: { + command: 'sys folder', + properties: {} + }, + command: 'sys folder' + } + ]; + }); + + it('should delete virtuals without traffic-matching-criteria inside of transaction', () => { + currentConfig['/portList/Application/tcpService'] = { + command: 'ltm virtual', + properties: { + destination: '/portList/192.0.2.1:80' + } + }; + currentConfig['/portList/Service_Address-192.0.2.1'] = { + command: 'ltm virtual-address', + properties: { + address: '192.0.2.1' + } + }; + configDiff.push( + { + kind: 'D', + path: [ + '/portList/Application/tcpService' + ], + lhs: { + command: 'ltm virtual', + properties: { + destination: '/portList/192.0.2.1:80' + } + }, + command: 'ltm virtual' + } + ); + configDiff.push( + { + kind: 'D', + path: [ + '/portList/Service_Address-192.0.2.1' + ], + lhs: { + command: 'ltm virtual-address', + properties: {} + }, + command: 'ltm virtual-address' + } + ); + + const result = fetch.tmshUpdateScript(context, desiredConfig, currentConfig, configDiff); + assert.strictEqual( + result.script, + 'cli script __appsvcs_update {\nproc script::run {} {\nif {[catch {\ntmsh::modify ltm data-group internal __appsvcs_update records none\n} err]} {\ntmsh::create ltm data-group internal __appsvcs_update type string records none\n}\nif { [catch {\ntmsh::begin_transaction\ntmsh::modify auth partition portList description \\"Updated by AS3 at [clock format [clock seconds] -gmt true -format {%a, %d %b %Y %T %Z}]\\"\ntmsh::delete ltm virtual /portList/Application/tcpService\n\ntmsh::delete ltm virtual-address /portList/192.0.2.1\ntmsh::commit_transaction\ntmsh::delete sys folder /portList/Application/\n\ntmsh::delete sys folder /portList/\n} err] } {\ncatch { tmsh::cancel_transaction } e\nregsub -all {"} $err {\\"} err\ntmsh::modify ltm data-group internal __appsvcs_update records add \\{ error \\{ data \\"$err\\" \\} \\}\n}}\n}' + ); + }); + + it('should delete virtuals without traffic-matching-criteria inside of transaction with any', () => { + currentConfig['/portList/Application/tcpService'] = { + command: 'ltm virtual', + properties: { + destination: '/portList/any:80' + } + }; + currentConfig['/portList/Service_Address-any'] = { + command: 'ltm virtual-address', + properties: { + address: 'any' + } + }; + configDiff.push( + { + kind: 'D', + path: [ + '/portList/Application/tcpService' + ], + lhs: { + command: 'ltm virtual', + properties: { + destination: '/portList/any:80' + } + }, + command: 'ltm virtual' + } + ); + configDiff.push( + { + kind: 'D', + path: [ + '/portList/Service_Address-any' + ], + lhs: { + command: 'ltm virtual-address', + properties: {} + }, + command: 'ltm virtual-address' + } + ); + + const result = fetch.tmshUpdateScript(context, desiredConfig, currentConfig, configDiff); + assert.strictEqual( + result.script, + 'cli script __appsvcs_update {\nproc script::run {} {\nif {[catch {\ntmsh::modify ltm data-group internal __appsvcs_update records none\n} err]} {\ntmsh::create ltm data-group internal __appsvcs_update type string records none\n}\nif { [catch {\ntmsh::begin_transaction\ntmsh::modify auth partition portList description \\"Updated by AS3 at [clock format [clock seconds] -gmt true -format {%a, %d %b %Y %T %Z}]\\"\ntmsh::delete ltm virtual /portList/Application/tcpService\n\ntmsh::delete ltm virtual-address /portList/any\ntmsh::commit_transaction\ntmsh::delete sys folder /portList/Application/\n\ntmsh::delete sys folder /portList/\n} err] } {\ncatch { tmsh::cancel_transaction } e\nregsub -all {"} $err {\\"} err\ntmsh::modify ltm data-group internal __appsvcs_update records add \\{ error \\{ data \\"$err\\" \\} \\}\n}}\n}' + ); + }); + + it('should delete virtuals without traffic-matching-criteria inside of transaction with any6', () => { + currentConfig['/portList/Application/tcpService'] = { + command: 'ltm virtual', + properties: { + destination: '/portList/any6.80' + } + }; + currentConfig['/portList/Service_Address-any6'] = { + command: 'ltm virtual-address', + properties: { + address: 'any6' + } + }; + configDiff.push( + { + kind: 'D', + path: [ + '/portList/Application/tcpService' + ], + lhs: { + command: 'ltm virtual', + properties: { + destination: '/portList/any6.80' + } + }, + command: 'ltm virtual' + } + ); + configDiff.push( + { + kind: 'D', + path: [ + '/portList/Service_Address-any6' + ], + lhs: { + command: 'ltm virtual-address', + properties: {} + }, + command: 'ltm virtual-address' + } + ); + + const result = fetch.tmshUpdateScript(context, desiredConfig, currentConfig, configDiff); + assert.strictEqual( + result.script, + 'cli script __appsvcs_update {\nproc script::run {} {\nif {[catch {\ntmsh::modify ltm data-group internal __appsvcs_update records none\n} err]} {\ntmsh::create ltm data-group internal __appsvcs_update type string records none\n}\nif { [catch {\ntmsh::begin_transaction\ntmsh::modify auth partition portList description \\"Updated by AS3 at [clock format [clock seconds] -gmt true -format {%a, %d %b %Y %T %Z}]\\"\ntmsh::delete ltm virtual /portList/Application/tcpService\n\ntmsh::delete ltm virtual-address /portList/any6\ntmsh::commit_transaction\ntmsh::delete sys folder /portList/Application/\n\ntmsh::delete sys folder /portList/\n} err] } {\ncatch { tmsh::cancel_transaction } e\nregsub -all {"} $err {\\"} err\ntmsh::modify ltm data-group internal __appsvcs_update records add \\{ error \\{ data \\"$err\\" \\} \\}\n}}\n}' + ); + }); + }); + }); + + describe('pem policy', () => { + it('should properly setup preTrans, trans, and rollback during a delete', () => { + const desiredConfig = {}; + const currentConfig = { + '/TEST_Pem_Policy/App/testPemPolicy': { + command: 'pem policy', + properties: { + rules: { + theRule: { + 'tcp-optimization-downlink': '/TEST_Pem_Policy/App/testTcpProfile', + 'tcp-optimization-uplink': '/TEST_Pem_Policy/App/testTcpProfile', + 'dscp-marking-downlink': 'pass-through', + 'dscp-marking-uplink': 'pass-through', + precedence: 1 + } + } + }, + ignore: [] + } + }; + const configDiff = [ + { + kind: 'D', + path: [ + '/TEST_Pem_Policy/App/testPemPolicy' + ], + lhs: { + command: 'pem policy', + properties: { + rules: { + theRule: { + 'tcp-optimization-downlink': '/TEST_Pem_Policy/App/testTcpProfile', + 'tcp-optimization-uplink': '/TEST_Pem_Policy/App/testTcpProfile', + 'dscp-marking-downlink': 'pass-through', + 'dscp-marking-uplink': 'pass-through', + precedence: 1 + } + } + } + }, + tags: [ + 'tmsh' + ], + command: 'pem policy' + } + ]; + const result = fetch.tmshUpdateScript(context, desiredConfig, currentConfig, configDiff); + assert.strictEqual( + result.script, + 'cli script __appsvcs_update {\nproc script::run {} {\nif {[catch {\ntmsh::modify ltm data-group internal __appsvcs_update records none\n} err]} {\ntmsh::create ltm data-group internal __appsvcs_update type string records none\n}\nif { [catch {\ntmsh::modify pem policy /TEST_Pem_Policy/App/testPemPolicy rules modify \\{ theRule \\{ tcp-optimization-downlink none tcp-optimization-uplink none \\} \\}\ntmsh::begin_transaction\ntmsh::delete pem policy /TEST_Pem_Policy/App/testPemPolicy\ntmsh::modify auth partition TEST_Pem_Policy description \\"Updated by AS3 at [clock format [clock seconds] -gmt true -format {%a, %d %b %Y %T %Z}]\\"\ntmsh::commit_transaction\n} err] } {\ncatch { tmsh::cancel_transaction } e\nregsub -all {"} $err {\\"} err\ntmsh::modify ltm data-group internal __appsvcs_update records add \\{ error \\{ data \\"$err\\" \\} \\}\ncatch { tmsh::modify pem policy /TEST_Pem_Policy/App/testPemPolicy rules modify \\{ theRule \\{ tcp-optimization-downlink /TEST_Pem_Policy/App/testTcpProfile tcp-optimization-uplink /TEST_Pem_Policy/App/testTcpProfile \\} \\} } e\n}}\n}' + ); + }); + }); + + describe('sys log-config publisher', () => { + it('should properly modify the log publisher to empty destinations', () => { + const desiredConfig = { + '/TEST_Sys_Log_Config/App/logPublisher': { + command: 'sys log-config publisher', + properties: { + description: 'none', + destinations: {} + } + } + }; + const currentConfig = { + '/TEST_Sys_Log_Config/App/logPublisher': { + command: 'sys log-config publisher', + properties: { + description: 'Something Else', + destinations: { + '/TEST_Sys_Log_Config/App/logDestinationSyslog': {} + } + } + } + }; + const configDiff = [ + { + kind: 'E', + path: [ + '/TEST_Sys_Log_Config/App/logPublisher', + 'properties', + 'description' + ], + lhs: 'Something Else', + rhs: 'none', + tags: ['tmsh'], + command: 'sys log-config publisher' + }, + { + kind: 'D', + path: [ + '/TEST_Sys_Log_Config/App/logPublisher', + 'properties', + 'destinations', + '/TEST_Sys_Log_Config/App/logDest' + ], + lhs: {}, + tags: ['tmsh'], + command: 'sys log-config publisher' + } + ]; + const result = fetch.tmshUpdateScript(context, desiredConfig, currentConfig, configDiff); + assert.strictEqual( + result.script, + 'cli script __appsvcs_update {\nproc script::run {} {\nif {[catch {\ntmsh::modify ltm data-group internal __appsvcs_update records none\n} err]} {\ntmsh::create ltm data-group internal __appsvcs_update type string records none\n}\nif { [catch {\ntmsh::begin_transaction\ntmsh::modify sys log-config publisher /TEST_Sys_Log_Config/App/logPublisher destinations none\ntmsh::delete sys log-config publisher /TEST_Sys_Log_Config/App/logPublisher\ntmsh::create sys log-config publisher /TEST_Sys_Log_Config/App/logPublisher description none destinations none\ntmsh::modify auth partition TEST_Sys_Log_Config description \\"Updated by AS3 at [clock format [clock seconds] -gmt true -format {%a, %d %b %Y %T %Z}]\\"\ntmsh::commit_transaction\n} err] } {\ncatch { tmsh::cancel_transaction } e\nregsub -all {"} $err {\\"} err\ntmsh::modify ltm data-group internal __appsvcs_update records add \\{ error \\{ data \\"$err\\" \\} \\}\n}}\n}' + ); + }); + it('should properly delete the log publisher', () => { + const desiredConfig = {}; + const currentConfig = { '/TEST_Sys_Log_Config/App/logPublisher': { command: 'sys log-config publisher', properties: { @@ -4293,7 +5364,7 @@ describe('fetch', () => { sinon.stub(util, 'iControlRequest').resolves({ statusCode: 404 }); return fetch.getDiff(context, currentConfig, desiredConfig, commonConfig, {}) .then((actualDiffs) => { - assert.deepEqual(actualDiffs, []); + assert.deepStrictEqual(actualDiffs, []); }); }); @@ -4903,7 +5974,7 @@ describe('fetch', () => { + 'tmsh::cd /tenant\n' + 'foreach {node} [tmsh::get_config /ltm node] {\n' + ' tmsh::delete ltm node [tmsh::get_name $node]\n}\n' - + 'tmsh::cd /\n' + + 'tmsh::cd /Common\n' + 'tmsh::delete sys folder /tenant/app/\n' + 'tmsh::delete sys folder /tenant/\n' + '} err] } {\ncatch { tmsh::cancel_transaction } e\n' @@ -4938,7 +6009,7 @@ describe('fetch', () => { return fetch.gatherAccessProfileItems(context, partition, config) .then((result) => { - assert.deepEqual(result, []); + assert.deepStrictEqual(result, []); assert.deepStrictEqual(context.tasks, [{}]); }); }); @@ -4963,7 +6034,7 @@ describe('fetch', () => { ]; return fetch.gatherAccessProfileItems(context, 'thePartition', config) .then((result) => { - assert.deepEqual( + assert.deepStrictEqual( result, [ '/thePartition/accessProfile-sp_transfer', @@ -5031,7 +6102,7 @@ describe('fetch', () => { return fetch.gatherAccessProfileItems(context, 'thePartition', config) .then((result) => { - assert.deepEqual( + assert.deepStrictEqual( result, [ '/thePartition/accessProfile-sp_transfer', @@ -5123,7 +6194,7 @@ describe('fetch', () => { urlPrefix: 'http://localhost:8100' } ]); - assert.deepEqual(result, []); + assert.deepStrictEqual(result, []); }); }); @@ -5162,7 +6233,7 @@ describe('fetch', () => { } } ]); - assert.deepEqual(result, []); + assert.deepStrictEqual(result, []); }); }); @@ -5182,7 +6253,7 @@ describe('fetch', () => { ]; return fetch.gatherAccessProfileItems(context, 'Common', config) .then((result) => { - assert.deepEqual(result, ['Profile/Policy']); + assert.deepStrictEqual(result, ['Profile/Policy']); }); }); }); @@ -5262,115 +6333,303 @@ describe('fetch', () => { ], expected: [ { - kind: 'tm:auth:partition:partitionstate', - name: 'test', - fullPath: 'test', - selfLink: 'https://localhost/mgmt/tm/auth/partition/test?ver=13.1.1' + kind: 'tm:auth:partition:partitionstate', + name: 'test', + fullPath: 'test', + selfLink: 'https://localhost/mgmt/tm/auth/partition/test?ver=13.1.1' + }, + { + kind: 'tm:sys:folder:folderstate', + name: 'test_w11', + partition: 'test', + fullPath: '/test/test_w11', + generation: 26456, + selfLink: 'https://localhost/mgmt/tm/sys/folder/~test~test_w11?ver=13.1.1', + deviceGroup: 'none', + hidden: 'false', + inheritedDevicegroup: 'true', + inheritedTrafficGroup: 'true', + noRefCheck: 'false', + trafficGroup: '/Common/traffic-group-1', + trafficGroupReference: { + link: 'https://localhost/mgmt/tm/cm/traffic-group/~Common~traffic-group-1?ver=13.1.1' + } + } + ] + }, + { + name: 'remove hidden access-policy created by apm profile of same name', + config: [ + { + kind: 'tm:apm:profile:access:accessstate', + name: 'accessProfile', + partition: 'Tenant', + accessPolicy: '/Tenant/accessProfile' + }, + { + kind: 'tm:apm:policy:access-policy:access-policystate', + name: 'accessPolicy', + partition: 'Tenant', + fullPath: '/Tenant/accessProfile' + }, + { + kind: 'tm:apm:policy:access-policy:access-policystate', + name: 'accessPolicy', + partition: 'Tenant', + fullPath: '/Tenant/accessPolicy' + } + ], + expected: [ + { + kind: 'tm:apm:profile:access:accessstate', + name: 'accessProfile', + partition: 'Tenant', + accessPolicy: '/Tenant/accessProfile' + }, + { + kind: 'tm:apm:policy:access-policy:access-policystate', + name: 'accessPolicy', + partition: 'Tenant', + fullPath: '/Tenant/accessPolicy' + } + ] + }, + { + name: 'remove hidden access-policy referred to by the macros property of another access-policy', + config: [ + { + kind: 'tm:apm:policy:access-policy:access-policystate', + name: 'accessPolicy', + partition: 'Tenant', + fullPath: '/Tenant/accessPolicy' + }, + { + kind: 'tm:apm:policy:access-policy:access-policystate', + name: 'accessProfile', + partition: 'Tenant', + fullPath: '/Tenant/accessProfile', + macros: [ + '/Tenant/accessProfile-sub_1', + '/Tenant/accessProfile-sub_2' + ] + }, + { + kind: 'tm:apm:policy:access-policy:access-policystate', + name: 'accessProfile-sub_1', + partition: 'Tenant', + fullPath: '/Tenant/accessProfile-sub_1' + }, + { + kind: 'tm:apm:policy:access-policy:access-policystate', + name: 'accessProfile-sub_2', + partition: 'Tenant', + fullPath: '/Tenant/accessProfile-sub_2' + } + ], + expected: [ + { + kind: 'tm:apm:policy:access-policy:access-policystate', + name: 'accessPolicy', + partition: 'Tenant', + fullPath: '/Tenant/accessPolicy' + }, + { + kind: 'tm:apm:policy:access-policy:access-policystate', + name: 'accessProfile', + partition: 'Tenant', + fullPath: '/Tenant/accessProfile', + macros: [ + '/Tenant/accessProfile-sub_1', + '/Tenant/accessProfile-sub_2' + ] + } + ] + }, + { + name: 'remove destination address lists addresses in non-Common tenant', + config: [ + { + fullPath: '/Tenant/myAddressList', + addresses: [ + { name: '192.0.2.10/32' } + ] + }, + { + kind: 'tm:ltm:traffic-matching-criteria:traffic-matching-criteriastate', + destinationAddressList: '/Tenant/myAddressList' + }, + { + kind: 'tm:ltm:virtual-address:virtual-addressstate', + address: '192.0.2.10' + }, + { + kind: 'tm:ltm:virtual-address:virtual-addressstate', + address: '192.0.2.20' + } + ], + expected: [ + { + fullPath: '/Tenant/myAddressList', + addresses: [ + { name: '192.0.2.10/32' } + ] + }, + { + kind: 'tm:ltm:traffic-matching-criteria:traffic-matching-criteriastate', + destinationAddressList: '/Tenant/myAddressList' + }, + { + kind: 'tm:ltm:virtual-address:virtual-addressstate', + address: '192.0.2.20' + } + ] + }, + { + name: 'remove destination address lists addresses in Common tenant', + config: [ + { + kind: 'tm:ltm:traffic-matching-criteria:traffic-matching-criteriastate', + destinationAddressList: '/Common/myAddressList' + }, + { + kind: 'tm:ltm:virtual-address:virtual-addressstate', + address: '192.0.2.10' + }, + { + kind: 'tm:ltm:virtual-address:virtual-addressstate', + address: '192.0.2.20' + } + ], + commonConfig: { + addressListList: [ + { + fullPath: '/Common/myAddressList', + addresses: [ + { name: '192.0.2.10/32' } + ] + } + ] + }, + expected: [ + { + kind: 'tm:ltm:traffic-matching-criteria:traffic-matching-criteriastate', + destinationAddressList: '/Common/myAddressList' }, { - kind: 'tm:sys:folder:folderstate', - name: 'test_w11', - partition: 'test', - fullPath: '/test/test_w11', - generation: 26456, - selfLink: 'https://localhost/mgmt/tm/sys/folder/~test~test_w11?ver=13.1.1', - deviceGroup: 'none', - hidden: 'false', - inheritedDevicegroup: 'true', - inheritedTrafficGroup: 'true', - noRefCheck: 'false', - trafficGroup: '/Common/traffic-group-1', - trafficGroupReference: { - link: 'https://localhost/mgmt/tm/cm/traffic-group/~Common~traffic-group-1?ver=13.1.1' - } + kind: 'tm:ltm:virtual-address:virtual-addressstate', + address: '192.0.2.20' } ] }, { - name: 'remove hidden access-policy created by apm profile of same name', + name: 'remove destination address lists addresses that match range', config: [ { - kind: 'tm:apm:profile:access:accessstate', - name: 'accessProfile', - partition: 'Tenant', - accessPolicy: '/Tenant/accessProfile' + fullPath: '/Tenant/myAddressList', + addresses: [ + { name: '192.0.2.10-192.0.2.20' } + ] }, { - kind: 'tm:apm:policy:access-policy:access-policystate', - name: 'accessPolicy', - partition: 'Tenant', - fullPath: '/Tenant/accessProfile' + kind: 'tm:ltm:traffic-matching-criteria:traffic-matching-criteriastate', + destinationAddressList: '/Tenant/myAddressList' }, { - kind: 'tm:apm:policy:access-policy:access-policystate', - name: 'accessPolicy', - partition: 'Tenant', - fullPath: '/Tenant/accessPolicy' + kind: 'tm:ltm:virtual-address:virtual-addressstate', + address: '192.0.2.10' + }, + { + kind: 'tm:ltm:virtual-address:virtual-addressstate', + address: '192.0.2.15' + }, + { + kind: 'tm:ltm:virtual-address:virtual-addressstate', + address: '192.0.2.30' } ], expected: [ { - kind: 'tm:apm:profile:access:accessstate', - name: 'accessProfile', - partition: 'Tenant', - accessPolicy: '/Tenant/accessProfile' + fullPath: '/Tenant/myAddressList', + addresses: [ + { name: '192.0.2.10-192.0.2.20' } + ] }, { - kind: 'tm:apm:policy:access-policy:access-policystate', - name: 'accessPolicy', - partition: 'Tenant', - fullPath: '/Tenant/accessPolicy' + kind: 'tm:ltm:traffic-matching-criteria:traffic-matching-criteriastate', + destinationAddressList: '/Tenant/myAddressList' + }, + { + kind: 'tm:ltm:virtual-address:virtual-addressstate', + address: '192.0.2.30' } ] }, { - name: 'remove hidden access-policy referred to by the macros property of another access-policy', + name: 'remove destination address list addresses in referenced lists', config: [ { - kind: 'tm:apm:policy:access-policy:access-policystate', - name: 'accessPolicy', - partition: 'Tenant', - fullPath: '/Tenant/accessPolicy' + fullPath: '/Tenant/Application/myAddressList', + addresses: [ + { name: '192.0.2.10/32' } + ], + addressLists: [ + { + name: 'myOtherAddressList', + partition: 'Tenant', + subPath: 'Application' + } + ] }, { - kind: 'tm:apm:policy:access-policy:access-policystate', - name: 'accessProfile', - partition: 'Tenant', - fullPath: '/Tenant/accessProfile', - macros: [ - '/Tenant/accessProfile-sub_1', - '/Tenant/accessProfile-sub_2' + fullPath: '/Tenant/Application/myOtherAddressList', + addresses: [ + { name: '192.0.2.200/32' } ] }, { - kind: 'tm:apm:policy:access-policy:access-policystate', - name: 'accessProfile-sub_1', - partition: 'Tenant', - fullPath: '/Tenant/accessProfile-sub_1' + kind: 'tm:ltm:traffic-matching-criteria:traffic-matching-criteriastate', + destinationAddressList: '/Tenant/Application/myAddressList' }, { - kind: 'tm:apm:policy:access-policy:access-policystate', - name: 'accessProfile-sub_2', - partition: 'Tenant', - fullPath: '/Tenant/accessProfile-sub_2' + kind: 'tm:ltm:virtual-address:virtual-addressstate', + address: '192.0.2.10' + }, + { + kind: 'tm:ltm:virtual-address:virtual-addressstate', + address: '192.0.2.20' + }, + { + kind: 'tm:ltm:virtual-address:virtual-addressstate', + address: '192.0.2.200' } ], expected: [ { - kind: 'tm:apm:policy:access-policy:access-policystate', - name: 'accessPolicy', - partition: 'Tenant', - fullPath: '/Tenant/accessPolicy' + fullPath: '/Tenant/Application/myAddressList', + addresses: [ + { name: '192.0.2.10/32' } + ], + addressLists: [ + { + name: 'myOtherAddressList', + partition: 'Tenant', + subPath: 'Application' + } + ] }, { - kind: 'tm:apm:policy:access-policy:access-policystate', - name: 'accessProfile', - partition: 'Tenant', - fullPath: '/Tenant/accessProfile', - macros: [ - '/Tenant/accessProfile-sub_1', - '/Tenant/accessProfile-sub_2' + fullPath: '/Tenant/Application/myOtherAddressList', + addresses: [ + { name: '192.0.2.200/32' } ] + }, + { + kind: 'tm:ltm:traffic-matching-criteria:traffic-matching-criteriastate', + destinationAddressList: '/Tenant/Application/myAddressList' + }, + { + kind: 'tm:ltm:virtual-address:virtual-addressstate', + address: '192.0.2.20' } ] } @@ -5378,7 +6637,7 @@ describe('fetch', () => { filterTestCases.forEach((testCase) => { it(`should ${testCase.name}`, () => { - const actualConfig = fetch.filterAs3Items(testCase.config); + const actualConfig = fetch.filterAs3Items(context, testCase.config, testCase.commonConfig); assert.deepStrictEqual(actualConfig, testCase.expected); }); }); @@ -5989,6 +7248,371 @@ describe('fetch', () => { }); }); }); + + describe('per-app', () => { + beforeEach(() => { + commonConfig = { + nodeList: [], + virtualAddressList: [] + }; + context.request = { + postProcessing: [], + isPerApp: true, + perAppInfo: { + tenant: 'tenant', + apps: [] + } + }; + }); + + it('should pull just the application in tenant when application is specified', () => { + const tenantId = 'My_tenant'; + const appId = 'My_app'; + const poolId = 'My_pool'; + context.target.tmosVersion = '14.1.0'; + context.control = { + host: 'localhost' + }; + context.request.isPerApp = true; + context.request.perAppInfo = { + tenant: tenantId, + apps: [appId] + }; + const declaration = { + [tenantId]: { + class: 'Tenant', + enable: true, + [appId]: { + class: 'Application', + template: 'generic', + [poolId]: { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 10, + minimumMonitors: 1 + }, + enable: true + }, + appOther: { + class: 'Application', + template: 'generic', + poolOther: { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 10, + minimumMonitors: 1 + }, + enable: true + } + } + }; + + return fetch.getDesiredConfig(context, tenantId, declaration, commonConfig) + .then((desiredConfig) => { + assert.strictEqual(Object.keys(desiredConfig[`/${tenantId}/`]).length, 3, 'should only have 3 entries in the desired config'); + assert.strictEqual(desiredConfig['/My_tenant/'].command, 'auth partition'); + assert.strictEqual(desiredConfig['/My_tenant/My_app/'].command, 'sys folder'); + assert.strictEqual(desiredConfig['/My_tenant/My_app/My_pool'].command, 'ltm pool'); + assert.strictEqual(desiredConfig['/My_tenant/My_app/My_pool'].properties['load-balancing-mode'], 'round-robin'); + assert.strictEqual(typeof desiredConfig['/My_tenant/appOther/'], 'undefined'); // Should NOT include unspecified app + }); + }); + + it('should pull the application in tenant when application is NOT specified', () => { + const tenantId = 'My_tenant'; + const appId = 'My_app'; + const poolId = 'My_pool'; + context.target.tmosVersion = '14.1.0'; + context.control = { + host: 'localhost' + }; + context.request.isPerApp = true; + context.request.perAppInfo = { + tenant: tenantId, + apps: [] + }; + const declaration = { + [tenantId]: { + class: 'Tenant', + enable: true, + [appId]: { + class: 'Application', + template: 'generic', + [poolId]: { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 10, + minimumMonitors: 1 + }, + enable: true + }, + appOther: { + class: 'Application', + template: 'generic', + poolOther: { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 10, + minimumMonitors: 1 + }, + enable: true + } + } + }; + + return fetch.getDesiredConfig(context, tenantId, declaration, commonConfig) + .then((desiredConfig) => { + assert.strictEqual(Object.keys(desiredConfig[`/${tenantId}/`]).length, 3, 'should only have 3 entries in the desired config'); + assert.strictEqual(desiredConfig[`/${tenantId}/`].command, 'auth partition'); + assert.strictEqual(desiredConfig[`/${tenantId}/${appId}/`].command, 'sys folder'); + assert.strictEqual(desiredConfig[`/${tenantId}/${appId}/${poolId}`].command, 'ltm pool'); + assert.strictEqual(desiredConfig[`/${tenantId}/${appId}/${poolId}`].properties['load-balancing-mode'], 'round-robin'); + assert.strictEqual(desiredConfig[`/${tenantId}/appOther/`].command, 'sys folder'); + assert.strictEqual(desiredConfig[`/${tenantId}/appOther/poolOther`].command, 'ltm pool'); + assert.strictEqual(desiredConfig[`/${tenantId}/appOther/poolOther`].properties['load-balancing-mode'], 'round-robin'); + }); + }); + }); + }); + + describe('.getTenantConfig', () => { + let tenantId; + let commonConfig; + let isOneOfProvisionedStub; + + beforeEach(() => { + context.target.tmosVersion = '17.1'; // Needed for getBigipConfig filter + tenantId = 'tenant1'; + commonConfig = { + nodeList: [], + virtualAddressList: [] + }; + + sinon.stub(fullPathList, 'root').value([ // Abbreviated for testing purposes, lines up with nock + { endpoint: '/mgmt/tm/auth/partition' }, + { endpoint: '/mgmt/tm/sys/folder' }, + { endpoint: '/mgmt/tm/ltm/pool' } + ]); + + nock('http://localhost:8100') + .get('/mgmt/tm/auth/partition/') + .reply(200, { + kind: 'tm:auth:partition:partitioncollectionstate', + selfLink: 'https://localhost/mgmt/tm/auth/partition?$filter=partition+eq+tenant1', + items: [ + { + kind: 'tm:auth:partition:partitionstate', + name: 'Common', + fullPath: 'Common', + selfLink: 'https://localhost/mgmt/tm/auth/partition/Common', + defaultRouteDomain: 0 + }, + { + kind: 'tm:auth:partition:partitionstate', + name: 'tenant1', + fullPath: 'tenant1', + selfLink: 'https://localhost/mgmt/tm/auth/partition/tenant1', + defaultRouteDomain: 0 + } + ] + }) + .get('/mgmt/tm/auth/partition?$filter=partition%20eq%20tenant1') + .reply(200, { + kind: 'tm:auth:partition:partitioncollectionstate', + selfLink: 'https://localhost/mgmt/tm/auth/partition?$filter=partition+eq+tenant1', + items: [ + { + kind: 'tm:auth:partition:partitionstate', + name: 'tenant1', + fullPath: 'tenant1', + selfLink: 'https://localhost/mgmt/tm/auth/partition/tenant1', + defaultRouteDomain: 0 + } + ] + }) + .get('/mgmt/tm/sys/folder?$filter=partition%20eq%20tenant1') + .reply(200, { + kind: 'tm:sys:folder:foldercollectionstate', + selfLink: 'https://localhost/mgmt/tm/sys/folder?$filter=partition+eq+tenant1', + items: [ + { + kind: 'tm:sys:folder:folderstate', + name: 'app1', + partition: 'tenant1', + fullPath: '/tenant1/app1', + noRefCheck: 'false', + trafficGroup: '/Common/traffic-group-1' + }, + { + kind: 'tm:sys:folder:folderstate', + name: 'app2', + partition: 'tenant1', + fullPath: '/tenant1/app2', + noRefCheck: 'false', + trafficGroup: '/Common/traffic-group-1' + } + ] + }) + .get('/mgmt/tm/ltm/pool?$filter=partition%20eq%20tenant1') + .reply(200, { + kind: 'tm:ltm:pool:poolcollectionstate', + selfLink: 'https://localhost/mgmt/tm/ltm/pool?$filter=partition+eq+tenant1&expandSubcollections=true', + items: + [{ + kind: 'tm:ltm:pool:poolstate', + name: 'pool1', + partition: 'tenant1', + subPath: 'app1', + fullPath: '/tenant1/app1/pool1', + ipTosToServer: 'pass-through', + linkQosToClient: 'pass-through', + linkQosToServer: 'pass-through', + membersReference: {} + }, + { + kind: 'tm:ltm:pool:poolstate', + name: 'pool1', + partition: 'tenant1', + subPath: 'app2', + fullPath: '/tenant1/app2/pool1', + ipTosToServer: 'pass-through', + linkQosToClient: 'pass-through', + linkQosToServer: 'pass-through', + membersReference: {} + }] + }); + isOneOfProvisionedStub = sinon.stub(util, 'isOneOfProvisioned').resolves(true); + }); + + describe('per-tenant', () => { + it('should return early if iControlRequest lacks the tenantId', () => { + tenantId = 'tenantOther'; + return Promise.resolve() + .then(() => fetch.getTenantConfig(context, tenantId, commonConfig)) + .then((results) => { + assert.deepStrictEqual(results, {}); + assert.strictEqual(isOneOfProvisionedStub.called, false, 'isOneOfProvisioned should NOT have been called'); + }); + }); + + it('should return actionable items if tenant exists', () => { + tenantId = 'tenant1'; + return Promise.resolve() + .then(() => fetch.getTenantConfig(context, tenantId, commonConfig)) + .then((results) => { + assert.deepStrictEqual( + results, + { + '/tenant1/': { + command: 'auth partition', + properties: { 'default-route-domain': 0 }, + ignore: [] + }, + '/tenant1/app1/': { command: 'sys folder', properties: {}, ignore: [] }, + '/tenant1/app2/': { command: 'sys folder', properties: {}, ignore: [] }, + '/tenant1/app1/pool1': { + command: 'ltm pool', properties: { members: {}, metadata: {} }, ignore: [] + }, + '/tenant1/app2/pool1': { + command: 'ltm pool', properties: { members: {}, metadata: {} }, ignore: [] + } + } + ); + assert.strictEqual(isOneOfProvisionedStub.called, true, 'isOneOfProvisioned should have been called at least once'); + }); + }); + }); + + describe('per-app', () => { + it('should return early if iControlRequest lacks the tenantId', () => { + tenantId = 'tenantOther'; + context.request.isPerApp = true; + context.request.perAppInfo = { + tenant: tenantId, + apps: [] + }; + return Promise.resolve() + .then(() => fetch.getTenantConfig(context, tenantId, commonConfig)) + .then((results) => { + assert.deepStrictEqual(results, {}); + assert.strictEqual(isOneOfProvisionedStub.called, false, 'isOneOfProvisioned should NOT have been called'); + }); + }); + + it('should filter out any applications not in the declaration', () => { + tenantId = 'tenant1'; + + context.request.isPerApp = true; + context.request.perAppInfo = { + tenant: tenantId, + apps: ['app1'] + }; + return Promise.resolve() + .then(() => fetch.getTenantConfig(context, tenantId, commonConfig)) + .then((results) => { + assert.deepStrictEqual( + results, + { + '/tenant1/': { + command: 'auth partition', + properties: { 'default-route-domain': 0 }, + ignore: [] + }, + '/tenant1/app1/': { command: 'sys folder', properties: {}, ignore: [] }, + '/tenant1/app1/pool1': { + command: 'ltm pool', properties: { members: {}, metadata: {} }, ignore: [] + } + } + ); + assert.strictEqual(isOneOfProvisionedStub.called, true, 'isOneOfProvisioned should have been called at least once'); + }); + }); + + it('should return actionable items if tenant exists and application is undefined', () => { + tenantId = 'tenant1'; + + context.request.isPerApp = true; + context.request.perAppInfo = { + tenant: tenantId, + apps: [] + }; + return Promise.resolve() + .then(() => fetch.getTenantConfig(context, tenantId, commonConfig)) + .then((results) => { + assert.deepStrictEqual( + results, + { + '/tenant1/': { + command: 'auth partition', + properties: { 'default-route-domain': 0 }, + ignore: [] + }, + '/tenant1/app1/': { command: 'sys folder', properties: {}, ignore: [] }, + '/tenant1/app2/': { command: 'sys folder', properties: {}, ignore: [] }, + '/tenant1/app1/pool1': { + command: 'ltm pool', properties: { members: {}, metadata: {} }, ignore: [] + }, + '/tenant1/app2/pool1': { + command: 'ltm pool', properties: { members: {}, metadata: {} }, ignore: [] + } + } + ); + assert.strictEqual(isOneOfProvisionedStub.called, true, 'isOneOfProvisioned should have been called at least once'); + }); + }); + }); }); describe('updateWildcardMonitorDiffs', () => { @@ -6161,7 +7785,7 @@ describe('fetch', () => { return fetch.getDiff(context, currConf, desiredConf, commonConf, {}) .then((actualDiffs) => { - assert.deepEqual(actualDiffs, expectedDiffs); + assert.deepStrictEqual(actualDiffs, expectedDiffs); // Note: the /tenant/app/tenant_mon1 is removed from the currConf during getDiff const actualCmds = fetch.tmshUpdateScript( @@ -6190,7 +7814,7 @@ describe('fetch', () => { 'tmsh::delete ltm monitor https /tenant/app/tenant_mon2', 'tmsh::create ltm monitor https /tenant/app/tenant_mon2 destination *:119 interval 20', 'tmsh::delete ltm pool /tenant/app/tenant_pool', - 'tmsh::create ltm pool /tenant/app/tenant_pool members replace-all-with \\{ /Common/10.70.61.10:9021 \\{ metadata replace-all-with \\{ source \\{ value declaration \\} \\} \\} /Common/10.70.61.11:9021 \\{ metadata replace-all-with \\{ source \\{ value declaration \\} \\} \\} /Common/10.70.61.9:9021 \\{ monitor min 1 of \\{ /Common/gateway_icmp \\} metadata replace-all-with \\{ source \\{ value declaration \\} \\} \\} \\} monitor min 1 of \\{ /tenant/app/tenant_mon1 /Common/gateway_icmp \\}', + 'tmsh::create ltm pool /tenant/app/tenant_pool members replace-all-with \\{ /Common/10.70.61.10:9021 /Common/10.70.61.11:9021 /Common/10.70.61.9:9021 \\{ monitor min 1 of \\{ /Common/gateway_icmp \\} \\} \\} monitor min 1 of \\{ /tenant/app/tenant_mon1 /Common/gateway_icmp \\}', 'tmsh::commit_transaction', '} err] } {', 'catch { tmsh::cancel_transaction } e', @@ -6290,7 +7914,7 @@ describe('fetch', () => { return fetch.getDiff(context, currConf, desiredConf, commonConf, {}) .then((actualDiffs) => { - assert.deepEqual(actualDiffs, expectedDiffs); + assert.deepStrictEqual(actualDiffs, expectedDiffs); const actualScript = fetch.tmshUpdateScript(context, desiredConf, currConf, actualDiffs).script; const actualCmds = actualScript.split('\n'); @@ -6396,7 +8020,7 @@ describe('fetch', () => { }; fetch.updateAddressesWithRouteDomain(configs, 'Tenant'); - assert.deepEqual(configs['/Tenant/Application/L4'].properties.destination, '/Tenant/192.0.2.0:8080'); + assert.deepStrictEqual(configs['/Tenant/Application/L4'].properties.destination, '/Tenant/192.0.2.0:8080'); }); it('should handle IPv6', () => { @@ -6416,7 +8040,7 @@ describe('fetch', () => { }; fetch.updateAddressesWithRouteDomain(configs, 'Tenant'); - assert.deepEqual( + assert.deepStrictEqual( configs['/Tenant/Application/L4'].properties.destination, '/Tenant/2001:db8::28.8080' ); }); @@ -6440,7 +8064,7 @@ describe('fetch', () => { }; fetch.updateAddressesWithRouteDomain(configs, 'Tenant'); - assert.deepEqual( + assert.deepStrictEqual( configs['/Tenant/Application/L4'].properties.destination, '/Tenant/192.0.2.0%100:8080' ); }); @@ -6462,7 +8086,7 @@ describe('fetch', () => { }; fetch.updateAddressesWithRouteDomain(configs, 'Tenant'); - assert.deepEqual( + assert.deepStrictEqual( configs['/Tenant/Application/L4'].properties.destination, '/Tenant/2001:db8::28%100.8080' ); }); @@ -6485,7 +8109,7 @@ describe('fetch', () => { } }; fetch.updateAddressesWithRouteDomain(configs, 'forwarding_vs'); - assert.deepEqual( + assert.deepStrictEqual( configs['/forwarding_vs/forwarding_vs/forward_any_to_any'].properties.destination, '/forwarding_vs/0.0.0.0%100:0' ); }); @@ -6506,7 +8130,7 @@ describe('fetch', () => { } }; fetch.updateAddressesWithRouteDomain(configs, 'forwarding_vs'); - assert.deepEqual( + assert.deepStrictEqual( configs['/forwarding_vs/forwarding_vs/forward_any_to_any'].properties.destination, '/forwarding_vs/0.0.0.0%100:0' ); }); @@ -6527,7 +8151,7 @@ describe('fetch', () => { } }; fetch.updateAddressesWithRouteDomain(configs, 'forwarding_vs'); - assert.deepEqual( + assert.deepStrictEqual( configs['/forwarding_vs/forwarding_vs/forward_any_to_any'].properties.destination, '/forwarding_vs/::%100.0' ); }); @@ -6548,7 +8172,7 @@ describe('fetch', () => { } }; fetch.updateAddressesWithRouteDomain(configs, 'forwarding_vs'); - assert.deepEqual( + assert.deepStrictEqual( configs['/forwarding_vs/forwarding_vs/forward_any_to_any'].properties.destination, '/forwarding_vs/::%100.0' ); }); diff --git a/test/unit/lib/ltmPolicyParser.js b/test/unit/lib/ltmPolicyParser.js index 60568de1..93b9fb08 100644 --- a/test/unit/lib/ltmPolicyParser.js +++ b/test/unit/lib/ltmPolicyParser.js @@ -40,7 +40,7 @@ describe('LTM Policy Parsing', () => { it('should generate top level branches', () => { const actionBranches = Object.keys(parserSource.action.branches); const conditionBranches = Object.keys(parserSource.condition.branches); - assert.equal(actionBranches.length, 29, '29 action branches exist'); + assert.equal(actionBranches.length, 30, '30 action branches exist'); assert.equal(conditionBranches.length, 19, '19 condition branches exist'); assert(parserSource.action.branches['http-cookie'], 'http-cookie is in top level branches'); }); diff --git a/test/unit/lib/map_as3.js b/test/unit/lib/map_as3.js index c764436c..cf1882e4 100644 --- a/test/unit/lib/map_as3.js +++ b/test/unit/lib/map_as3.js @@ -147,6 +147,14 @@ describe('map_as3', () => { input: { type: 'waf' }, expected: 'asm request disable' }, + { + input: { type: 'botDefense', profile: { bigip: '/Common/myProfile' } }, + expected: 'bot-defense request enable from-profile /Common/myProfile' + }, + { + input: { type: 'botDefense' }, + expected: 'bot-defense request disable' + }, { input: { type: 'drop' }, expected: 'shutdown client-accepted connection' @@ -367,7 +375,17 @@ describe('map_as3', () => { reselectTries: 0, serviceDownAction: 'none', slowRampTime: 10, - minimumMonitors: 1 + minimumMonitors: 1, + metadata: { + example: { + value: 'test', + persist: true + }, + example1: { + value: '123', + persist: false + } + } }; }); @@ -382,8 +400,17 @@ describe('map_as3', () => { properties: { 'load-balancing-mode': 'round-robin', members: {}, + metadata: { + example: { + persist: 'true', + value: 'test' + }, + example1: { + persist: 'false', + value: '123' + } + }, 'min-active-members': 1, - minimumMonitors: 1, 'reselect-tries': 0, 'service-down-action': 'none', 'slow-ramp-time': 10 @@ -442,6 +469,12 @@ describe('map_as3', () => { ); }); + it('should remove minimumMonitors if no monitors defined', () => { + const config = translate.Pool(defaultContext, 'tenantId', 'appId', 'myPool', item).configs[0]; + assert.isUndefined(config.properties.monitors); + assert.isUndefined(config.properties.minimumMonitors); + }); + describe('with Service Discovery', () => { beforeEach(() => { item.members = [ @@ -549,8 +582,17 @@ describe('map_as3', () => { path: '/tenantId/appId/myPool', properties: { 'load-balancing-mode': 'round-robin', + metadata: { + example: { + persist: 'true', + value: 'test' + }, + example1: { + persist: 'false', + value: '123' + } + }, 'min-active-members': 1, - minimumMonitors: 1, 'reselect-tries': 0, 'service-down-action': 'none', 'slow-ramp-time': 10 @@ -1855,6 +1897,17 @@ describe('map_as3', () => { assert.strictEqual(results.configs[0].properties['api-anonymous'], expectedIRule); }); + it('should merge line continuations', () => { + const item = { + class: ruleClass.name, + iRule: 'when HTTP_REQUEST {\n log local0. "[IP::client_addr] requested [HTTP::uri] at [clock \\\n seconds]. Request headers were [HTTP::header names]. \\\n Method was [HTTP::method]"\n\n if { [HTTP::uri] starts_with "/abc/" } {\n HTTP::uri [string map {"/abc/" \\\n "/xyz/"} [HTTP::uri]]\n }\n}' + }; + const results = translate[ruleClass.name](defaultContext, 'tenantId', 'appId', 'itemId', item); + assert.deepStrictEqual( + results.configs[0].properties['api-anonymous'], 'when HTTP_REQUEST {\n log local0. "[IP::client_addr] requested [HTTP::uri] at [clock seconds]. Request headers were [HTTP::header names]. Method was [HTTP::method]"\n if { [HTTP::uri] starts_with "/abc/" } {\n HTTP::uri [string map {"/abc/" "/xyz/"} [HTTP::uri]]\n }\n}' + ); + }); + it('should add to ignore when ignore changes is set to true', () => { const item = { class: ruleClass.name, @@ -2923,6 +2976,93 @@ describe('map_as3', () => { ); }); + describe('virtualPort list', () => { + it('should map virtualPort list to traffic matching criteria', () => { + const fullContext = Object.assign({}, defaultContext, context); + fullContext.target.tmosVersion = '14.1'; + item.virtualPort = { + use: 'firewallPortList' + }; + declaration.tenantId.appId.itemId.firewallPortList = { + class: 'Firewall_Port_List', + ports: [ + '1-999' + ] + }; + + const data = translate.Service_Core(fullContext, 'tenant', 'app', 'item', item, declaration); + const virtual = data.configs.find((c) => c.command === 'ltm virtual').properties; + const tmc = data.configs.find((c) => c.command === 'ltm traffic-matching-criteria').properties; + assert.strictEqual(virtual['traffic-matching-criteria'], '/tenant/app/item_VS_TMC_OBJ'); + assert.strictEqual(virtual.destination, undefined); + assert.strictEqual(virtual.source, undefined); + assert.strictEqual(tmc['destination-address-inline'], '10.192.75.27/255.255.255.255'); // gitleaks:allow + assert.strictEqual(tmc['source-address-inline'], '0.0.0.0/any'); + assert.strictEqual(tmc['destination-port-list'], 'firewallPortList'); + assert.strictEqual(tmc['destination-address-list'], undefined); + assert.strictEqual(tmc['source-address-list'], undefined); + }); + }); + + describe('virtualAddresses list', () => { + it('should map virtualAddresses list to traffic matching criteria', () => { + const fullContext = Object.assign({}, defaultContext, context); + fullContext.target.tmosVersion = '14.1'; + item.virtualAddresses = { + use: 'virtualAddressList' + }; + declaration.tenantId.appId.itemId.virtualAddressList = { + class: 'Firewall_Address_List', + addresses: [ + '192.0.2.10', + '192.0.2.20' + ] + }; + + const data = translate.Service_Core(fullContext, 'tenant', 'app', 'item', item, declaration); + const virtual = data.configs.find((c) => c.command === 'ltm virtual').properties; + const tmc = data.configs.find((c) => c.command === 'ltm traffic-matching-criteria').properties; + assert.strictEqual(virtual['traffic-matching-criteria'], '/tenant/app/item_VS_TMC_OBJ'); + assert.strictEqual(virtual.destination, undefined); + assert.strictEqual(virtual.source, undefined); + assert.strictEqual(tmc['destination-address-inline'], 'any/any'); + assert.strictEqual(tmc['source-address-inline'], '0.0.0.0/any'); + assert.strictEqual(tmc['destination-port-list'], undefined); + assert.strictEqual(tmc['destination-address-list'], 'virtualAddressList'); + assert.strictEqual(tmc['source-address-list'], undefined); + }); + }); + + describe('sourceAddress list', () => { + it('should map sourceAddress list to traffic matching criteria', () => { + const fullContext = Object.assign({}, defaultContext, context); + fullContext.target.tmosVersion = '14.1'; + item.virtualType = 'internal'; + item.sourceAddress = { + use: 'sourceAddressList' + }; + declaration.tenantId.appId.itemId.sourceAddressList = { + class: 'Firewall_Address_List', + addresses: [ + '192.0.2.10', + '192.0.2.20' + ] + }; + + const data = translate.Service_Core(fullContext, 'tenant', 'app', 'item', item, declaration); + const virtual = data.configs.find((c) => c.command === 'ltm virtual').properties; + const tmc = data.configs.find((c) => c.command === 'ltm traffic-matching-criteria').properties; + assert.strictEqual(virtual['traffic-matching-criteria'], '/tenant/app/item_VS_TMC_OBJ'); + assert.strictEqual(virtual.destination, undefined); + assert.strictEqual(virtual.source, undefined); + assert.strictEqual(tmc['destination-address-inline'], '10.192.75.27/255.255.255.255'); // gitleaks:allow + assert.strictEqual(tmc['source-address-inline'], '0.0.0.0/any'); + assert.strictEqual(tmc['destination-port-list'], undefined); + assert.strictEqual(tmc['destination-address-list'], undefined); + assert.strictEqual(tmc['source-address-list'], 'sourceAddressList'); + }); + }); + describe('maximumBandwidth', () => { function assertProperty(inKey, outKey, inValue, outValue, context) { const fullContext = Object.assign({}, defaultContext, context); @@ -5415,6 +5555,43 @@ describe('map_as3', () => { }); }); + describe('Net_Port_List', () => { + it('should succeed with Net Port Lists', () => { + const context = { + target: { + tmosVersion: '14.0' + } + }; + const item = { + class: 'Net_Port_List', + ports: [80, 443], + portLists: [ + { + use: 'portList' + } + ] + }; + const results = translate.Net_Port_List(context, 'tenantId', 'appId', 'itemId', item); + assert.deepEqual( + results.configs[0], + { + command: 'net port-list', + ignore: [], + path: '/tenantId/appId/itemId', + properties: { + 'port-lists': { + portList: {} + }, + ports: { + 80: {}, + 443: {} + } + } + } + ); + }); + }); + describe('Service_TCP', () => { it('should check profileFTP Service_TCP properties', () => { const item = { @@ -6195,7 +6372,7 @@ describe('map_as3', () => { method: 'POST', ctype: 'application/octet-stream', why: 'upload Access Profile itemId', - overrides: { + settings: { url: 'https://example.url.helloThere.tar' } } @@ -6232,7 +6409,7 @@ describe('map_as3', () => { method: 'POST', ctype: 'application/octet-stream', why: 'upload Access Profile itemId', - overrides: { + settings: { url: 'https://example.url.helloThere.tar' } } @@ -6284,7 +6461,7 @@ describe('map_as3', () => { method: 'POST', ctype: 'application/octet-stream', why: 'upload Access Profile itemId', - overrides: { + settings: { url: 'https://example.url.helloThere.tar' } } @@ -6319,7 +6496,7 @@ describe('map_as3', () => { method: 'POST', ctype: 'application/octet-stream', why: 'upload Access Profile itemId', - overrides: { + settings: { url: 'https://example.url.helloThere.tar' } } @@ -6382,7 +6559,7 @@ describe('map_as3', () => { post: { ctype: 'application/octet-stream', method: 'POST', - overrides: { + settings: { ignoreChanges: true, url: 'https://example.url.helloThere.tar' }, @@ -6420,7 +6597,7 @@ describe('map_as3', () => { method: 'POST', ctype: 'application/octet-stream', why: 'upload Access Policy itemId', - overrides: { + settings: { url: 'https://example.url.helloThere.tar' } } @@ -6456,7 +6633,7 @@ describe('map_as3', () => { method: 'POST', ctype: 'application/octet-stream', why: 'upload Access Policy itemId', - overrides: { + settings: { url: 'https://example.url.helloThere.tar' } } @@ -6506,7 +6683,7 @@ describe('map_as3', () => { method: 'POST', ctype: 'application/octet-stream', why: 'upload Access Policy itemId', - overrides: { + settings: { url: 'https://example.url.helloThere.tar' } } @@ -6548,7 +6725,8 @@ describe('map_as3', () => { method: 'POST', ctype: 'application/octet-stream', why: 'upload asm policy itemId', - overrides: { + reference: '/tenantId/appId/itemId', + settings: { url: 'https://example.url/helloThere.xml' } } @@ -6584,7 +6762,8 @@ describe('map_as3', () => { method: 'POST', ctype: 'application/octet-stream', why: 'upload asm policy itemId', - overrides: { + reference: '/tenantId/appId/itemId', + settings: { url: 'https://example.url/helloThere.xml' } } @@ -6634,7 +6813,8 @@ describe('map_as3', () => { method: 'POST', ctype: 'application/octet-stream', why: 'upload asm policy itemId', - overrides: { + reference: '/tenantId/appId/itemId', + settings: { url: 'https://example.url/helloThere.xml' } } @@ -6664,7 +6844,7 @@ describe('map_as3', () => { ctype: 'application/octet-stream', why: 'upload asm policy itemId', send: '{\n "policy": {\n "name": "Complete_OWASP_Top_Ten",\n "description": "The WAF Policy"\n }\n }', - overrides: { + settings: { policy: '{\n "policy": {\n "name": "Complete_OWASP_Top_Ten",\n "description": "The WAF Policy"\n }\n }' } } @@ -6692,7 +6872,7 @@ describe('map_as3', () => { ctype: 'application/octet-stream', why: 'upload asm policy itemId', send: '{\n "policy": {\n "name": "Complete_OWASP_Top_Ten",\n "description": "The WAF Policy"\n }\n }', - overrides: { + settings: { file: '{\n "policy": {\n "name": "Complete_OWASP_Top_Ten",\n "description": "The WAF Policy"\n }\n }' } } @@ -6744,7 +6924,8 @@ describe('map_as3', () => { post: { ctype: 'application/octet-stream', method: 'POST', - overrides: { + reference: '/tenantId/appId/itemId', + settings: { enable: true, ignoreChanges: true, url: 'https://example.url.helloThere.xml' @@ -10173,6 +10354,68 @@ describe('map_as3', () => { }); }); + describe('GSLB_Prober_Pool', () => { + it('should return a correct config', () => { + const item = { + class: 'GSLB_Prober_Pool', + enabled: true, + members: [ + { + server: { + use: 'bigip1.f5demo.com' + }, + memberOrder: 0, + enabled: true + }, + { + server: { + use: '/Common/bigip2.f5demo.com' + }, + memberOrder: 1, + enabled: false + }, + { + server: { + use: '/Common/Shared/bigip3.f5demo.com' + }, + memberOrder: 2, + enabled: true + } + ] + }; + + const results = translate.GSLB_Prober_Pool(defaultContext, 'tenantId', 'appId', 'itemId', item); + return assert.deepStrictEqual(results, { + configs: [ + { + path: '/tenantId/itemId', + command: 'gtm prober-pool', + properties: { + description: '"This object is managed by appsvcs, do not modify this description"', + enabled: true, + 'load-balancing-mode': 'global-availability', + members: { + '/Common/bigip1.f5demo.com': { + enabled: true, + order: 0 + }, + '/Common/bigip2.f5demo.com': { + enabled: false, + order: 1 + }, + '/Common/bigip3.f5demo.com': { + enabled: true, + order: 2 + } + } + }, + ignore: [] + } + ] + }); + }); + }); + describe('Address_Discovery', () => { it('should create Address_Discovery config', () => { const item = { @@ -11352,7 +11595,7 @@ describe('map_as3', () => { post: { ctype: 'application/octet-stream', method: 'POST', - overrides: { + settings: { class: 'Data_Group', externalFilePath: { authentication: { @@ -11436,7 +11679,7 @@ describe('map_as3', () => { post: { ctype: 'application/octet-stream', method: 'POST', - overrides: { + settings: { class: 'Data_Group', externalFilePath: { authentication: { diff --git a/test/unit/lib/map_cli.js b/test/unit/lib/map_cli.js index b43c6efa..95d5ee64 100644 --- a/test/unit/lib/map_cli.js +++ b/test/unit/lib/map_cli.js @@ -450,6 +450,52 @@ describe('map_cli', () => { ); }); + describe('ltm policy "controls" aspects based on an action', () => { + it('should handle "controls" bot-defense', () => { + const config = { + rules: { + default: { + ordinal: 0, + conditions: {}, + actions: { + 0: { + policyString: 'bot-defense request disable' + }, + 1: { + policyString: 'bot-defense request enable from-profile /Common/myProfile' + } + } + } + }, + strategy: '/Common/best-match' + }; + const diff = { + command: 'ltm policy', + kind: 'N', + path: ['/tenant/app/policy'], + lhsCommand: '', + rhsCommand: 'ltm policy', + rhs: { + command: 'ltm policy', + properties: config + }, + tags: ['tmsh'] + }; + const result = mapCli.tmshCreate(context, diff, config); + assert.strictEqual( + result.commands[0], + [ + 'tmsh::create ltm policy /tenant/app/policy rules replace-all-with \\{ default \\{', + 'ordinal 0 conditions none actions replace-all-with \\{', + '0 \\{ bot-defense request disable \\}', + '1 \\{ bot-defense request enable from-profile /Common/myProfile \\}', + '\\} \\} \\} strategy /Common/best-match legacy requires replace-all-with \\{ http \\}', + 'controls replace-all-with \\{ bot-defense \\}' + ].join(' ') + ); + }); + }); + describe('ltm policy "requires" aspects based on condition event', () => { it('should handle "requires" tcp', () => { const config = { @@ -1084,6 +1130,52 @@ describe('map_cli', () => { assert.deepStrictEqual(result.commands, ['tmsh::modify auth partition tenant']); }); + it('should ignore the auth partition if isPerApp and the kind is not N', () => { + const diff = { + kind: 'D', + path: ['/tenant1/', 'properties', 'default-route-domain'], + lhs: 0, + tags: ['tmsh'], + command: 'auth partition', + lhsCommand: 'auth partition', + rhsCommand: 'auth partition' + }; + const config = {}; + + context.request.isPerApp = true; + context.request.perAppInfo = { + tenant: 'tenant1', + app: undefined + }; + context.target.tmosVersion = '13.1.0'; + + const result = mapCli.tmshCreate(context, diff, config, {}); + assert.deepStrictEqual(result.commands, []); + }); + + it('should create the auth partition if isPerApp and the kind is N', () => { + const diff = { + kind: 'N', + path: ['/tenant1/'], + rhs: { command: 'auth partition', properties: {}, ignore: [] }, + tags: ['tmsh'], + command: 'auth partition', + lhsCommand: '', + rhsCommand: 'auth partition' + }; + const config = {}; + + context.request.isPerApp = true; + context.request.perAppInfo = { + tenant: 'tenant1', + app: undefined + }; + context.target.tmosVersion = '13.1.0'; + + const result = mapCli.tmshCreate(context, diff, config, {}); + assert.deepStrictEqual(result.commands, ['tmsh::create auth partition tenant1']); + }); + it('should return a modify for the ltm node if the diff.kind is E', () => { const diff = { kind: 'E', @@ -1427,6 +1519,49 @@ describe('map_cli', () => { context = Context.build(null, null, null, [{ firstPassNoDelete: false }]); }); + it('should skip auth partition delete if diff.kind === "E"', () => { + const diff = { + kind: 'E', + path: [ + '/tenant1/', + 'properties', + 'default-route-domain' + ], + lhs: 0, + rhs: 12, + tags: [ + 'tmsh' + ], + lhsCommand: 'auth partition' + }; + const result = mapCli.tmshDelete(context, diff); + assert.deepStrictEqual(result.commands, []); + }); + + it('should skip auth partition delete if isPerApp && a POST', () => { + const diff = { + kind: 'D', + path: [ + '/tenant1/', + 'properties', + 'default-route-domain' + ], + lhs: 0, + tags: [ + 'tmsh' + ], + lhsCommand: 'auth partition' + }; + context.request.method = 'Post'; + context.request.isPerApp = true; + context.request.perAppInfo = { + tenant: 'tenant1', + app: undefined + }; + const result = mapCli.tmshDelete(context, diff); + assert.deepStrictEqual(result.commands, []); + }); + it('should skip ltm node delete if diff.kind === "E"', () => { const diff = { kind: 'E', diff --git a/test/unit/lib/map_mcp.js b/test/unit/lib/map_mcp.js index 5ae825cb..1e585160 100644 --- a/test/unit/lib/map_mcp.js +++ b/test/unit/lib/map_mcp.js @@ -228,6 +228,26 @@ describe('map_mcp', () => { }); }); }); + describe('tm:auth:partition:partitionstate', () => { + it('should return a defaultRouteDomain', () => { + defaultContext.request.isPerApp = false; + + const obj = { + kind: 'tm:auth:partition:partitionstate', + name: 'tenant1', + fullPath: 'tenant1', + generation: 867, + selfLink: 'https://localhost/mgmt/tm/auth/partition/tenant1', + defaultRouteDomain: 10, + description: 'Updated by AS3 at Tue, 30 May 2023 19:48:41 GMT' + }; + + const result = translate['tm:auth:partition:partitionstate'](defaultContext, obj); + assert.deepStrictEqual(result[0].properties, { + 'default-route-domain': 10 + }); + }); + }); describe('tm:sys:file:ssl-cert:ssl-certstate', () => { it('should return with cert-validators', () => { defaultContext.target.tmosVersion = '13.1'; @@ -824,6 +844,45 @@ describe('map_mcp', () => { }); }); + describe('tm:net:port-list:port-liststate', () => { + it('should perform basic transformation', () => { + const obj = { + kind: 'tm:net:port-list:port-liststate', + name: 'myPortList', + partition: 'myApp', + subPath: 'Application1', + fullPath: '/myApp/Application1/myPortList', + ports: [ + { name: '80' }, + { name: '443' } + ], + portLists: [ + { + name: 'anotherList', + partition: 'myApp', + subPath: 'Application1' + } + ] + }; + + const results = translate[obj.kind](defaultContext, obj); + assert.deepStrictEqual(results[0], { + path: '/myApp/Application1/myPortList', + command: 'net port-list', + properties: { + 'port-lists': { + '/myApp/Application1/anotherList': {} + }, + ports: { + 443: {}, + 80: {} + } + }, + ignore: [] + }); + }); + }); + describe('tm:security:protocol-inspection:profile:profilestate', () => { it('should perform basic transformation', () => { const obj = { @@ -2037,6 +2096,112 @@ describe('map_mcp', () => { }); }); + describe('tm:ltm:policy:policystate', () => { + it("should return ltm 'bot-defense' policy", () => { + const obj = { + kind: 'tm:ltm:policy:policystate', + name: 'myPolicy', + partition: 'TEST_Service_HTTP', + fullPath: '/TEST_Service_HTTP/myPolicy', + selfLink: 'https://localhost/mgmt/tm/ltm/policy/~TEST_Service_HTTP~myPolicy?ver=16.1.2', + controls: [ + 'bot-defense' + ], + status: 'published', + strategy: '/Common/first-match', + strategyReference: { + link: 'https://localhost/mgmt/tm/ltm/policy-strategy/~Common~first-match?ver=16.1.2' + }, + references: {}, + rulesReference: { + link: 'https://localhost/mgmt/tm/ltm/policy/~TEST_Service_HTTP~myPolicy/rules?ver=16.1.2', + isSubcollection: true, + items: [ + { + kind: 'tm:ltm:policy:rules:rulesstat', + name: 'myPolicy', + fullPath: 'myPolicy', + selfLink: 'https://localhost/mgmt/tm/ltm/policy/~TEST_Service_HTTP~myPolicy/rules/myPolicy?ver=16.1.2', + ordinal: 0, + actionsReference: { + link: 'https://localhost/mgmt/tm/ltm/policy/~TEST_Service_HTTP~myPolicy/rules/myPolicy/actions?ver=16.1.2', + isSubcollection: true, + items: [ + { + kind: 'tm:ltm:policy:rules:actions:actionsstate', + name: '0', + fullPath: '0', + selfLink: 'https://localhost/mgmt/tm/ltm/policy/~TEST_Service_HTTP~Application~myPolicy/rules/myPolicy/actions/0?ver=16.1.2', + botDefense: true, + code: 0, + disable: true, + expirySecs: 0, + length: 0, + offset: 0, + port: 0, + request: true, + status: 0, + timeout: 0, + vlanId: 0 + }, + { + kind: 'tm:ltm:policy:rules:actions:actionsstate', + name: '1', + fullPath: '1', + selfLink: 'https://localhost/mgmt/tm/ltm/policy/~TEST_Service_HTTP~Application~myPolicy/rules/myPolicy/actions/1?ver=16.1.2', + botDefense: true, + clientAccepted: true, + code: 0, + enable: true, + expirySecs: 0, + fromProfile: '/Common/bot-defense', + fromProfileReference: { + link: 'https://localhost/mgmt/tm/security/dos/profile/~Common~bot-defense?ver=16.1.2' + }, + length: 0, + offset: 0, + port: 0, + status: 0, + timeout: 0, + vlanId: 0 + } + ] + } + } + ] + } + }; + + const results = translate[obj.kind](defaultContext, obj); + assert.deepStrictEqual( + results, [ + { + path: '/TEST_Service_HTTP/myPolicy', + command: 'ltm policy', + properties: { + rules: { + myPolicy: { + ordinal: 0, + conditions: {}, + actions: { + 0: { + policyString: 'bot-defense request disable' + }, + 1: { + policyString: 'bot-defense request enable from-profile /Common/bot-defense' + } + } + } + }, + strategy: '/Common/first-match' + }, + ignore: [] + } + ] + ); + }); + }); + describe('tm:ltm:cipher:group:groupstate', () => { it('should return cipher group', () => { const obj = { @@ -2712,6 +2877,63 @@ describe('map_mcp', () => { ); }); }); + + describe('tm:ltm:traffic-matching-criteria:traffic-matching-criteriastate', () => { + beforeEach(() => { + defaultContext.target.tmosVersion = '14.1'; + }); + + it('should map CIDR to mask', () => { + const obj = { + kind: 'tm:ltm:traffic-matching-criteria:traffic-matching-criteriastate', + fullPath: '/Tenant/Application/myTrafficMatchingCriteria', + command: 'ltm traffic-matching-criteria', + destinationAddressInline: '192.0.2.1/18' + }; + const results = translate[obj.kind](defaultContext, obj); + const properties = results[0].properties; + // gitleaks is fooled by the mask + assert.strictEqual(properties['destination-address-inline'], '192.0.2.1/255.255.192.0'); // gitleaks:allow + }); + + it('should map destination-address-inline 0.0.0.0 to any', () => { + const obj = { + kind: 'tm:ltm:traffic-matching-criteria:traffic-matching-criteriastate', + fullPath: '/Tenant/Application/myTrafficMatchingCriteria', + destinationAddressInline: '0.0.0.0' + }; + const results = translate[obj.kind](defaultContext, obj); + const properties = results[0].properties; + assert.strictEqual(properties['destination-address-inline'], 'any/any'); + }); + + it('should map source-address-inline CIDR to mask', () => { + const obj = { + kind: 'tm:ltm:traffic-matching-criteria:traffic-matching-criteriastate', + fullPath: '/Tenant/Application/myTrafficMatchingCriteria', + sourceAddressInline: '192.0.2.1/18' + }; + const results = translate[obj.kind](defaultContext, obj); + const properties = results[0].properties; + // gitleaks is fooled by the mask + assert.strictEqual(properties['source-address-inline'], '192.0.2.1/255.255.192.0'); // gitleaks:allow + }); + }); + + describe('tm:ltm:virtual:virtualstate', () => { + it('should delete source and destination if traffic-matching-criteria is used', () => { + const obj = { + kind: 'tm:ltm:virtual:virtualstate', + trafficMatchingCriteria: '/Tenant/Application/Service_VS_TMC_OBJ', + source: 'mySource', + destination: 'myDestination' + }; + const results = translate[obj.kind](defaultContext, obj); + const properties = results[0].properties; + assert.strictEqual(properties.destination, undefined); + assert.strictEqual(properties.source, undefined); + }); + }); }); describe('tm:ltm:snat-translation:snat-translationstate', () => { diff --git a/test/unit/lib/postValidator.js b/test/unit/lib/postValidator.js index 2f2891b2..7a81402e 100644 --- a/test/unit/lib/postValidator.js +++ b/test/unit/lib/postValidator.js @@ -422,7 +422,7 @@ describe('postValidator', () => { defaultContext.target.tmosVersion = '13.1'; return assert.isRejected( PostValidator.validate(defaultContext, declaration), - 'profileBotDefense is only available of TMOS 14.1+' + 'profileBotDefense is only available on TMOS 14.1+' ); }); }); diff --git a/test/unit/lib/tag/minVersionTag.js b/test/unit/lib/tag/minVersionTag.js index f83da291..4dc60010 100644 --- a/test/unit/lib/tag/minVersionTag.js +++ b/test/unit/lib/tag/minVersionTag.js @@ -16,7 +16,13 @@ 'use strict'; -const assert = require('assert'); +const AJV = require('ajv'); +const chai = require('chai'); +const chaiAsPromised = require('chai-as-promised'); + +chai.use(chaiAsPromised); +const assert = chai.assert; + const MinVersionTag = require('../../../../src/lib/tag').MinVersionTag; describe('MinVersionTag', () => { @@ -95,6 +101,40 @@ describe('MinVersionTag', () => { assert.deepStrictEqual(results.warnings[0].dataPath, '/Tenant/Application/Profile/property1'); })); + it('should generate a warning if the bad property is in the original declaration and strict mode is false', () => { + minVersions[0].schemaData = { + version: '18.0', + strict: false + }; + + return MinVersionTag.process(context, declaration, minVersions, originalDeclaration) + .then((results) => { + assert.strictEqual(results.warnings.length, 1); + assert.deepStrictEqual(results.warnings[0].tenant, 'Tenant'); + assert.deepStrictEqual(results.warnings[0].dataPath, '/Tenant/Application/Profile/property1'); + }); + }); + + it('should reject with an AJV Validation Error if the bad property is in the original declaration and strict mode is true', () => { + minVersions[0].schemaData = { + version: '18.0', + strict: true + }; + return assert.isRejected(MinVersionTag.process(context, declaration, minVersions, originalDeclaration), + /validation failed/) + .then((err) => { + assert.ok(err instanceof AJV.ValidationError); + assert.deepStrictEqual(err.errors, [ + { + dataPath: '/Tenant/Application/Profile/property1', + keyword: 'f5PostProcess(minVersion)', + message: 'MyClass.MyProperty is only valid on BIG-IP versions 18.0 and above.', + params: {} + } + ]); + }); + }); + it('should not generate a warning if the bad property is not in the original declaration', () => { delete originalDeclaration.Tenant.Application.Profile.property1; return MinVersionTag.process(context, declaration, minVersions, originalDeclaration) @@ -102,5 +142,17 @@ describe('MinVersionTag', () => { assert.strictEqual(results.warnings.length, 0); }); }); + + it('should not reject with an error if the bad property is not in the original declaration and strict mode is true', () => { + minVersions[0].schemaData = { + version: '18.0', + strict: true + }; + delete originalDeclaration.Tenant.Application.Profile.property1; + return MinVersionTag.process(context, declaration, minVersions, originalDeclaration) + .then((results) => { + assert.strictEqual(results.warnings.length, 0, 'warning should not be generated either'); + }); + }); }); }); diff --git a/test/unit/lib/update.js b/test/unit/lib/update.js index 70f549af..3a7792ac 100644 --- a/test/unit/lib/update.js +++ b/test/unit/lib/update.js @@ -273,7 +273,7 @@ describe('update', () => { method: 'POST', ctype: 'application/octet-stream', why: 'upload asm policy exampleWAF', - overrides: { + settings: { class: 'WAF_Policy', url: 'https://192.0.2.0/mgmt/cm/asm/policy-files/download/0c32f1e4-dba5-3d17-991c-2d113478c261/14.1.0', ignoreChanges: false, @@ -324,7 +324,7 @@ describe('update', () => { ctype: 'application/octet-stream', why: 'upload asm policy exampleWAF', send: 'transparent', - overrides: { + settings: { class: 'WAF_Policy', policy: 'blocking', ignoreChanges: false, @@ -374,7 +374,7 @@ describe('update', () => { method: 'POST', ctype: 'application/octet-stream', why: 'upload Access Profile apmExample', - overrides: { + settings: { class: 'Access_Profile', url: 'https://example.com/profile_ITS_ap_transfer.conf.tar.gz', ignoreChanges: true @@ -420,7 +420,7 @@ describe('update', () => { ctype: 'application/octet-stream', why: 'upload asm policy exampleWAF', send: 'transparent', - overrides: { + settings: { class: 'WAF_Policy', policy: 'blocking', ignoreChanges: false, diff --git a/test/unit/lib/utils/arrayUtil.js b/test/unit/lib/utils/arrayUtil.js deleted file mode 100644 index 65811ee3..00000000 --- a/test/unit/lib/utils/arrayUtil.js +++ /dev/null @@ -1,95 +0,0 @@ -/** - * Copyright 2023 F5 Networks, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -'use strict'; - -const assert = require('assert'); - -const arrayUtil = require('../../../../src/lib/util/arrayUtil'); - -describe('arrayUtil', () => { - describe('.ensureArray', () => { - it('should return an empty array', () => { - assert.deepStrictEqual(arrayUtil.ensureArray(), []); - }); - - it('should return an empty array', () => { - assert.deepStrictEqual(arrayUtil.ensureArray({}), [{}]); - }); - - it('should return an array with values in it', () => { - assert.deepStrictEqual(arrayUtil.ensureArray({ foo: 'bar' }), [{ foo: 'bar' }]); - }); - - it('should return the same object as before', () => { - assert.deepStrictEqual(arrayUtil.ensureArray(['foo-bar']), ['foo-bar']); - }); - }); - - describe('.doesArrayContain', () => { - it('should return true if the array does contain the target object', () => { - const array = ['funky']; - const target = 'funky'; - assert.strictEqual(arrayUtil.doesArrayContain(array, target), true); - }); - - it('should return false if the array does NOT contain the target object', () => { - const array = ['funky']; - const target = 'monkey'; - assert.strictEqual(arrayUtil.doesArrayContain(array, target), false); - }); - - it('should return false if the array is empty', () => { - const array = []; - const target = '1'; - assert.strictEqual(arrayUtil.doesArrayContain(array, target), false); - }); - - it('should return false if the array is undefined', () => { - const target = '1'; - assert.strictEqual(arrayUtil.doesArrayContain(undefined, target), false); - }); - - it('should return false if the target is undefined', () => { - const array = []; - assert.strictEqual(arrayUtil.doesArrayContain(array, undefined), false); - }); - }); - - describe('.doesArrayContainAny', () => { - it('should return true if the arr1 contains any of the arr2', () => { - const arr1 = [1, 2, 3]; - const arr2 = [4, 1]; - assert.strictEqual(arrayUtil.doesArrayContainAnyOf(arr1, arr2), true); - }); - - it('should return false if the arr1 does NOT contain any of the arr2', () => { - const arr1 = [1, 2, 3]; - const arr2 = [4]; - assert.strictEqual(arrayUtil.doesArrayContainAnyOf(arr1, arr2), false); - }); - - it('should return false if the arr1 is undefined', () => { - const arr2 = [1]; - assert.strictEqual(arrayUtil.doesArrayContainAnyOf(undefined, arr2), false); - }); - - it('should return false if the arr2 is undefined', () => { - const arr1 = [1, 2, 3]; - assert.strictEqual(arrayUtil.doesArrayContainAnyOf(arr1, undefined), false); - }); - }); -}); diff --git a/test/unit/lib/utils/asmUtil.js b/test/unit/lib/utils/asmUtil.js index 54a79e1c..b37ca3a7 100644 --- a/test/unit/lib/utils/asmUtil.js +++ b/test/unit/lib/utils/asmUtil.js @@ -22,6 +22,7 @@ const chaiAsPromised = require('chai-as-promised'); chai.use(chaiAsPromised); const assert = chai.assert; +const util = require('../../../../src/lib/util/util'); const asmUtil = require('../../../../src/lib/util/asmUtil'); function createXml(policy) { @@ -192,4 +193,99 @@ describe('asmUtil', () => { it('should accept JSON input and ignore overrides', () => assert.isFulfilled( asmUtil.applyAs3Settings('{}', {}) )); + + describe('expand', () => { + let declaration; + let policy; + + beforeEach(() => { + declaration = { + class: 'ADC', + Tenant: { + class: 'Tenant', + Application: { + class: 'Application', + wafPolicy: { + class: 'WAF_Policy', + policy: { + base64: 'eyJvcGVuLWFwaS1maWxlcyI6W3sibGluayI6Imh0dHBzOi8vMTkyLjAuMi4xMC9gQWAvb3BlbmFwaS55YW1sIn1dfQ==' + } + } + } + } + }; + policy = { + policy: { + 'open-api-files': [ + { + link: 'https://192.0.2.10/`A`/openapi.yaml' + } + ] + } + }; + }); + + it('should fail to expand strings if JSON pointer references a nonexistent value', () => { + declaration.Tenant.Application.wafPolicy.expand = ['/bad/path/in/policy']; + + const settings = util.simpleCopy(declaration.Tenant.Application.wafPolicy); + + return assert.isRejected( + asmUtil.applyAs3Settings(JSON.stringify(policy), settings, '/Tenant/Application/wafPolicy', declaration), + 'Could not expand string in /Tenant/Application/wafPolicy. JSON pointer "/bad/path/in/policy" references a nonexistent value in the policy' + ); + }); + + it('should expand the value that the JSON pointer references', () => { + declaration.Tenant.Application.wafPolicy.expand = ['/policy/open-api-files/0/link']; + + const settings = util.simpleCopy(declaration.Tenant.Application.wafPolicy); + const expected = util.simpleCopy(policy); + expected.policy['open-api-files'][0].link = 'https://192.0.2.10/Application/openapi.yaml'; + + return asmUtil.applyAs3Settings(JSON.stringify(policy), settings, '/Tenant/Application/wafPolicy', declaration) + .then((results) => { + assert.deepStrictEqual(JSON.parse(results), expected); + }); + }); + + it('should recursively expand any sub-values of the object that the JSON pointer references', () => { + // empty JSON pointer points to root obj + declaration.Tenant.Application.wafPolicy.expand = ['']; + + const settings = util.simpleCopy(declaration.Tenant.Application.wafPolicy); + const expected = util.simpleCopy(policy); + expected.policy['open-api-files'][0].link = 'https://192.0.2.10/Application/openapi.yaml'; + + return asmUtil.applyAs3Settings(JSON.stringify(policy), settings, '/Tenant/Application/wafPolicy', declaration) + .then((results) => { + assert.deepStrictEqual(JSON.parse(results), expected); + }); + }); + + it('should handle special characters and values when recursing', () => { + // empty JSON pointer points to root obj + declaration.Tenant.Application.wafPolicy.expand = ['']; + + // test keys taken from RFC 6901 + const testKeys = ['', 'a/b', 'c%d', 'e^f', 'g|h', 'i\\j', 'k"l', ' ', 'm~n']; + // iterate the test keys and create nested sub-objects with an expandable value at the end + testKeys.reduce((obj, key) => { + obj[key] = {}; + return obj[key]; + }, policy).data = '`O`'; + policy.nullData = null; + policy.undefinedData = undefined; + delete policy.policy; + + const settings = util.simpleCopy(declaration.Tenant.Application.wafPolicy); + const expected = util.simpleCopy(policy); + testKeys.reduce((obj, key) => obj[key], expected).data = 'wafPolicy'; + + return asmUtil.applyAs3Settings(JSON.stringify(policy), settings, '/Tenant/Application/wafPolicy', declaration) + .then((results) => { + assert.deepStrictEqual(JSON.parse(results), expected); + }); + }); + }); }); diff --git a/test/unit/lib/utils/perAppUtil.js b/test/unit/lib/utils/perAppUtil.js new file mode 100644 index 00000000..ecc63d4e --- /dev/null +++ b/test/unit/lib/utils/perAppUtil.js @@ -0,0 +1,738 @@ +/** + * Copyright 2023 F5 Networks, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +const nock = require('nock'); +const sinon = require('sinon'); +const assert = require('assert'); +const uuid = require('uuid'); + +const perAppUtil = require('../../../../src/lib/util/perAppUtil'); + +describe('perAppUtil', () => { + beforeEach(() => { + sinon.stub(uuid, 'v4').returns('new-uuid-xxxx'); + }); + + afterEach(() => { + sinon.restore(); + nock.cleanAll(); + }); + + describe('convertToPerTenant', () => { + it('should early exit and return the declaration if perAppInfo is not provided', () => { + const decl = { + exApp: { + class: 'Application', + template: 'generic', + pool1: + { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 11, + minimumMonitors: 1 + } + } + }; + + const result = perAppUtil.convertToPerTenant(decl); + return assert.deepStrictEqual(result, + { + exApp: { + class: 'Application', + template: 'generic', + pool1: + { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 11, + minimumMonitors: 1 + } + } + }); + }); + + it('should early exit if no declaration is provided', () => { + const perAppInfo = { + tenant: 'exampleTenant', + apps: ['exApp'] + }; + + const result = perAppUtil.convertToPerTenant(undefined, perAppInfo); + return assert.deepStrictEqual(result, {}); + }); + + it('should convert single app per-app declaration into a per-tenant declaration', () => { + const decl = { + exApp: { + class: 'Application', + template: 'generic', + pool1: + { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 11, + minimumMonitors: 1 + } + } + }; + + const perAppInfo = { + tenant: 'exampleTenant', + apps: ['exApp'] + }; + + const result = perAppUtil.convertToPerTenant(decl, perAppInfo); + return assert.deepStrictEqual(result, + { + class: 'ADC', + id: 'autogen_new-uuid-xxxx', + schemaVersion: '3.0.0', + exampleTenant: { + class: 'Tenant', + exApp: { + class: 'Application', + template: 'generic', + pool1: + { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 11, + minimumMonitors: 1 + } + } + } + }); + }); + + it('should convert multi-app per-app declaration into a per-tenant declaration', () => { + const decl = { + otherApp: { + class: 'Application', + template: 'generic', + poolOther: + { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 11, + minimumMonitors: 1 + } + }, + exApp: { + class: 'Application', + template: 'generic', + pool1: + { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 11, + minimumMonitors: 1 + } + } + }; + + const perAppInfo = { + tenant: 'exampleTenant', + apps: ['exApp', 'otherApp'] + }; + + const result = perAppUtil.convertToPerTenant(decl, perAppInfo); + return assert.deepStrictEqual(result, + { + class: 'ADC', + id: 'autogen_new-uuid-xxxx', + schemaVersion: '3.0.0', + exampleTenant: { + class: 'Tenant', + exApp: { + class: 'Application', + template: 'generic', + pool1: + { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 11, + minimumMonitors: 1 + } + }, + otherApp: { + class: 'Application', + template: 'generic', + poolOther: + { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 11, + minimumMonitors: 1 + } + } + } + }); + }); + + it('should handle an already converted per-tenant declaration', () => { + const decl = { + class: 'ADC', + schemaVersion: '3.0.0', + exampleTenant: { + class: 'Tenant', + exApp: { + class: 'Application', + template: 'generic', + pool1: + { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 11, + minimumMonitors: 1 + } + }, + otherApp: { + class: 'Application', + template: 'generic', + poolOther: + { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 11, + minimumMonitors: 1 + } + } + } + }; + + const perAppInfo = { + tenant: 'exampleTenant', + apps: ['exApp', 'otherApp'] + }; + + const result = perAppUtil.convertToPerTenant(decl, perAppInfo); + return assert.deepStrictEqual(result, + { + class: 'ADC', + schemaVersion: '3.0.0', + exampleTenant: { + class: 'Tenant', + exApp: { + class: 'Application', + template: 'generic', + pool1: + { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 11, + minimumMonitors: 1 + } + }, + otherApp: { + class: 'Application', + template: 'generic', + poolOther: + { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 11, + minimumMonitors: 1 + } + } + } + }); + }); + + it('should handle an already converted per-tenant declaration but missing ADC', () => { + const decl = { + exampleTenant: { + class: 'Tenant', + exApp: { + class: 'Application', + template: 'generic', + pool1: + { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 11, + minimumMonitors: 1 + } + }, + otherApp: { + class: 'Application', + template: 'generic', + poolOther: + { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 11, + minimumMonitors: 1 + } + } + } + }; + + const perAppInfo = { + tenant: 'exampleTenant', + apps: ['exApp', 'otherApp'] + }; + + const result = perAppUtil.convertToPerTenant(decl, perAppInfo); + return assert.deepStrictEqual(result, + { + exampleTenant: { + class: 'Tenant', + exApp: { + class: 'Application', + template: 'generic', + pool1: + { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 11, + minimumMonitors: 1 + } + }, + otherApp: { + class: 'Application', + template: 'generic', + poolOther: + { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 11, + minimumMonitors: 1 + } + } + } + }); + }); + }); + + describe('convertToPerApp', () => { + it('should early exit and return the declaration if perAppInfo is not provided', () => { + const decl = { + class: 'ADC', + schemaVersion: '3.0.0', + id: 'autogen_new-uuid-xxxx', + updateMode: 'selective', + controls: { + archiveTimestamp: '2023-06-15T21:29:39.827Z' + }, + exampleTenant: { + class: 'Tenant', + exApp: { + class: 'Application', + template: 'generic', + pool1: + { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 11, + minimumMonitors: 1 + } + } + } + }; + + const result = perAppUtil.convertToPerApp(decl); + return assert.deepStrictEqual(result, + { + class: 'ADC', + id: 'autogen_new-uuid-xxxx', + schemaVersion: '3.0.0', + updateMode: 'selective', + controls: { + archiveTimestamp: '2023-06-15T21:29:39.827Z' + }, + exampleTenant: { + class: 'Tenant', + exApp: { + class: 'Application', + template: 'generic', + pool1: + { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 11, + minimumMonitors: 1 + } + } + } + }); + }); + + it('should early exit if no declaration is provided', () => { + const perAppInfo = { + tenant: 'exampleTenant', + apps: ['exApp'] + }; + + const result = perAppUtil.convertToPerApp(undefined, perAppInfo); + return assert.deepStrictEqual(result, {}); + }); + + it('should convert single-app per-tenant declaration into a per-app declaration', () => { + const decl = { + class: 'ADC', + schemaVersion: '3.0.0', + id: 'autogen_new-uuid-xxxx', + updateMode: 'selective', + controls: { + archiveTimestamp: '2023-06-15T21:29:39.827Z' + }, + exampleTenant: { + class: 'Tenant', + exApp: { + class: 'Application', + template: 'generic', + pool1: + { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 11, + minimumMonitors: 1 + } + } + } + }; + + const perAppInfo = { + tenant: 'exampleTenant', + apps: ['exApp'] + }; + + const result = perAppUtil.convertToPerApp(decl, perAppInfo); + return assert.deepStrictEqual(result, + { + exApp: { + class: 'Application', + template: 'generic', + pool1: + { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 11, + minimumMonitors: 1 + } + } + }); + }); + + it('should convert multi-app per-tenant declaration into a multi-app per-app declaration', () => { + const decl = { + class: 'ADC', + schemaVersion: '3.0.0', + id: 'autogen_new-uuid-xxxx', + updateMode: 'selective', + controls: { + archiveTimestamp: '2023-06-15T21:29:39.827Z' + }, + exampleTenant: { + class: 'Tenant', + exApp: { + class: 'Application', + template: 'generic', + pool1: + { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 11, + minimumMonitors: 1 + } + }, + otherApp: { + class: 'Application', + template: 'generic', + poolOther: + { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 11, + minimumMonitors: 1 + } + } + } + }; + + const perAppInfo = { + tenant: 'exampleTenant', + apps: ['exApp', 'otherApp'] + }; + + const result = perAppUtil.convertToPerApp(decl, perAppInfo); + return assert.deepStrictEqual(result, + { + exApp: { + class: 'Application', + template: 'generic', + pool1: + { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 11, + minimumMonitors: 1 + } + }, + otherApp: { + class: 'Application', + template: 'generic', + poolOther: + { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 11, + minimumMonitors: 1 + } + } + }); + }); + + it('should convert multi-app per-tenant declaration into a single-app per-app declaration', () => { + const decl = { + class: 'ADC', + schemaVersion: '3.0.0', + id: 'autogen_new-uuid-xxxx', + updateMode: 'selective', + controls: { + archiveTimestamp: '2023-06-15T21:29:39.827Z' + }, + exampleTenant: { + class: 'Tenant', + exApp: { + class: 'Application', + template: 'generic', + pool1: + { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 11, + minimumMonitors: 1 + } + }, + otherApp: { + class: 'Application', + template: 'generic', + poolOther: + { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 11, + minimumMonitors: 1 + } + } + } + }; + + const perAppInfo = { + tenant: 'exampleTenant', + apps: ['exApp'] + }; + + const result = perAppUtil.convertToPerApp(decl, perAppInfo); + return assert.deepStrictEqual(result, + { + exApp: { + class: 'Application', + template: 'generic', + pool1: + { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 11, + minimumMonitors: 1 + } + } + }); + }); + + it('should handle an already converted per-app declaration', () => { + const decl = { + exApp: { + class: 'Application', + template: 'generic', + pool1: + { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 11, + minimumMonitors: 1 + } + } + }; + + const perAppInfo = { + tenant: 'exampleTenant', + apps: ['exApp'] + }; + + const result = perAppUtil.convertToPerApp(decl, perAppInfo); + return assert.deepStrictEqual(result, + { + exApp: { + class: 'Application', + template: 'generic', + pool1: + { + class: 'Pool', + loadBalancingMode: 'round-robin', + minimumMembersActive: 1, + reselectTries: 0, + serviceDownAction: 'none', + slowRampTime: 11, + minimumMonitors: 1 + } + } + }); + }); + + it('should return an error object if it was received', () => { + const decl = { + code: 400, + message: 'cannot parse JSON POST payload (Unexpected token e in JSON at position 1)' + }; + + const perAppInfo = { + tenant: 'exampleTenant', + apps: ['exApp', 'otherApp'] + }; + + const result = perAppUtil.convertToPerApp(decl, perAppInfo); + return assert.deepStrictEqual(result, { + code: 400, + message: 'cannot parse JSON POST payload (Unexpected token e in JSON at position 1)' + }); + }); + }); + + describe('isPerAppPath', () => { + it('should return false if no path is provided', () => { + const result = perAppUtil.isPerAppPath(); + return assert.strictEqual(result, false); + }); + + it('should return true if the path is a valid applications path with query parameters', () => { + const result = perAppUtil.isPerAppPath('/shared/appsvcs/declare/tenant1/applications?controls.trace=true'); + return assert.strictEqual(result, true); + }); + + it('should return true if the path is a valid applications path with one application', () => { + const result = perAppUtil.isPerAppPath('/shared/appsvcs/declare/tenant1/applications/app1'); + return assert.strictEqual(result, true); + }); + + it('should return false if the path is missing applications or it is misspelled', () => { + const result = perAppUtil.isPerAppPath('/shared/appsvcs/declare/tenant1/application/app1'); + return assert.strictEqual(result, false); + }); + + it('should return false if the path is not an applications path', () => { + const result = perAppUtil.isPerAppPath('/shared/appsvcs/declare/tenant1'); + return assert.strictEqual(result, false); + }); + + it('should return false if the path is improper for per-app applications path', () => { + const result = perAppUtil.isPerAppPath('/shared/appsvcs/declare/tenant1,tenant2/applications'); + return assert.strictEqual(result, false); + }); + + it('should return false if the path has multiple applications', () => { + const result = perAppUtil.isPerAppPath('/shared/appsvcs/declare/tenant1/applications/app1,app2'); + return assert.strictEqual(result, false); + }); + }); +}); diff --git a/test/unit/lib/utils/restUtil.js b/test/unit/lib/utils/restUtil.js index 56fe2df5..97274311 100644 --- a/test/unit/lib/utils/restUtil.js +++ b/test/unit/lib/utils/restUtil.js @@ -23,8 +23,18 @@ const nock = require('nock'); const restUtil = require('../../../../src/lib/util/restUtil'); const config = require('../../../../src/lib/config'); const RestOperationMock = require('../../RestOperationMock'); +const util = require('../../../../src/lib/util/util'); +const Config = require('../../../../src/lib/config'); describe('restUtil', () => { + let httpRequestStub; + let configStub; + + beforeEach(() => { + httpRequestStub = sinon.stub(util, 'httpRequest').resolves(); // Just resolve + configStub = sinon.stub(Config, 'getAllSettings').resolves({ serviceDiscoveryEnabled: true }); + }); + afterEach(() => { sinon.restore(); nock.cleanAll(); @@ -65,8 +75,262 @@ describe('restUtil', () => { }); }); + describe('completeRequest', () => { + it('should properly configure the restOperation with per-tenant Post', () => { + const restOp = new RestOperationMock(); + restOp.method = 'Post'; + restOp.setPathName('/shared/appsvcs/declare'); + + const result = { + code: 200, + message: undefined, + body: { + results: [{ code: 200 }], + declaration: { + class: 'ADC', + schemaVersion: '3.15.0', + id: 'Service_Address', + controls: { + class: 'Controls', + trace: true, + logLevel: 'debug' + }, + tenantId: { + class: 'Tenant', + appId: { + class: 'Application' + } + }, + updateMode: 'selective' + } + } + }; + + restUtil.completeRequest(restOp, result); + restOp.complete(); + assert.deepStrictEqual(restOp.body, { + results: [{ code: 200 }], + declaration: { + class: 'ADC', + schemaVersion: '3.15.0', + id: 'Service_Address', + controls: { + class: 'Controls', + trace: true, + logLevel: 'debug' + }, + tenantId: { + class: 'Tenant', + appId: { + class: 'Application' + } + }, + updateMode: 'selective' + } + }); + assert.deepStrictEqual(restOp.statusCode, 200); + }); + + it('should properly transform the restOperation with per-app Post', () => { + const restOp = new RestOperationMock(); + restOp.method = 'Post'; + restOp.setPathName('/shared/appsvcs/declare/tenant1/applications?controls.trace=true'); + + const perAppInfo = { + tenant: 'tenant1', + apps: ['app2'] + }; + + const result = { + code: 200, + message: undefined, + body: { + results: [{ code: 200 }], + declaration: { + class: 'ADC', + schemaVersion: '3.15.0', + id: 'Service_Address', + controls: { + class: 'Controls', + trace: true, + logLevel: 'debug' + }, + tenantId: { + class: 'Tenant', + appId: { + class: 'Application' + } + }, + tenant1: { + class: 'Tenant', + app1: { + class: 'Application' + }, + app2: { + class: 'Application', + template: 'generic' + } + }, + updateMode: 'selective' + } + } + }; + + restUtil.completeRequest(restOp, result, perAppInfo); + restOp.complete(); + assert.deepStrictEqual(restOp.body, { + results: [{ code: 200 }], + declaration: { + app2: { + class: 'Application', + template: 'generic' + } + } + }); + assert.deepStrictEqual(restOp.statusCode, 200); + }); + + it('should properly configure the restOperation with per-app Delete', () => { + const restOp = new RestOperationMock(); + restOp.method = 'Delete'; + restOp.setPathName('/shared/appsvcs/declare/tenant1/applications/app1'); + + const perAppInfo = { + tenant: 'tenant1', + apps: ['app2'] + }; + + const result = { + code: 200, + message: undefined, + body: { + results: [ + { + code: 200, + message: 'success', + lineCount: 30, + host: 'localhost', + tenant: 'AS3Request_Tenant1', + runTime: 2671 + } + ], + declaration: { + class: 'ADC', + schemaVersion: '3.0.0', + id: '1686935002532', + updateMode: 'selective', + controls: { + archiveTimestamp: '2023-06-16T17:03:25.670Z' + } + } + } + }; + + restUtil.completeRequest(restOp, result, perAppInfo); + restOp.complete(); + assert.deepStrictEqual(restOp.body, { + results: [ + { + code: 200, + message: 'success', + lineCount: 30, + host: 'localhost', + tenant: 'AS3Request_Tenant1', + runTime: 2671 + } + ], + declaration: { + class: 'ADC', + schemaVersion: '3.0.0', + id: '1686935002532', + updateMode: 'selective', + controls: { + archiveTimestamp: '2023-06-16T17:03:25.670Z' + } + } + }); + assert.deepStrictEqual(restOp.statusCode, 200); + }); + + it('should properly configure the restOperation with per-app Get', () => { + const restOp = new RestOperationMock(); + restOp.method = 'Get'; + restOp.uri = { + path: '/shared/appsvcs/declare/tenant1/applications' + }; + + const perAppInfo = { + tenant: 'tenant1', + apps: [] + }; + + const result = { + code: 200, + message: undefined, + body: { + app1: { + class: 'Application', + template: 'generic' + }, + application2: { + class: 'Application', + template: 'generic' + } + } + }; + + restUtil.completeRequest(restOp, result, perAppInfo); + restOp.complete(); + assert.deepStrictEqual(restOp.body, { + app1: { + class: 'Application', + template: 'generic' + }, + application2: { + class: 'Application', + template: 'generic' + } + }); + assert.deepStrictEqual(restOp.statusCode, 200); + }); + + it('should properly configure the restOperation with an error message', () => { + const restOp = new RestOperationMock(); + restOp.method = 'Post'; + restOp.uri = { + path: '/shared/appsvcs/declare/tenant1/applications' + }; + + const perAppInfo = { + tenant: 'tenant1', + apps: ['app2'] + }; + + const result = { + code: 422, + message: 'declaration is invalid', + body: { + code: 422, + errors: ['/app1/pool1/slowRampTime: should be integer'], + message: 'declaration is invalid' + } + }; + + restUtil.completeRequest(restOp, result, perAppInfo); + restOp.complete(); + assert.deepStrictEqual(restOp.body, { + code: 422, + errors: ['/app1/pool1/slowRampTime: should be integer'], + message: 'declaration is invalid' + }); + assert.deepStrictEqual(restOp.statusCode, 422); + }); + }); + describe('.checkWebhook', () => { beforeEach(() => { + httpRequestStub.restore(); // So nock can work + configStub.restore(); sinon.stub(config, 'getAllSettings').resolves( { webhook: 'http://www.example.com/webhook' diff --git a/test/unit/lib/utils/util.js b/test/unit/lib/utils/util.js index a3449098..07d3ea96 100644 --- a/test/unit/lib/utils/util.js +++ b/test/unit/lib/utils/util.js @@ -1526,6 +1526,192 @@ describe('util', () => { ] ); }); + + it('should return virtual-address objects that exist in a particular partition', () => { + nock('http://localhost:8100') + .get('/mgmt/tm/ltm/virtual-address?$filter=partition+eq+Common&$select=fullPath,partition,address,metadata') + .reply( + 200, + { + items: [ + { + fullPath: '/Common/virtualAddress1', + partition: 'Common', + address: '192.0.2.4' + }, + { + fullPath: '/Common/virtualAddress2', + partition: 'Common', + address: '192.0.2.1', + metadata: [{ + name: 'foo', + value: 'bar' + }] + } + ] + } + ); + + return assert.becomes( + util.getVirtualAddressList(context, 'Common'), + [ + { + fullPath: '/Common/virtualAddress1', + partition: 'Common', + address: '192.0.2.4', + metadata: [] + }, + { + fullPath: '/Common/virtualAddress2', + partition: 'Common', + address: '192.0.2.1', + metadata: [{ + name: 'foo', + value: 'bar' + }] + } + ] + ); + }); + }); + + describe('.getAddressListList', () => { + beforeEach(() => { + context.tasks = [ + { + urlPrefix: 'http://admin@localhost:8100' + } + ]; + context.control = { + targetPort: 8100, + port: 8100, + basicAuth: 'HeresSomeBasicAuth', + targetContext: { + tokens: { + 'X-F5-Auth-Token': 'validtoken' + } + } + }; + }); + + it('should error when no context is provided', () => { + assert.isRejected( + util.getAddressListList(), + 'argument context required' + ); + }); + + it('should return empty array if no address-list objects exist', () => { + nock('http://localhost:8100') + .get('/mgmt/tm/net/address-list?$select=fullPath,partition,addresses,addressLists') + .reply( + 200, + { + items: [] + } + ); + + return assert.becomes( + util.getAddressListList(context), + [] + ); + }); + + it('should return address-list objects that exist', () => { + nock('http://localhost:8100') + .get('/mgmt/tm/net/address-list?$select=fullPath,partition,addresses,addressLists') + .reply( + 200, + { + items: [ + { + fullPath: '/Common/addressList1', + partition: 'Common', + addresses: ['192.0.2.3', '192.0.2.4'], + addressLists: ['/Common/addressList3'] + }, + { + fullPath: '/Common/addressList2', + partition: 'Common', + addresses: ['192.0.2.1', '192.0.2.2'], + addressLists: ['/Common/addressList4'] + }, + { + fullPath: '/Tenant/Application/addressList', + partition: 'Tenant', + addresses: ['192.0.2.4', '192.0.2.5'], + addressLists: ['/Common/addressList4'] + } + ] + } + ); + + return assert.becomes( + util.getAddressListList(context), + [ + { + fullPath: '/Common/addressList1', + partition: 'Common', + addresses: ['192.0.2.3', '192.0.2.4'], + addressLists: ['/Common/addressList3'] + }, + { + fullPath: '/Common/addressList2', + partition: 'Common', + addresses: ['192.0.2.1', '192.0.2.2'], + addressLists: ['/Common/addressList4'] + }, + { + fullPath: '/Tenant/Application/addressList', + partition: 'Tenant', + addresses: ['192.0.2.4', '192.0.2.5'], + addressLists: ['/Common/addressList4'] + } + ] + ); + }); + + it('should return address-list objects that exist in a particular partition', () => { + nock('http://localhost:8100') + .get('/mgmt/tm/net/address-list?$filter=partition+eq+Common&$select=fullPath,partition,addresses,addressLists') + .reply( + 200, + { + items: [ + { + fullPath: '/Common/addressList1', + partition: 'Common', + addresses: ['192.0.2.3', '192.0.2.4'], + addressLists: ['/Common/addressList3'] + }, + { + fullPath: '/Common/addressList2', + partition: 'Common', + addresses: ['192.0.2.1', '192.0.2.2'], + addressLists: ['/Common/addressList4'] + } + ] + } + ); + + return assert.becomes( + util.getAddressListList(context, 'Common'), + [ + { + fullPath: '/Common/addressList1', + partition: 'Common', + addresses: ['192.0.2.3', '192.0.2.4'], + addressLists: ['/Common/addressList3'] + }, + { + fullPath: '/Common/addressList2', + partition: 'Common', + addresses: ['192.0.2.1', '192.0.2.2'], + addressLists: ['/Common/addressList4'] + } + ] + ); + }); }); describe('.getAccessProfileList', () => { diff --git a/test/unit/nodejs/restWorker.js b/test/unit/nodejs/restWorker.js index 87ca6f22..9b941cf1 100644 --- a/test/unit/nodejs/restWorker.js +++ b/test/unit/nodejs/restWorker.js @@ -181,6 +181,21 @@ describe('restWorker', () => { { name: 'extra value added to the end of the path after application name', path: '/shared/appsvcs/declare/exampleTenant/applications/App1/somethingElse' + }, + { + name: 'cannot use Put on applications endpoint as we do NOT know the application to target', + method: 'Put', + path: '/shared/appsvcs/declare/foo/applications' + }, + { + name: 'cannot use Delete on applications endpoint as we should NOT be impacting unspecified applications', + method: 'Delete', + path: '/shared/appsvcs/declare/foo/applications' + }, + { + name: 'we do NOT support Post on specific applications as best practice indicates this should be done as a Put', + method: 'Post', + path: '/shared/appsvcs/declare/foo/applications/bar' } ]; @@ -214,11 +229,28 @@ describe('restWorker', () => { path: '/shared/appsvcs/task/foo' }, { - name: 'declare with tenant on per-app', + name: 'declare with Get with tenant on per-app', + method: 'Get', + path: '/shared/appsvcs/declare/foo/applications' + }, + { + name: 'declare with Post with tenant on per-app', + method: 'Post', path: '/shared/appsvcs/declare/foo/applications' }, { - name: 'declare with tenant on per-app with application', + name: 'declare with Get on per-app with applications and specific app', + method: 'Get', + path: '/shared/appsvcs/declare/foo/applications/bar' + }, + { + name: 'declare with Put on per-app with applications and specific app', + method: 'Put', + path: '/shared/appsvcs/declare/foo/applications/bar' + }, + { + name: 'declare with Delete on per-app with applications and specific app', + method: 'Delete', path: '/shared/appsvcs/declare/foo/applications/bar' } ]; @@ -226,6 +258,9 @@ describe('restWorker', () => { invalidPaths.forEach((path) => { it(`Should reject ${path.name} paths`, (done) => { const restOp = createRestOpMock(400, done, null, path.path); + if (path.method) { + restOp.method = path.method; + } assert.doesNotThrow(() => restWorker.onGet(restOp)); }); }); @@ -233,6 +268,9 @@ describe('restWorker', () => { validPaths.forEach((path) => { it(`Should accept ${path.name} paths`, (done) => { const restOp = createRestOpMock(200, done, null, path.path); + if (path.method) { + restOp.method = path.method; + } sinon.stub(restWorker, 'continuePost').callsFake((context, restOperation) => { restOperation.statusCode = 200; restOperation.body = { @@ -352,24 +390,20 @@ describe('restWorker', () => { const result = restUtil.buildOpResult( STATUS_CODES.OK, 'retrieving all tenant1 applications for per-app', - [ - { - app1: { - class: 'Application', - accelerator: { - class: 'HTTP_Acceleration_Profile' - } + { + app1: { + class: 'Application', + accelerator: { + class: 'HTTP_Acceleration_Profile' } }, - { - app2: { - class: 'Application', - accelerator: { - class: 'HTTP_Acceleration_Profile' - } + app2: { + class: 'Application', + accelerator: { + class: 'HTTP_Acceleration_Profile' } } - ] + } ); restUtil.completeRequest(restOp, result); }); @@ -379,24 +413,20 @@ describe('restWorker', () => { const restOp = createRestOpMock( 200, done, - [ - { - app1: { - class: 'Application', - accelerator: { - class: 'HTTP_Acceleration_Profile' - } + { + app1: { + class: 'Application', + accelerator: { + class: 'HTTP_Acceleration_Profile' } }, - { - app2: { - class: 'Application', - accelerator: { - class: 'HTTP_Acceleration_Profile' - } + app2: { + class: 'Application', + accelerator: { + class: 'HTTP_Acceleration_Profile' } } - ] + } ); restOp.method = 'Get'; restOp.setPathName('/shared/appsvcs/declare/tenant1/applications'); diff --git a/test/unit/postmanCollection.js b/test/unit/postmanCollection.js deleted file mode 100644 index 97d8ecbb..00000000 --- a/test/unit/postmanCollection.js +++ /dev/null @@ -1,95 +0,0 @@ -/** - * Copyright 2023 F5 Networks, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -'use strict'; - -const assert = require('assert'); - -const TestCollection = require('../common/testCollection'); - -describe('TestCollection', () => { - const name = 'myCollection'; - const collection = new TestCollection(name); - - it('should have info', () => { - assert(collection.info, 'info exists'); - assert.equal(collection.info.name, name, 'info has name'); - assert(collection.info.schema, 'info has schema'); - }); - - it('should have item', () => { - assert(Array.isArray(collection.item), 'item is an array'); - }); - - it('should allow basic auth', () => { - const auth = collection.auth; - assert(auth, 'auth exists'); - assert.equal(auth.type, 'basic', 'auth has correct type'); - const expectedBasic = [ - { - key: 'password', - value: '{{password}}', - type: 'string' - }, - { - key: 'username', - value: '{{username}}', - type: 'string' - } - ]; - assert.deepEqual(auth.basic, expectedBasic, 'auth has basic credentials'); - }); - - it('should pre-load item with clean-up', () => { - const item = collection.item[0]; - assert.equal(item.request.method, 'DELETE'); - assert.equal(item.request.url, 'https://{{host}}/mgmt/shared/appsvcs/declare/'); - }); - - it('should generate request item', () => { - collection.addItem({ - request: { - endpoint: 'mgmt/shared/appsvcs/info' - }, - events: { - test: [ - 'pm.test("Status code is 200", function () {pm.response.to.have.status(200);});' - ] - } - }); - const expectedItem = { - name: 'Request', - description: '', - request: { - method: 'GET', - body: {}, - header: undefined, - url: 'https://{{host}}/mgmt/shared/appsvcs/info' - }, - event: [{ - listen: 'test', - script: { - type: 'text/javascript', - exec: [ - 'pm.test("Status code is 200", function () {pm.response.to.have.status(200);});' - ] - } - }] - }; - const item = collection.item[1]; - assert.deepEqual(item, expectedItem, 'item has a request'); - }); -}); diff --git a/test/unit/schema/core-schema.js b/test/unit/schema/core-schema.js index 32ab1a87..696d24f8 100644 --- a/test/unit/schema/core-schema.js +++ b/test/unit/schema/core-schema.js @@ -48,7 +48,7 @@ describe('core-schema.json', () => { describe('valid', () => { it('should $schema property', () => { const data = { - $schema: 'https://raw.githubusercontent.com/F5Networks/f5-appsvcs-extension/master/schema/latest/as3-schema.json', + $schema: 'https://raw.githubusercontent.com/F5Networks/f5-appsvcs-extension/main/schema/latest/as3-schema.json', class: 'ADC', schemaVersion: '3.0.0', id: 'declarationId' @@ -1990,6 +1990,51 @@ describe('core-schema.json', () => { }; assert.ok(validate(data), getErrorString(validate)); }); + + it('should validate when virtualAddresses references an Address_List', () => { + const data = { + class: 'ADC', + schemaVersion: '3.0.0', + id: 'declarationId', + theTenant: { + class: 'Tenant', + application: { + class: 'Application', + template: 'generic', + coreService: { + class: 'Service_HTTP', + virtualAddresses: { + use: 'myAddressList' + } + } + } + } + }; + assert.ok(validate(data), getErrorString(validate)); + }); + + it('should validate when sourceAddress references an Address_List', () => { + const data = { + class: 'ADC', + schemaVersion: '3.0.0', + id: 'declarationId', + theTenant: { + class: 'Tenant', + application: { + class: 'Application', + template: 'generic', + coreService: { + class: 'Service_HTTP', + virtualType: 'internal', + sourceAddress: { + use: 'myAddressList' + } + } + } + } + }; + assert.ok(validate(data), getErrorString(validate)); + }); }); describe('.maximumBandwidth', () => { @@ -2053,6 +2098,30 @@ describe('core-schema.json', () => { }); describe('Service_L4', () => { + describe('valid', () => { + it('should validate when virtualPort references a Firewall_Port_List', () => { + const data = { + class: 'ADC', + schemaVersion: '3.0.0', + id: 'declarationId', + tenant: { + class: 'Tenant', + application: { + class: 'Application', + serviceGeneric: { + class: 'Service_L4', + virtualAddresses: ['192.0.2.1'], + virtualPort: { + use: 'myPortList' + } + } + } + } + }; + assert.ok(validate(data), getErrorString(validate)); + }); + }); + describe('invalid', () => { it('should invalidate when required property virtualAddresses is not specified', () => { const data = { @@ -2077,6 +2146,30 @@ describe('core-schema.json', () => { }); describe('Service_SCTP', () => { + describe('valid', () => { + it('should validate when virtualPort references a Firewall_Port_List', () => { + const data = { + class: 'ADC', + schemaVersion: '3.0.0', + id: 'declarationId', + tenant: { + class: 'Tenant', + application: { + class: 'Application', + serviceGeneric: { + class: 'Service_SCTP', + virtualAddresses: ['192.0.2.1'], + virtualPort: { + use: 'myPortList' + } + } + } + } + }; + assert.ok(validate(data), getErrorString(validate)); + }); + }); + describe('invalid', () => { it('should invalidate when required property virtualAddresses is not specified', () => { const data = { @@ -2121,6 +2214,11 @@ describe('core-schema.json', () => { }; }); + it('should validate when virtualPort references a Firewall_Port_List', () => { + data.tenant.application.serviceGeneric.virtualPort = { use: 'myPortList' }; + assert.ok(validate(data), getErrorString(validate)); + }); + it('should invalidate when required property virtualAddresses is not specified', () => { delete data.tenant.application.serviceGeneric.virtualAddresses; assert.strictEqual(validate(data), false, 'should have required property virtualAddresses'); @@ -2166,6 +2264,30 @@ describe('core-schema.json', () => { }); describe('Service_TCP', () => { + describe('valid', () => { + it('should validate when virtualPort references a Firewall_Port_List', () => { + const data = { + class: 'ADC', + schemaVersion: '3.0.0', + id: 'declarationId', + tenant: { + class: 'Tenant', + application: { + class: 'Application', + serviceGeneric: { + class: 'Service_TCP', + virtualAddresses: ['192.0.2.1'], + virtualPort: { + use: 'myPortList' + } + } + } + } + }; + assert.ok(validate(data), getErrorString(validate)); + }); + }); + describe('invalid', () => { it('should invalidate when required property virtualAddresses is not specified', () => { const data = { @@ -2281,6 +2403,20 @@ describe('core-schema.json', () => { }; assert.ok(validate(data), getErrorString(validate)); }); + + it('should validate when virtualPort references a Firewall_Port_List', () => { + data.theTenant.application.service = { + class: 'Service_HTTPS', + virtualAddresses: ['192.0.2.3'], + virtualPort: { + use: 'myPortList' + }, + serverTLS: { + bigip: '/Common/tlsServer' + } + }; + assert.ok(validate(data), getErrorString(validate)); + }); }); describe('invalid', () => { @@ -2366,6 +2502,13 @@ describe('core-schema.json', () => { }; assert.ok(validate(data), getErrorString(validate)); }); + + it('should validate when virtualPort references a Firewall_Port_List', () => { + data.theTenant.application.service.virtualPort = { + use: 'myPortList' + }; + assert.ok(validate(data), getErrorString(validate)); + }); }); describe('invalid', () => { @@ -3337,6 +3480,18 @@ describe('core-schema.json', () => { assert.ok(validate(data), getErrorString(validate)); }); + + it('should validate with route domain as a string', () => { + data.Tenant.Application.socksProfile = { + class: 'SOCKS_Profile', + resolver: { + bigip: '/Common/myDnsResolver' + }, + routeDomain: 'id-65534' + }; + + assert.ok(validate(data), getErrorString(validate)); + }); }); describe('Statistics_Profile', () => { diff --git a/test/unit/schema/def-ltm-policy-schema.js b/test/unit/schema/def-ltm-policy-schema.js index a1547355..450818a7 100644 --- a/test/unit/schema/def-ltm-policy-schema.js +++ b/test/unit/schema/def-ltm-policy-schema.js @@ -350,6 +350,37 @@ describe('def-ltm-policy-schema.json', () => { }); describe('Policy_Action', () => { + describe('Policy_Action_Bot_Defense', () => { + beforeEach(() => { + data.Tenant.Application.test1.rules[0].actions.push( + { + type: 'botDefense' + } + ); + }); + + describe('valid', () => { + it('should validate with required properties', () => assert.ok(validate(data), getErrorString(validate))); + + it('should validate updating event to a valid event type', () => { + data.Tenant.Application.test1.rules[0].actions[1].event = 'client-accepted'; + assert.ok(validate(data), getErrorString(validate)); + }); + + it('should validate updating fromProfile', () => { + data.Tenant.Application.test1.rules[0].actions[1].profile = { bigip: '/Common/fromProfile' }; + assert.ok(validate(data), getErrorString(validate)); + }); + }); + + describe('invalid', () => { + it('should invalidate invalid event type', () => { + data.Tenant.Application.test1.rules[0].actions[1].event = 'ws-request'; + assert.strictEqual(validate(data), false); + }); + }); + }); + describe('Policy_Action_TCL', () => { beforeEach(() => { data.Tenant.Application.test1.rules[0].actions.push( diff --git a/test/unit/schema/def-net-schema.js b/test/unit/schema/def-net-schema.js index cc5d72ab..99d0c9cb 100644 --- a/test/unit/schema/def-net-schema.js +++ b/test/unit/schema/def-net-schema.js @@ -344,6 +344,61 @@ describe('def-net-schema.json', () => { }); }); }); + + describe('Net_Port_List', () => { + let baseDecl; + beforeEach(() => { + baseDecl = { + class: 'ADC', + schemaVersion: '3.0.0', + id: 'declarationId', + theTenant: { + class: 'Tenant', + A1: { + class: 'Application', + template: 'generic', + npl: { + class: 'Net_Port_List', + ports: [ + 80, + 443, + '8080-8088' + ] + } + } + } + }; + }); + + describe('valid', () => { + it('should validate with just ports', () => { + assert.ok(validate(baseDecl), getErrorString(validate)); + }); + + it('should validate with just port-lists', () => { + delete baseDecl.theTenant.A1.npl.ports; + baseDecl.theTenant.A1.npl.portLists = [ + { use: '/Common/myPortList' } + ]; + assert.ok(validate(baseDecl), getErrorString(validate)); + }); + + it('should validate with ALL properties', () => { + baseDecl.theTenant.A1.npl.remark = 'The description'; + baseDecl.theTenant.A1.npl.portLists = [ + { use: '/Common/myPortList' } + ]; + assert.ok(validate(baseDecl), getErrorString(validate)); + }); + }); + + describe('invalid', () => { + it('should invalidate with neither ports nor port-lists', () => { + delete baseDecl.theTenant.A1.npl.ports; + assert.strictEqual(validate(baseDecl), false, 'must have at least one of ports or port-lists'); + }); + }); + }); }); function getErrorString() { diff --git a/versions.json b/versions.json index 76088827..cdcf29f9 100644 --- a/versions.json +++ b/versions.json @@ -1,7 +1,7 @@ { "versionMetaTimestamp": 1540928503, "latestVersion": { - "name": "3.44.0 (non-LTS)", + "name": "3.45.0 (non-LTS)", "url": "/products/extensions/f5-appsvcs-extension/latest/" }, "otherVersions": [