diff --git a/.ansible-lint b/.ansible-lint index 76acccf..4ae76a0 100644 --- a/.ansible-lint +++ b/.ansible-lint @@ -10,7 +10,7 @@ profile: production # and not relative to the CWD of execution. CLI arguments passed to the --exclude # option are parsed relative to the CWD of execution. exclude_paths: -# - .cache/ # implicit unless exclude_paths is defined in config + # - .cache/ # implicit unless exclude_paths is defined in config - .github/ # - test/fixtures/formatting-before/ # - test/fixtures/formatting-prettier/ @@ -21,9 +21,8 @@ exclude_paths: # Mock modules or roles in order to pass ansible-playbook --syntax-check # mock_modules: -# - paloaltonetworks.panos.panos_op # - zuul_return -# # note the foo.bar is invalid as being neither a module or a collection +# note the foo.bar is invalid as being neither a module or a collection # - fake_namespace.fake_collection.fake_module # - fake_namespace.fake_collection.fake_module.fake_submodule # mock_roles: @@ -53,7 +52,7 @@ exclude_paths: # When putting ignores inside the ignore file, they are marked as ignored, but # still visible, making it easier to address later. # skip_list: -# - role-name +# - skip_this_tag # Ansible-lint does not automatically load rules that have the 'opt-in' tag. # You must enable opt-in rules by listing each rule 'id' below. @@ -72,13 +71,13 @@ enable_list: # Ansible-lint does not fail on warnings from the rules or tags listed below # warn_list: - # - skip_this_tag - # - experimental # experimental is included in the implicit list - # - role-name - # - yaml[document-start] # you can also use sub-rule matches +# - skip_this_tag +# - experimental # experimental is included in the implicit list +# - role-name +# - yaml[document-start] # you can also use sub-rule matches # Some rules can transform files to fix (or make it easier to fix) identified -# errors. `ansible-lint --write` will reformat YAML files and run these transforms. +# errors. `ansible-lint --fix` will reformat YAML files and run these transforms. # By default it will run all transforms (effectively `write_list: ["all"]`). # You can disable running transforms by setting `write_list: ["none"]`. # Or only enable a subset of rule transforms by listing rules/tags here. @@ -88,11 +87,6 @@ enable_list: # Offline mode disables installation of requirements.yml and schema refreshing # offline: true -# Return success if number of violations compared with previous git -# commit has not increased. This feature works only in git -# repositories. -# progressive: false - # Define required Ansible's variables to satisfy syntax check # extra_vars: # foo: bar @@ -108,12 +102,12 @@ enable_list: # List of additional kind:pattern to be added at the top of the default # match list, first match determines the file kind. # kinds: - # - playbook: "**/examples/*.{yml,yaml}" - # - galaxy: "**/folder/galaxy.yml" - # - tasks: "**/tasks/*.yml" - # - vars: "**/vars/*.yml" - # - meta: "**/meta/main.yml" - # - yaml: "**/*.yaml-too" +# - playbook: "**/examples/*.{yml,yaml}" +# - galaxy: "**/folder/galaxy.yml" +# - tasks: "**/tasks/*.yml" +# - vars: "**/vars/*.yml" +# - meta: "**/meta/main.yml" +# - yaml: "**/*.yaml-too" # List of additional collections to allow in only-builtins rule. # only_builtins_allow_collections: @@ -125,3 +119,7 @@ enable_list: # Allow setting custom prefix for name[prefix] rule # task_name_prefix: "{stem} | " +# Complexity related settings + +# Limit the depth of the nested blocks: +# max_block_depth: 20 diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 49f7671..601beef 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -51,4 +51,4 @@ assignees: '' - Collection: - Python: - Ansible: -- Zscaler SDK Python Library & version (e.g. zscaler-sdk-python 1.0.0) \ No newline at end of file +- Zscaler SDK Python Library & version (e.g. zscaler-sdk-python 0.1.1) \ No newline at end of file diff --git a/.github/do-release.sh b/.github/do-release.sh deleted file mode 100644 index 61722b9..0000000 --- a/.github/do-release.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env bash - -ansible-galaxy collection build -ansible-galaxy collection publish zscaler-ziacloud-* --server release_galaxy -ansible-galaxy collection publish zscaler-ziacloud-* --server automation_hub \ No newline at end of file diff --git a/.github/set-version.sh b/.github/set-version.sh deleted file mode 100644 index c10eeeb..0000000 --- a/.github/set-version.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/env bash - -SCRIPT_BASE="$(cd "$( dirname "$0")" && pwd )" -ROOT=${SCRIPT_BASE}/.. - -# Exit immediatly if any command exits with a non-zero status -set -e - -# Usage -print_usage() { - echo "Set the app/add-on version" - echo "" - echo "Usage:" - echo " set-version.sh " - echo "" -} - -# if less than one arguments supplied, display usage -if [ $# -lt 1 ] -then - print_usage - exit 1 -fi - -# check whether user had supplied -h or --help . If yes display usage -if [ "$1" == "--help" ] || [ "$1" == "-h" ]; then - print_usage - exit 0 -fi - -# NEW_VERSION=$(echo "$1" | sed -e 's/-beta\./.b/' | sed -e 's/-alpha\./.a/') - -# Set version in galaxy.yml -grep -E '^version: (.+)$' "$ROOT/galaxy.yml" >/dev/null -sed -i.bak -E "s/^version: (.+)$/version: $1/" "$ROOT/galaxy.yml" && rm "$ROOT/galaxy.yml.bak" - -# Set version in docs/source/index.rst -grep -E '^Version: (.+)$' "$ROOT/docs/source/index.rst" > /dev/null -sed -i.bak -E "s/^Version: (.+)$/Version: $1/" "$ROOT/docs/source/index.rst" && rm "$ROOT/docs/source/index.rst.bak" - -# Set version in pyproject.toml -grep -E '^version = ".+"$' "$ROOT/pyproject.toml" >/dev/null -sed -i.bak -E "s/^version = \".+\"$/version = \"$1\"/" "$ROOT/pyproject.toml" && rm "$ROOT/pyproject.toml.bak" \ No newline at end of file diff --git a/.github/workflows/ansible-test-sanity.yml b/.github/workflows/ansible-test-sanity.yml new file mode 100644 index 0000000..4c79766 --- /dev/null +++ b/.github/workflows/ansible-test-sanity.yml @@ -0,0 +1,30 @@ +name: sanity + +on: + push: + branches: [master] + pull_request: + types: [opened, synchronize, reopened] + workflow_dispatch: + +jobs: + sanity: + timeout-minutes: 30 + name: Sanity (Ⓐ$${{ matrix.versions.ansible }}) + strategy: + fail-fast: false + matrix: + versions: + - ansible: stable-2.15 + python: "3.10" + - ansible: stable-2.16 + python: "3.11" + runs-on: ubuntu-22.04 + steps: + - name: Perform testing + uses: ansible-community/ansible-test-gh-action@release/v1 + with: + ansible-core-version: ${{ matrix.versions.ansible }} + origin-python-version: ${{ matrix.versions.python }} + target-python-version: ${{ matrix.versions.python }} + testing-type: sanity diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..978b9fb --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,46 @@ +name: Release + +on: + release: + types: + - created + +jobs: + release: + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - uses: actions/checkout@v4 + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: 3.8 + - name: Install pip + run: | + python -m pip install --upgrade pip + pip install ansible + - name: Create release artifacts + run: | + ansible-galaxy collection build + ansible-galaxy collection publish *.tar.gz --api-key ${{ secrets.GALAXY_API_KEY }} + - name: Release artifacts to GitHub + run: | + gh release upload $TAG ./zscaler-ziacloud*.tar.gz + env: + TAG: ${{ github.event.release.tag_name }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Upload to Ansible Automation Hub + run: | + cat << EOF > ansible.cfg + [galaxy] + server_list = automation_hub + + [galaxy_server.automation_hub] + url=https://console.redhat.com/api/automation-hub/content/inbound-zscaler/ + auth_url=https://sso.redhat.com/auth/realms/redhat-external/protocol/openid-connect/token + token=$AAP_KEY + EOF + ansible-galaxy collection publish ./zscaler-ziacloud*.tar.gz + env: + AAP_KEY: ${{ secrets.AAP_KEY }} diff --git a/.github/workflows/zia-test.yml b/.github/workflows/zia-test.yml deleted file mode 100644 index ca0d385..0000000 --- a/.github/workflows/zia-test.yml +++ /dev/null @@ -1,265 +0,0 @@ -name: ZIA CI Test - -on: - pull_request: - types: [opened, synchronize] - merge_group: - types: [checks_requested] - push: - branches: - - master - - schedule: - - cron: '0 14 * * 1-5' # UTC - workflow_dispatch: - -env: - NAMESPACE: zscaler - COLLECTION_NAME: ziacloud - PYTHON_VERSION: 3.8 - -jobs: - - ## Sanity is required: - # - # https://docs.ansible.com/ansible/latest/dev_guide/testing_sanity.html - sanity: - name: Sanity (Ⓐ${{ matrix.ansible }}) - strategy: - matrix: - include: - - ansible: "2.14" - python_ver: "3.11" - - ansible: "2.15" - python_ver: "3.11" - - ansible: "2.16" - python_ver: "3.11" - runs-on: ubuntu-latest - defaults: - run: - working-directory: ./ansible_collections/${{ env.NAMESPACE }}/${{ env.COLLECTION_NAME }} - steps: - - uses: actions/checkout@v4 - with: - path: ./ansible_collections/${{ env.NAMESPACE }}/${{ env.COLLECTION_NAME }} - - - name: Setup Python - uses: actions/setup-python@v5 - with: - python-version: ${{ matrix.python_ver }} - - - name: Install Poetry - uses: Gr1N/setup-poetry@v9 - #with: - # poetry-version: 1.0.10 - - # Install the head of the given branch (devel, stable-2.10) - - name: Install ansible-base (${{ matrix.ansible }}) - run: poetry run pip install https://github.com/ansible/ansible/archive/stable-${{ matrix.ansible }}.tar.gz --disable-pip-version-check - - - name: Create lock file - run: poetry lock - - #- name: Cache poetry dependencies - # uses: actions/cache@v2 - # with: - # #path: ~/.cache/pypoetry/virtualenvs - # #key: ${{ runner.os }}-poetry-${{ hashFiles('poetry.lock') }} - # ##restore-keys: | - # ## ${{ runner.os }}-poetry-${{ matrix.python-version }}- - # path: ${{ steps.poetry-cache.outputs.dir }} - # key: ${{ runner.os }}-poetry-${{ hashFiles('**/poetry.lock') }} - # restore-keys: | - # ${{ runner.os }}-poetry- - - - name: Install dependencies - run: poetry install - - - name: Run sanity tests - timeout-minutes: 8 - run: poetry run make new-sanity - - # Ansible-lint is a requirement for certification, and was added to the - # certification pipeline 20 June 2023 per Ansible Partner Engineering - # communication emails - # - # Config file is .ansible-lint - lint: - name: Ansible Lint - runs-on: ubuntu-latest - defaults: - run: - working-directory: ./ansible_collections/${{ env.NAMESPACE }}/${{ env.COLLECTION_NAME }} - steps: - - name: Check out code - uses: actions/checkout@v4 - - name: Run ansible-lint - uses: ansible/ansible-lint@main - - # Tox is used to execute linters required for Event-Driven Ansible (EDA) code: - # github.com/ansible/eda-partner-testing/blob/main/README.md - # Tox should only execute over /extensions/eda/plugins. - # Tox utilises the tox.ini file found in the local directory. - # This action is taken from Ansible Partner Engineering's example: - # github.com/ansible/eda-partner-testing/blob/main/.github/workflows/tox.yml - # Tox is planned by Ansible Partner Engineering to cover other code in future. - # tox: - # name: Tox Checks - # runs-on: ubuntu-latest - # steps: - # - uses: actions/checkout@v4 - # - name: Install deps - # run: python -m pip install tox - # - name: Move to tox conf file and run tox - # run: | - # cd .github/workflows - # python -m tox -- ../.. - - format: - name: Code Format Check - runs-on: ubuntu-latest - defaults: - run: - working-directory: ./ansible_collections/${{ env.NAMESPACE }}/${{ env.COLLECTION_NAME }} - steps: - - uses: actions/checkout@v4 - with: - path: ./ansible_collections/${{ env.NAMESPACE }}/${{ env.COLLECTION_NAME }} - - - name: Setup Python - uses: actions/setup-python@v5 - with: - python-version: ${{ env.PYTHON_VERSION }} - - - name: Install Poetry - uses: Gr1N/setup-poetry@v9 - - - name: Install dependencies - run: poetry install - - - name: Do black code format check - run: poetry run make check-format - - # release: - # name: release - # if: github.event_name == 'push' && github.ref == 'refs/heads/main' - # needs: [sanity, tox, lint, format] - # runs-on: ubuntu-latest - - # steps: - # - name: Checkout - # uses: actions/checkout@v4 - - # # This task could be removed once the task below is confirmed working - # - name: Set up Galaxy auth - # run: | - # mkdir -p ~/.ansible - # echo "token: $GALAXY_API_KEY" > ~/.ansible/galaxy_token - # env: - # GALAXY_API_KEY: ${{ secrets.GALAXY_API_KEY }} - # shell: bash - - # # New task for combined Galaxy and AutomationHub publishing - # - name: Set up Automation Hub and Galaxy ansible.cfg file - # run: | - # cat << EOF > ansible.cfg - # [galaxy] - # server_list = automation_hub, release_galaxy - # [galaxy_server.automation_hub] - # url=${{ secrets.AUTOMATION_HUB_URL }} - # auth_url=${{ secrets.AUTOMATION_HUB_SSO_URL }} - # token=${{ secrets.AUTOMATION_HUB_API_TOKEN }} - # [galaxy_server.release_galaxy] - # url=https://galaxy.ansible.com/ - # token=${{ secrets.GALAXY_API_KEY }} - # EOF - # shell: bash - - # - name: Create release and publish - # id: release - # uses: cycjimmy/semantic-release-action@v4 - # with: - # semantic_version: 17.1.1 - # extra_plugins: | - # conventional-changelog-conventionalcommits@^4.4.0 - # @semantic-release/changelog@^5.0.1 - # @semantic-release/git@^9.0.0 - # @semantic-release/exec@^5.0.0 - # env: - # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - # - name: Store built collection - # uses: actions/upload-artifact@v3 - # with: - # name: collection - # path: | - # *.tar.gz - - # docs: - # name: docs - # if: github.event_name == 'push' && github.ref == 'refs/heads/main' - # needs: [release] - # runs-on: ubuntu-latest - - # defaults: - # run: - # working-directory: ./ansible_collections/zscaler/ziacloud - - # steps: - # # Just a note here: The Ansible stuff is apparently doing realpath - # # checks, so trying to simlink stuff and then run Ansible commands - # # such as ansible-test in the symlink directory fails. Thus we need - # # to have the real path contain ansible_collections/zscaler/ziacloud. - # - name: Checkout - # uses: actions/checkout@v4 - # with: - # path: ./ansible_collections/zscaler/ziacloud - - # - name: Setup Python - # uses: actions/setup-python@v5 - # with: - # python-version: 3.9 - - # - name: Install Poetry - # uses: Gr1N/setup-poetry@v9 - - # - name: Add ansible-core - # run: poetry add ansible-core^2.14 - - # - name: Add antsibull-docs - # run: poetry add antsibull-docs^1.11.0 - - # - name: Install dependencies - # run: poetry install - - # - name: Build the collection - # run: poetry run ansible-galaxy collection build - - # # - name: Download built collection - # # uses: actions/download-artifact@v2 - # # with: - # # name: collection - - # - name: Install built collection - # run: poetry run ansible-galaxy collection install *.tar.gz - - # - name: Generate documentation - # run: poetry run make docs - - # # This is here for right now because the action to deploy seems to assume - # # (and not have a configuration option to) mirror the actions/checkout@v4 - # # the with.path spec. - # - name: Move the repo to where the deploy action is looking for it - # run: | - # cd ../../../.. - # mv ziacloud-ansible the_repo - # mv the_repo/ansible_collections/zscaler/ziacloud ziacloud-ansible - # mkdir -p ziacloud-ansible/ansible_collections/zscaler/ziacloud - - # - name: Deploy to GitHub Pages - # uses: JamesIves/github-pages-deploy-action@v4.4.3 - # with: - # token: ${{ secrets.GITHUB_TOKEN }} - # branch: gh-pages - # folder: docs/html - # clean: true \ No newline at end of file diff --git a/.gitignore b/.gitignore index 682a088..437a64e 100644 --- a/.gitignore +++ b/.gitignore @@ -110,7 +110,7 @@ zpa_all_together/* ansible_collections/ ansible_demo/ tests/integration/integration_config.yml -local_test +local_dev ansible.cfg examples sanity.py \ No newline at end of file diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index b20c750..6a5c4de 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -55,7 +55,7 @@ further defined and clarified by project maintainers. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported by contacting the project team at zscaler-partner-labs@z-bd.com. All +reported by contacting the project team at devrel@zscaler.com. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. diff --git a/Makefile b/Makefile index a42c99e..6494f9a 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,39 @@ # Taken from: https://github.com/sensu/sensu-go-ansible/blob/master/Makefile +COLOR_OK=\\x1b[0;32m +COLOR_NONE=\x1b[0m +COLOR_ERROR=\x1b[31;01m +COLOR_WARNING=\x1b[33;01m +COLOR_ZSCALER=\x1B[34;01m + +help: + @echo "$(COLOR_ZSCALER)" + @echo " ______ _ " + @echo " |___ / | | " + @echo " / / ___ ___ __ _| | ___ _ __ " + @echo " / / / __|/ __/ _\` | |/ _ \ '__|" + @echo " / /__\__ \ (_| (_| | | __/ | " + @echo " /_____|___/\___\__,_|_|\___|_| " + @echo " " + @echo " " + @echo "$(COLOR_NONE)" + @echo "$(COLOR_OK)ZIA Ansible Collection$(COLOR_NONE) version $(COLOR_WARNING)$(VERSION)$(COLOR_NONE)" + @echo "" + @echo "$(COLOR_WARNING)Usage:$(COLOR_NONE)" + @echo "$(COLOR_OK) make [command]$(COLOR_NONE)" + @echo "" + @echo "$(COLOR_WARNING)Available commands:$(COLOR_NONE)" + @echo "$(COLOR_OK) help$(COLOR_NONE) Show this help message" + @echo "$(COLOR_WARNING)clean$(COLOR_NONE)" + @echo "$(COLOR_OK) clean Remove all auto-generated files$(COLOR_NONE)" + @echo "$(COLOR_WARNING)development$(COLOR_NONE)" + @echo "$(COLOR_OK) check-format Check code format/style with black$(COLOR_NONE)" + @echo "$(COLOR_OK) format Reformat code with black$(COLOR_NONE)" + @echo "$(COLOR_OK) docs Build collection documentation$(COLOR_NONE)" + @echo "$(COLOR_OK) reqs Recreate the requirements.txt file$(COLOR_NONE)" + @echo "$(COLOR_WARNING)test$(COLOR_NONE)" + @echo "$(COLOR_OK) test:integration:zia Execute the full integration test suite$(COLOR_NONE)" + @echo "$(COLOR_OK) test:old-sanity Sanity tests for Ansible v2.9 and Ansible v2.10$(COLOR_NONE)" + @echo "$(COLOR_OK) test:new-sanity Sanity tests for Ansible v2.11 and above$(COLOR_NONE)" # Make sure we have ansible_collections/zscaler/ziacloud_enhanced # as a prefix. This is ugly as heck, but it works. I suggest all future @@ -21,15 +56,8 @@ python_version := $(shell \ python3 -c 'import sys; print(".".join(map(str, sys.version_info[:2])))' \ ) - -.PHONY: help -help: - @echo Available targets: - @fgrep "##" $(MAKEFILE_LIST) | fgrep -v fgrep | sort - .PHONY: docs docs: ## Build collection documentation - sudo make install rm -rf antsibull mkdir antsibull poetry run antsibull-docs collection --use-current --dest-dir antsibull --no-indexes zscaler.ziacloud @@ -38,6 +66,7 @@ docs: ## Build collection documentation rm -rf antsibull rm -f docs/source/modules/index.rst cd docs && sphinx-build source html + open docs/html/index.html .PHONY: clean clean: ## Remove all auto-generated files @@ -52,6 +81,11 @@ format: ## Format with black check-format: ## Check with black black --check --diff . +test\:integration\:zia: + @echo "$(COLOR_ZSCALER)Running zia integration tests...$(COLOR_NONE)" + ansible-playbook tests/integration/run_all_tests.yml + + .PHONY: old-sanity old-sanity: ## Sanity tests for Ansible v2.9 and Ansible v2.10 ansible-test sanity -v --skip-test pylint --skip-test rstcheck --python $(python_version) @@ -65,8 +99,10 @@ reqs: ## Recreate the requirements.txt file poetry export -f requirements.txt --output requirements.txt install: - cp -R /Users/wguilherme/ansible_collections/zscaler/ziacloud /opt/homebrew/lib/python3.11/site-packages/ansible_collections/zscaler/ rm -f zscaler* + pip3 install -r requirements.txt ansible-galaxy collection build . --force ansible-galaxy collection install zscaler* --force - rm -f zscaler* \ No newline at end of file + rm -f zscaler* + +.PHONY: clean-pyc clean-build docs clean local-setup \ No newline at end of file diff --git a/README.md b/README.md index 74d0482..506c22f 100644 --- a/README.md +++ b/README.md @@ -1,57 +1,33 @@ -# Zscaler Internet Access (ZIA) Ansible Collection +# Zscaler Internet Access (ZIA) Ansible Collection (Beta) + +[![CI](https://github.com/zscaler/ziacloud-ansible/actions/workflows/CI.yml/badge.svg)](https://github.com/zscaler/ziacloud-ansible/actions/workflows/CI.yml) +![Version on Galaxy](https://img.shields.io/badge/dynamic/json?style=flat&label=Ansible+Galaxy&prefix=v&url=https://galaxy.ansible.com/api/v2/collections/zscaler/ziacloud/&query=latest_version.version) +[![integration](https://github.com/zscaler/ziacloud-ansible/actions/workflows/ansible-test-integration.yml/badge.svg?branch=master)](https://github.com/zscaler/ziacloud-ansible/actions/workflows/ansible-test-integration.yml) +[![sanity](https://github.com/zscaler/ziacloud-ansible/actions/workflows/ansible-test-sanity.yml/badge.svg?branch=master)](https://github.com/zscaler/ziacloud-ansible/actions/workflows/ansible-test-sanity.yml) + +## Zscaler Support + +-> **Disclaimer:** Please refer to our [General Support Statement](/docs/support.md) before proceeding with the use of this collection. You can also refer to our [troubleshooting guide](/docs/troubleshooting.md) for guidance on typical problems. This collection contains modules and plugins to assist in automating the configuration and operational tasks on Zscaler Internet Access cloud, and API interactions with Ansible. -- Free software: Apache 2.0 License -- Documentation: - -- Repo: - -- Example Playbooks: - +- Free software: [MIT License](https://github.com/zscaler/ziacloud-ansible/blob/master/LICENSE) +- [Documentation](https://zscaler.github.io/ziacloud-ansible) +- [Repository](https://github.com/zscaler/ziacloud-ansible) +- [Example Playbooks](https://github.com/zscaler/ziacloud-playbooks) ## Tested Ansible Versions -This collection is tested with the most current Ansible 2.9 and 2.10 releases. Ansible versions -before 2.9.10 are **not supported**. - -## Included content - -- [zia_admin_role_management_facts](https://zscaler.github.io/ziacloud-ansible/modules/zia_admin_role_management_facts.html) - Gets a list of admin roles -- [zia_cloud_firewall_filtering_rule_facts](https://zscaler.github.io/ziacloud-ansible/modules/zia_cloud_firewall_filtering_rule_facts.html) - Create/Update/Delete an application segment. -- [zia_cloud_firewall_filtering_rule](https://zscaler.github.io/ziacloud-ansible/modules/zia_cloud_firewall_filtering_rule.html) - Gather information details (ID and/or Name) of a application segment. -- [zia_cloud_firewall_ip_destination_groups_facts](https://zscaler.github.io/ziacloud-ansible/modules/zia_cloud_firewall_ip_destination_groups_facts.html) - Create/Update/Delete an Application Server. -- [zia_cloud_firewall_ip_destination_groups](https://zscaler.github.io/ziacloud-ansible/modules/zia_cloud_firewall_ip_destination_groups.html) - Gather information details (ID and/or Name) of an application server. -- [zia_cloud_firewall_ip_source_groups_facts](https://zscaler.github.io/ziacloud-ansible/modules/zia_cloud_firewall_ip_source_groups_facts.html) - Gather information details (ID and/or Name) of an browser access certificate. -- [zia_cloud_firewall_ip_source_groups](https://zscaler.github.io/ziacloud-ansible/modules/zia_cloud_firewall_ip_source_groups.html) - Gather information details (ID and/or Name) of an cloud connector group. -- [zpa_customer_version_profile_facts](https://zscaler.github.io/ziacloud-ansible/modules/zpa_customer_version_profile_facts.html) - Gather information details (ID and/or Name) of an customer version profile for use in app connector group resource in the `version_profile_id` parameter. -- [zia_cloud_firewall_network_application_groups_facts](https://zscaler.github.io/ziacloud-ansible/modules/zia_cloud_firewall_network_application_groups_facts.html) - Gather information details (ID and/or Name) of an enrollment certificate for use when creating provisioning keys for connector groups or service edge groups. -- [zia_cloud_firewall_network_application_groups](https://zscaler.github.io/ziacloud-ansible/modules/zia_cloud_firewall_network_application_groups.html) - Gather information details (ID and/or Name) of an identity provider (IdP) created in the ZPA tenant. -- [zia_cloud_firewall_network_services_groups_facts](https://zscaler.github.io/ziacloud-ansible/modules/zia_cloud_firewall_network_services_groups_facts.html) - Gather information details (ID and/or Name) of an machine group for use in a policy access and/or forwarding rules. -- [zia_cloud_firewall_network_services_groups](https://zscaler.github.io/ziacloud-ansible/modules/zia_cloud_firewall_network_services_groups.html) - Create/Update/Delete a policy access rule. -- [zia_cloud_firewall_network_services_facts](https://zscaler.github.io/ziacloud-ansible/modules/zia_cloud_firewall_network_services_facts.html) - Gather information details (ID and/or Name) of a policy access rule. -- [zia_cloud_firewall_network_services](https://zscaler.github.io/ziacloud-ansible/modules/zia_cloud_firewall_network_services.html) - Create/Update/Delete a policy access timeout rule. -- [zia_dlp_dictionaries_facts](https://zscaler.github.io/ziacloud-ansible/modules/zia_dlp_dictionaries_facts.html) - Gather information details (ID and/or Name) of a policy access timeout rule. -- [zia_dlp_dictionaries](https://zscaler.github.io/ziacloud-ansible/modules/zia_dlp_dictionaries.html) - Create/Update/Delete a policy access forwarding rule. -- [zia_location_management_facts](https://zscaler.github.io/ziacloud-ansible/modules/zia_location_management_facts.html) - Gather information details (ID and/or Name) of a policy access forwarding rule. -- [zia_location_management](https://zscaler.github.io/ziacloud-ansible/modules/zia_location_management.html) - Gather information details (ID and/or Name) of a posture profile to use in a policy access, timeout or forwarding rules. -- [zia_rule_labels_facts](https://zscaler.github.io/ziacloud-ansible/modules/zia_rule_labels_facts.html) - Create/Update/Delete a provisioning key. -- [zia_rule_labels](https://zscaler.github.io/ziacloud-ansible/modules/zia_rule_labels.html) - Gather information details (ID and/or Name) of a provisioning key. -- [zia_traffic_forwarding_static_ips_facts](https://zscaler.github.io/ziacloud-ansible/modules/zia_traffic_forwarding_static_ips_facts.html) - Gather information details (ID and/or Name) of a saml attribute. -- [zia_traffic_forwarding_static_ips](https://zscaler.github.io/ziacloud-ansible/modules/zia_traffic_forwarding_static_ips.html) - Gather information details (ID and/or Name) of a scim attribute header. -- [zia_traffic_forwarding_vpn_credentials_facts](https://zscaler.github.io/ziacloud-ansible/modules/zia_traffic_forwarding_vpn_credentials_facts.html) - Gather information details (ID and/or Name) of a scim group. -- [zia_traffic_forwarding_vpn_credentials](https://zscaler.github.io/ziacloud-ansible/modules/zia_traffic_forwarding_vpn_credentials.html) - Create/Update/Delete a segment group. -- [zia_url_categories_facts](https://zscaler.github.io/ziacloud-ansible/modules/zia_url_categories_facts.html) - Gather information details (ID and/or Name) of a segment group. -- [zia_url_categories](https://zscaler.github.io/ziacloud-ansible/modules/zia_url_categories.html) - Create/Update/Delete a segment group. -- [zia_url_filtering_rules_facts](https://zscaler.github.io/ziacloud-ansible/modules/zia_url_filtering_rules_facts.html) - Gather information details (ID and/or Name) of a server group. -- [zia_url_filtering_rules](https://zscaler.github.io/ziacloud-ansible/modules/zia_url_filtering_rules.html) - Gather information details (ID and/or Name) of a service edge group. -- [zia_user_management_department_facts](https://zscaler.github.io/ziacloud-ansible/modules/zia_user_management_department_facts.html) - Create/Update/Delete an service edge group. -- [zia_user_management_groups_facts](https://zscaler.github.io/ziacloud-ansible/modules/zia_user_management_groups_facts.html) - Gather information details (ID and/or Name) of a trusted network for use in a policy access and/or forwarding rules. -- [zia_user_management_facts](https://zscaler.github.io/ziacloud-ansible/modules/zia_user_management_facts.html) - Gather information details (ID and/or Name) of a trusted network for use in a policy access and/or forwarding rules. - -## Installation and Usage - -Before using the ziacloud collection, you need to install it with the Ansible Galaxy CLI: +This collection is tested with the most current Ansible releases. Ansible versions +before 2.15 are **not supported**. + +## Python Version + +The minimum python version for this collection is python `3.9`. + +## Installation + +Install this collection using the Ansible Galaxy CLI: ```bash ansible-galaxy collection install zscaler.ziacloud @@ -64,23 +40,26 @@ You can also include it in a `requirements.yml` file and install it via `ansible - zscaler.ziacloud ``` -### Using modules from the ziacloud Collection in your playbooks +## Using modules from the ziacloud Collection in your playbooks -It's preferable to use content in this collection using their Fully Qualified Collection Namespace (FQCN), for example `zscaler.ziacloud.zia_cloud_firewall_filtering_rule`: +It's preferable to use content in this collection using their [Fully Qualified Collection Namespace (FQCN)](https://ansible.readthedocs.io/projects/lint/rules/fqcn/), for example `zscaler.ziacloud.zia_cloud_firewall_filtering_rule`: ```yaml --- -- hosts: localhost - gather_facts: false - connection: local +- name: ZIA Cloud Firewall Rule + hosts: localhost - tasks: - - name: Get Information Details of All Customer Version Profiles - zscaler.ziacloud.zia_cloud_firewall_filtering_rule_facts: - register: cloud_firewall_rule + vars: + zia_cloud: + username: "{{ lookup('env', 'ZIA_USERNAME') }}" + password: "{{ lookup('env', 'ZIA_PASSWORD') }}" + api_key: "{{ lookup('env', 'ZIA_API_KEY') }}" + cloud: "{{ lookup('env', 'ZIA_CLOUD') | default(omit) }}" - - name: Create/update firewall filtering rule - zscaler.ziacloud.zia_fw_filtering_rule: + tasks: + - name: Create/update firewall filtering rule + zscaler.ziacloud.zia_cloud_firewall_filtering_rule: + provider: "{{ zia_cloud }}" name: "Ansible Example" description: "Ansible Example" action: "ALLOW" @@ -95,42 +74,42 @@ It's preferable to use content in this collection using their Fully Qualified Co msg: "{{ created_rule }}" ``` -If you are using versions prior to Ansible 2.10 and this collection's existence, you can also define `collections` in your play and refer to this collection's modules as you did in Ansible 2.9 and below, as in this example: +(Note that [use of the `collections` key is now discouraged](https://ansible-lint.readthedocs.io/rules/fqcn/)) -```yaml ---- -- hosts: localhost - gather_facts: false - connection: local +## Releasing, changelogs, versioning and deprecation - collections: - - zscaler.ziacloud +The intended release frequency for major and minor versions are performed whenever there is a need for fixing issues or to address security concerns. - tasks: - - name: Get Information Details of All Customer Version Profiles - zpa_customer_version_profile_facts: - register: version_profile_id - - - name: Create App Connector Group Example - zpa_app_connector_groups: - name: "Example" - description: "Example" - enabled: true - city_country: "California, US" - country_code: "US" - latitude: "37.3382082" - longitude: "-121.8863286" - location: "San Jose, CA, USA" - upgrade_day: "SUNDAY" - upgrade_time_in_secs: "66600" - override_version_profile: true - version_profile_id: "{{ version_profile_id.data[0].id }}" - dns_query_type: "IPV4" - ... -``` +Changelog details are created automatically and more recently can be found [here](./CHANGELOG.md), but also the full history is [here](https://github.com/zscaler/ziacloud-ansible/releases). + +[Semantic versioning](https://semver.org/) is adhered to for this project. + +Deprecations are done by version number, not by date or by age of release. Breaking change deprecations will only be made with major versions. + +## Support + +The Zscaler Internet Access (ZIA) Collection of Ansible Modules is [certified on Ansible Automation Hub](https://console.redhat.com/ansible/automation-hub/repo/published/zscaler/ziacloud) and officially supported for Ansible subscribers. Ansible subscribers can engage for support through their usual route towards Red Hat. + +For those who are not Ansible subscribers, this Collection of Ansible Modules is also [published on Ansible Galaxy](https://galaxy.ansible.com/ui/repo/published/zscaler/ziacloud) and also supported via the formal Zscaler suppport process. Please refer to our [General Support Statement](/docs/support.md) + +## MIT License + +Copyright (c) 2023 [Zscaler](https://github.com/zscaler) -## Licensing +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -GNU General Public License v3.0 or later. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -See [LICENSE](http://www.apache.org/licenses/) to see the full text. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/SUPPORT.md b/SUPPORT.md deleted file mode 100644 index 320d7e5..0000000 --- a/SUPPORT.md +++ /dev/null @@ -1,15 +0,0 @@ -## Community Supported - -This template/solution are released under an as-is, best effort, support -policy. These scripts should be seen as community supported and Zscaler -Business Development Team will contribute our expertise as and when possible. -We do not provide technical support or help in using or troubleshooting the components -of the project through our normal support options such as Zscaler support teams, -or ASC (Authorized Support Centers) partners and backline -support options. The underlying product used (Zscaler Private Access API) but the -scripts or templates are still supported, but the support is only for the -product functionality and not for help in deploying or using the template or -script itself. Unless explicitly tagged, all projects or work posted in our -[GitHub repository](https://github.com/zscaler) or sites other -than our official [Downloads page](https://help.zscaler.com/login-tickets) -are provided under the best effort policy. diff --git a/docs/source/conf.py b/docs/source/conf.py index d9b9038..425520d 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -21,7 +21,7 @@ html_title = "Ansible Collections Documentation" # The full version, including alpha/beta/rc tags -release = "1.0.0" +release = "0.1.0" # Disable the Copyright footer for Read the docs at the bottom of the page # by setting property html_show_copyright = False diff --git a/docs/source/index.rst b/docs/source/index.rst index ba230cf..c34c86a 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -62,6 +62,12 @@ contributed by the **Zscaler's Technology Alliances** team. community_guides license +.. toctree:: + :maxdepth: 1 + :caption: Support Guide + + support + troubleshooting Author Information ================== @@ -93,7 +99,7 @@ Credits Support ======= -As of version 1.0.0, this Collection of Ansible Modules for Zscaler Internet Access is +As of version 0.1.0, this Collection of Ansible Modules for Zscaler Internet Access is [certified on Ansible Automation Hub](https://console.redhat.com/ansible/automation-hub/repo/published/zscaler/ziacloud) and officially supported for Ansible subscribers. Ansible subscribers can engage for support through their usual route towards Red Hat. diff --git a/docs/source/release_notes.rst b/docs/source/release_notes.rst index 69813a7..2518a1f 100644 --- a/docs/source/release_notes.rst +++ b/docs/source/release_notes.rst @@ -6,7 +6,7 @@ Releases ====================== -Version 1.0.0 +Version 0.1.0 ============= Notes diff --git a/docs/source/support.rst b/docs/source/support.rst new file mode 100644 index 0000000..3ddc115 --- /dev/null +++ b/docs/source/support.rst @@ -0,0 +1,33 @@ +.. ........................................................................... +.. © Copyright Zscaler Inc, 2024 . +.. ........................................................................... + +============= +Support Guide +============= + +General Support Statement +========================= + +This ZIA Ansible Collection Module is supported and maintained by the Zscaler Technology Alliances team in partnership with Zscaler's engineering, +and we welcome questions on how to use the collection. +Please refer to our :doc:`troubleshooting guide ` for guidance on typical problems. + +Support Ticket Severity +----------------------- + +Support tickets related to this Ansible Collection can be opened with `Zscaler Support `_, however, since the collection is just a client of the underlying product API, +we will **NOT** be able to treat ansible-related support requests as a Severity-1 (Immediate time frame). + +When reporting bugs, please provide the Ansible playbook that demonstrates the bug and the command output. Tracebacks are also helpful. + +Notice that we will **NOT**, however, fix bugs upon customer demand, as we have to prioritize all pending bugs and features, as part of the product's backlog and release cycles. + +Urgent, production-related Ansible issues can be resolved via direct interaction with the underlying API or UI. We will ask customers to resort to these methods to resolve downtime or urgent issues. + +If you have an urgent escalation, please contact your local Zscaler account team (RSM/SE/CSM/TAM) for assistance. + +Contact +------- + +For questions or requests that cannot be submitted via GitHub Issues, please contact devrel@zscaler.com with "zia-ansible-collection" in the subject line. diff --git a/docs/source/troubleshooting.rst b/docs/source/troubleshooting.rst new file mode 100644 index 0000000..e08f222 --- /dev/null +++ b/docs/source/troubleshooting.rst @@ -0,0 +1,12 @@ +.. ........................................................................... +.. © Copyright Zscaler Inc, 2024 . +.. ........................................................................... + +====================== +Troubleshooting Guide +====================== + +How to troubleshoot your problem +--------------------------------- + +This section is under construction \ No newline at end of file diff --git a/galaxy.yml b/galaxy.yml index 53eb0e9..89f9985 100644 --- a/galaxy.yml +++ b/galaxy.yml @@ -10,7 +10,7 @@ namespace: "zscaler" name: "ziacloud" # The version of the collection. Must be compatible with semantic versioning -version: 1.0.0 +version: 0.1.0 # The path to the Markdown (.md) readme file. This path is relative to the root of the collection readme: "README.md" @@ -18,7 +18,7 @@ readme: "README.md" # A list of the collection's content authors. Can be just the name or in the format 'Full Name (url) # @nicks:irc/im.site#channel' authors: - - Zscaler Solutions Architecture + - Zscaler Inc. ### OPTIONAL but strongly recommended diff --git a/meta/runtime.yml b/meta/runtime.yml index 2ee3c9f..1e85b01 100644 --- a/meta/runtime.yml +++ b/meta/runtime.yml @@ -1,2 +1,2 @@ --- -requires_ansible: '>=2.9.10' +requires_ansible: ">=2.15.0" diff --git a/plugins/doc_fragments/fragments.py b/plugins/doc_fragments/fragments.py index c6182d5..64ee483 100644 --- a/plugins/doc_fragments/fragments.py +++ b/plugins/doc_fragments/fragments.py @@ -1,7 +1,25 @@ -#!/usr/bin/python # -*- coding: utf-8 -*- -# Copyright: (c) 2023, William Guilherme (@willguibr) +# Copyright (c) 2023 Zscaler Inc, + +# MIT License +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. from __future__ import absolute_import, division, print_function @@ -15,22 +33,22 @@ class ModuleDocFragment(object): options: username: description: - - A string that contains the email ID of the API admin + - A string that contains the email ID of the API admin. required: true type: str password: description: - - A string that contains the password for the API admin + - A string that contains the password for the API admin. required: true type: str api_key: description: - - A string that contains the obfuscated API key + - A string that contains the obfuscated API key. required: true type: str cloud: description: - - The Zscaler cloud name was provisioned for your organization + - The Zscaler cloud name was provisioned for your organization. required: true type: str choices: @@ -42,36 +60,41 @@ class ModuleDocFragment(object): - zscalerbeta - zscalergov - zscalerten + sandbox_token: + description: + - A string that contains the Sandbox API Key. + type: str + required: false """ PROVIDER = r""" options: provider: description: - - A dict object containing connection details. - required: true + - A dict object containing connection details. This is optional; credentials can also be provided directly at the top level. type: dict + required: False suboptions: username: description: - - A string that contains the email ID of the API admin - required: true + - A string that contains the email ID of the API admin. type: str + required: True password: description: - - A string that contains the password for the API admin - required: true + - A string that contains the password for the API admin. type: str + required: True api_key: description: - - A string that contains the obfuscated API key - required: true + - A string that contains the obfuscated API key. type: str + required: True cloud: description: - - The Zscaler cloud name was provisioned for your organization - required: true + - The Zscaler cloud name was provisioned for your organization. type: str + required: True choices: - zscloud - zscaler @@ -81,30 +104,35 @@ class ModuleDocFragment(object): - zscalerbeta - zscalergov - zscalerten + sandbox_token: + description: + - A string that contains the Sandbox API Key. + type: str + required: False """ STATE = r""" - options: - state: - description: - - The state. - type: str - default: present - choices: - - present - - absent +options: + state: + description: + - Specifies the desired state of the resource. + type: str + default: present + choices: + - present + - absent """ ENABLED_STATE = r""" - options: - state: - description: - - The state. - type: str - default: present - choices: - - present - - absent - - enabled - - disabled +options: + state: + description: + - Specifies the desired state of the resource. + type: str + default: present + choices: + - present + - absent + - enabled + - disabled """ diff --git a/plugins/module_utils/utils.py b/plugins/module_utils/utils.py index d55ff8d..e7ed6b5 100644 --- a/plugins/module_utils/utils.py +++ b/plugins/module_utils/utils.py @@ -1,8 +1,40 @@ +# -*- coding: utf-8 -*- +# +# Copyright (c) 2023 Zscaler Inc, + +# MIT License +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + from __future__ import absolute_import, division, print_function __metaclass__ = type -from netaddr import IPAddress, IPNetwork, AddrFormatError +from ansible.module_utils.basic import missing_required_lib + +try: + from netaddr import IPAddress, AddrFormatError + HAS_NETADDR = True + ADDR_IMPORT_ERROR = None # Set to None when import is successful +except ImportError: + IPAddress = None # Setting to None to indicate unavailability + HAS_NETADDR = False + ADDR_IMPORT_ERROR = missing_required_lib("netaddr") # Store the error for reporting def validate_iso3166_alpha2(country_code): @@ -72,6 +104,9 @@ def diff_suppress_func_coordinate(old, new): def is_valid_ipv4_or_range(value): + if not HAS_NETADDR: + raise ImportError(ADDR_IMPORT_ERROR) # Raise the captured ImportError if netaddr is missing + try: if "-" in value: # If it's a range start_ip, end_ip = value.split("-") @@ -100,6 +135,10 @@ def validate_location_mgmt(location_mgmt): """ Validate location management configuration based on given rules. """ + # Default setting for ip_addresses to avoid TypeError on iteration + ip_addresses = location_mgmt.get("ip_addresses", []) + parent_id = location_mgmt.get("parent_id") + surrogate_ip = location_mgmt.get("surrogate_ip") idle_time_in_minutes = location_mgmt.get("idle_time_in_minutes") auth_required = location_mgmt.get("auth_required") @@ -239,9 +278,9 @@ def validate_location_mgmt(location_mgmt): converted_surrogate_refresh_time = convert_to_minutes( surrogate_refresh_time_in_minutes, surrogate_refresh_time_unit ) - location_mgmt[ - "surrogate_refresh_time_in_minutes" - ] = converted_surrogate_refresh_time + location_mgmt["surrogate_refresh_time_in_minutes"] = ( + converted_surrogate_refresh_time + ) # Re-validate the converted surrogate_refresh_time_in_minutes if ( @@ -270,15 +309,62 @@ def validate_location_mgmt(location_mgmt): "When 'caution_enabled' is set to true, 'auth_required' must be disabled." ) - # Validate IP addresses - ip_addresses = location_mgmt.get("ip_addresses", []) - for ip in ip_addresses: - if not is_valid_ipv4_or_range(ip): - raise ValueError(f"Invalid IPv4 address or range: {ip}") + # Check VPN credentials to determine if IP addresses need to be validated for IP type VPN + validate_ips = False + vpn_credentials = location_mgmt.get("vpn_credentials", []) + for cred in vpn_credentials: + if cred.get("type") == "IP": + validate_ips = True + break + + # Validate IP addresses only if necessary: + if validate_ips: + if not ip_addresses: # This checks if IP addresses are provided when needed + raise ValueError( + "IP addresses must be provided for IP type VPN credentials." + ) + for ip in ip_addresses: + if not is_valid_ipv4_or_range(ip): + raise ValueError(f"Invalid IPv4 address or range: {ip}") + + # Rule for parent_id and ip_addresses: + # Validate ip_addresses are provided if parent_id is not None and not 0 (indicating a sub-location) + if parent_id is not None and parent_id != 0: + if not ip_addresses: + raise ValueError( + "When 'parent_id' is not 0, 'ip_addresses' must not be empty." + ) - parent_id = location_mgmt.get("parent_id") - ip_addresses = location_mgmt.get("ip_addresses", []) - # New Rule: When parent_id is not 0, ip_addresses must not be empty - if parent_id is not None and parent_id != 0 and not ip_addresses: - raise ValueError("When 'parent_id' is not 0, 'ip_addresses' must not be empty.") +# This function is used by the Location Management to distinguish +# Between VPN Type IP and UFQDN +def process_vpn_credentials(vpn_creds): + if not vpn_creds: + return [] + processed_creds = [] + for cred in vpn_creds: + if cred["type"] == "UFQDN": + # For UFQDN, ensure 'fqdn' is provided and ignore 'ip_address' + if "fqdn" not in cred or not cred["fqdn"]: + raise ValueError("FQDN must be provided for UFQDN VPN credentials") + processed_creds.append( + { + "id": cred.get("id"), + "type": "UFQDN", + "fqdn": cred["fqdn"], + "pre_shared_key": cred.get("pre_shared_key"), + } + ) + elif cred["type"] == "IP": + # For IP, ensure 'ip_address' is provided + if "ip_address" not in cred or not cred["ip_address"]: + raise ValueError("IP address must be provided for IP VPN credentials") + processed_creds.append( + { + "id": cred.get("id"), + "type": "IP", + "ip_address": cred["ip_address"], + "pre_shared_key": cred.get("pre_shared_key"), + } + ) + return processed_creds diff --git a/plugins/module_utils/version.py b/plugins/module_utils/version.py index 127dd20..424fd3c 100644 --- a/plugins/module_utils/version.py +++ b/plugins/module_utils/version.py @@ -1,12 +1,31 @@ -#!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, + +# MIT License +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + from __future__ import absolute_import, division, print_function __metaclass__ = type # Make sure to keep this file in sync with the version in the galaxy.yml -__version__ = "1.0.0" -__author__ = "Zscaler" -__email__ = "zscaler-partner-labs@z-bd.com" +__version__ = "0.1.0" +__author__ = "Zscaler, Inc." +__email__ = "devrel@zscaler.com" diff --git a/plugins/module_utils/zia_client.py b/plugins/module_utils/zia_client.py index c5cf95c..c0f33da 100644 --- a/plugins/module_utils/zia_client.py +++ b/plugins/module_utils/zia_client.py @@ -29,12 +29,18 @@ __metaclass__ = type -from ansible.module_utils.basic import env_fallback - -import platform +from ansible.module_utils.basic import missing_required_lib, env_fallback from ansible.module_utils import ansible_release -import importlib -from zscaler.zia import ZIAClientHelper as ZIA +import platform + +try: + from zscaler.zia import ZIAClientHelper as ZIA + HAS_ZSCALER = True + ZSCALER_IMPORT_ERROR = None +except ImportError: + ZIA = object # Default to object if import fails + HAS_ZSCALER = False + ZSCALER_IMPORT_ERROR = missing_required_lib("zscaler") VALID_ZIA_CLOUD = { "zscaler", @@ -49,97 +55,45 @@ } -def to_zscaler_sdk_cls(pkg_name, cls_name): - sdk_names = ( - "zscaler", - ) # tuple with one item for now. You can add more SDK names if needed - - for sdk_name in sdk_names: - try: - mod = importlib.import_module("{0}.{1}".format(sdk_name, pkg_name)) - except ModuleNotFoundError: - continue - else: - try: - return getattr(mod, cls_name) - except AttributeError: - raise Exception( - "{0}.{1}.{2} does not exist".format(sdk_name, pkg_name, cls_name) - ) - - raise Exception("Couldn't find any sdk package named {0}".format(pkg_name)) - - class ConnectionHelper: def __init__(self, min_sdk_version): + if not HAS_ZSCALER: + raise ImportError(ZSCALER_IMPORT_ERROR) + self.min_sdk_version = min_sdk_version - self.sdk_installed = self._check_sdk_installed() - - def _check_sdk_installed(self): - try: - import zscaler - - installed_version = tuple(map(int, zscaler.__version__.split("."))) - if installed_version < self.min_sdk_version: - raise Exception( - f"zscaler version should be >= {'.'.join(map(str, self.min_sdk_version))}" - ) - return True - except ModuleNotFoundError: - return False - except AttributeError: + self.check_sdk_installed() + + def check_sdk_installed(self): + import zscaler + + installed_version = tuple(map(int, zscaler.__version__.split("."))) + if installed_version < self.min_sdk_version: raise Exception( - "zscaler does not have a __version__ attribute. Please ensure you have the correct SDK installed." + f"zscaler version should be >= {'.'.join(map(str, self.min_sdk_version))}" ) - def ensure_sdk_installed(self): - if not self.sdk_installed: - raise Exception('Missing required SDK "zscaler".') - class ZIAClientHelper(ZIA): def __init__(self, module): - self.connection_helper = ConnectionHelper(min_sdk_version=(1, 0, 0)) - self.connection_helper.ensure_sdk_installed() + if not HAS_ZSCALER: + module.fail_json(msg="The 'zscaler' library is required for this module.", exception=ZSCALER_IMPORT_ERROR) + self.connection_helper = ConnectionHelper(min_sdk_version=(0, 1, 0)) provider = module.params.get("provider") or {} - - username = ( - provider.get("username") if provider else module.params.get("username") - ) - if not username: - raise ValueError("username must be provided via provider or directly") - - password = ( - provider.get("password") if provider else module.params.get("password") - ) - if not password: - raise ValueError("password must be provided via provider or directly") - - api_key = provider.get("api_key") if provider else module.params.get("api_key") - if not api_key: - raise ValueError("api_key must be provided via provider or directly") - - cloud_env = provider.get("cloud") if provider else module.params.get("cloud") - if not cloud_env: - raise ValueError("cloud must be provided via provider or directly") - + username = provider.get("username") or module.params.get("username") + password = provider.get("password") or module.params.get("password") + api_key = provider.get("api_key") or module.params.get("api_key") + cloud_env = provider.get("cloud") or module.params.get("cloud") cloud_env = cloud_env.lower() if cloud_env not in VALID_ZIA_CLOUD: - raise ValueError( - f"Invalid ZIA Cloud environment '{cloud_env}'. Supported environments are: {', '.join(VALID_ZIA_CLOUD)}." - ) + raise ValueError(f"Invalid ZIA Cloud environment '{cloud_env}'.") super().__init__( - username=username, - password=password, - api_key=api_key, - cloud=cloud_env, # using the validated cloud environment + username=username, password=password, api_key=api_key, cloud=cloud_env ) - - ansible_version = ansible_release.__version__ # Get the Ansible version - self.user_agent = f"zia-ansible/{ansible_version}/({platform.system().lower()} {platform.machine()}" + ansible_version = ansible_release.__version__ + self.user_agent = f"zia-ansible/{ansible_version}/({platform.system().lower()} {platform.machine()})" @staticmethod def zia_argument_spec(): @@ -148,45 +102,85 @@ def zia_argument_spec(): type="dict", options=dict( username=dict( - no_log=True, + no_log=False, + required=True, # Not required at the provider level if they are provided at the top level fallback=(env_fallback, ["ZIA_USERNAME"]), + type="str", ), password=dict( no_log=True, + required=True, fallback=(env_fallback, ["ZIA_PASSWORD"]), + type="str", ), api_key=dict( no_log=True, + required=True, fallback=(env_fallback, ["ZIA_API_KEY"]), + type="str", ), cloud=dict( no_log=False, + required=True, + choices=[ + "zscloud", + "zscaler", + "zscalerone", + "zscalertwo", + "zscalerthree", + "zscalerbeta", + "zscalergov", + "zscalerten", + ], fallback=(env_fallback, ["ZIA_CLOUD"]), + type="str", ), sandbox_token=dict( no_log=True, + required=False, fallback=(env_fallback, ["ZIA_SANDBOX_TOKEN"]), + type="str", ), ), ), username=dict( no_log=True, + required=True, fallback=(env_fallback, ["ZIA_USERNAME"]), + type="str", ), password=dict( no_log=True, + required=True, fallback=(env_fallback, ["ZIA_PASSWORD"]), + type="str", ), api_key=dict( no_log=True, + required=True, fallback=(env_fallback, ["ZIA_API_KEY"]), + type="str", ), cloud=dict( no_log=False, + required=True, + choices=[ + "zscloud", + "zscaler", + "zscalerone", + "zscalertwo", + "zscalerthree", + "zscalerbeta", + "zscalergov", + "zscalerten", + ], fallback=(env_fallback, ["ZIA_CLOUD"]), + type="str", ), sandbox_token=dict( no_log=True, + required=False, fallback=(env_fallback, ["ZIA_SANDBOX_TOKEN"]), + type="str", ), ) diff --git a/plugins/modules/zia_activation_status.py b/plugins/modules/zia_activation_status.py index a962044..f949334 100644 --- a/plugins/modules/zia_activation_status.py +++ b/plugins/modules/zia_activation_status.py @@ -37,8 +37,8 @@ - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider + - zscaler.ziacloud.fragments.documentation - - zscaler.ziacloud.fragments.state options: status: description: @@ -46,7 +46,14 @@ required: true type: str choices: - - 'ACTIVE' + - ACTIVE + + state: + description: + - Whether the certificate should be present or absent. + default: present + choices: ['present'] + type: str """ EXAMPLES = r""" @@ -60,16 +67,24 @@ # Activates the saved configuration changes. """ -from traceback import format_exc - -from ansible.module_utils._text import to_native from ansible.module_utils.basic import AnsibleModule -from ansible_collections.zscaler.ziacloud.plugins.module_utils.zia_client import ( - ZIAClientHelper, -) +import traceback + +# Initialize the variable at the module level +zia_client_import_error = None + +try: + from ansible_collections.zscaler.ziacloud.plugins.module_utils.zia_client import ZIAClientHelper +except ImportError as imp_exc: + ZIAClientHelper = None + zia_client_import_error = imp_exc def core(module): + if ZIAClientHelper is None: + module.fail_json(msg="Failed to import ZIAClientHelper: {}".format(zia_client_import_error)) + return + client = ZIAClientHelper(module) desired_status = module.params.get("status", None) @@ -115,9 +130,9 @@ def core(module): def main(): - argument_spec = ZIAClientHelper.zia_argument_spec() + argument_spec = ZIAClientHelper.zia_argument_spec() if ZIAClientHelper else {} argument_spec.update( - status=dict(type="str", choices=["ACTIVE"], required=False), + status=dict(type="str", choices=["ACTIVE"], required=True), state=dict(type="str", choices=["present"], default="present"), ) module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True) @@ -125,7 +140,7 @@ def main(): try: core(module) except Exception as e: - module.fail_json(msg=to_native(e), exception=format_exc()) + module.fail_json(msg="Unhandled exception: {}".format(e), exception=traceback.format_exc()) if __name__ == "__main__": diff --git a/plugins/modules/zia_activation_status_facts.py b/plugins/modules/zia_activation_status_facts.py index c2f62c2..b23a91e 100644 --- a/plugins/modules/zia_activation_status_facts.py +++ b/plugins/modules/zia_activation_status_facts.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -30,7 +31,7 @@ --- module: zia_activation_status_facts -version_added: "1.0.0" +version_added: "0.1.0" short_description: Gets the activation status @@ -45,6 +46,7 @@ extends_documentation_fragment: - zscaler.ziacloud.fragments.provider + - zscaler.ziacloud.fragments.documentation options: status: @@ -77,7 +79,7 @@ def core(module): activation_status = module.params.get("status", None) client = ZIAClientHelper(module) - current_activation_status = client.config.activate() + current_activation_status = client.activate.activate() # If specific status provided, check if it matches the current activation status if activation_status: diff --git a/plugins/modules/zia_admin_role_management_facts.py b/plugins/modules/zia_admin_role_management_facts.py index 0523822..9fffe4d 100644 --- a/plugins/modules/zia_admin_role_management_facts.py +++ b/plugins/modules/zia_admin_role_management_facts.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -33,21 +34,23 @@ - "Gets a list of admin roles" author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider + - zscaler.ziacloud.fragments.documentation options: id: description: - Admin role ID. type: int + required: false name: description: - Name of the admin role. - required: true + required: false type: str """ @@ -100,7 +103,7 @@ def main(): argument_spec = ZIAClientHelper.zia_argument_spec() argument_spec.update( name=dict(type="str", required=False), - id=dict(type="str", required=False), + id=dict(type="int", required=False), ) module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True) try: diff --git a/plugins/modules/zia_authentication_settings.py b/plugins/modules/zia_authentication_settings.py index f9e7327..d7c04e4 100644 --- a/plugins/modules/zia_authentication_settings.py +++ b/plugins/modules/zia_authentication_settings.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -32,13 +33,14 @@ description: Adds or removes URLs from the cookie authentication exempt list. author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - - zscaler.ziacloud.fragments.provider + - zscaler.ziacloud.fragments.provider + - zscaler.ziacloud.fragments.documentation + - zscaler.ziacloud.fragments.state - - zscaler.ziacloud.fragments.state options: urls: description: diff --git a/plugins/modules/zia_cloud_browser_isolation_profile_facts.py b/plugins/modules/zia_cloud_browser_isolation_profile_facts.py index bb77905..61fecac 100644 --- a/plugins/modules/zia_cloud_browser_isolation_profile_facts.py +++ b/plugins/modules/zia_cloud_browser_isolation_profile_facts.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -32,21 +33,23 @@ description: Retrieves a cloud browser isolation profile. author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider + - zscaler.ziacloud.fragments.documentation options: id: description: - The universally unique identifier (UUID) for the browser isolation profile. type: str + required: false name: description: - Name of the browser isolation profile. - required: true + required: false type: str """ diff --git a/plugins/modules/zia_cloud_firewall_filtering_rule.py b/plugins/modules/zia_cloud_firewall_filtering_rule.py index ff32e04..819e80b 100644 --- a/plugins/modules/zia_cloud_firewall_filtering_rule.py +++ b/plugins/modules/zia_cloud_firewall_filtering_rule.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -32,13 +33,14 @@ description: "Adds a new Firewall Filtering policy rule." author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider - + - zscaler.ziacloud.fragments.documentation - zscaler.ziacloud.fragments.state + options: id: description: "Unique identifier for the Firewall Filtering policy rule" @@ -57,35 +59,42 @@ required: false default: 7 type: int + enable_full_logging: + description: + - Aggregate The service groups together individual sessions based on user, rule, network service, network application and records them periodically. + - Full The service logs all sessions of the rule individually, except HTTPS or HTTPS. + - Full logging on all other rules requires the Full Logging license. Only Block rules support full logging. + required: false + type: bool locations: description: "The locations to which the Firewall Filtering policy rule applies" type: list - elements: str + elements: int required: false location_groups: description: "The location groups to which the Firewall Filtering policy rule applies" type: list - elements: str + elements: int required: false departments: description: "The departments to which the Firewall Filtering policy rule applies" type: list - elements: str + elements: int required: false groups: description: "The groups to which the Firewall Filtering policy rule applies" type: list - elements: str + elements: int required: false users: description: "The users to which the Firewall Filtering policy rule applies" type: list - elements: str + elements: int required: false time_windows: description: "The time interval in which the Firewall Filtering policy rule applies" type: list - elements: str + elements: int required: false workload_groups: description: "The list of preconfigured workload groups to which the policy must be applied." @@ -106,11 +115,7 @@ description: - Determines whether the Firewall Filtering policy rule is enabled or disabled required: false - type: str - choices: - - DISABLED - - ENABLED - default: ENABLED + type: bool description: description: "Additional information about the rule" required: false @@ -127,7 +132,7 @@ - User-defined source IP address groups for which the rule is applicable. - If not set, the rule is not restricted to a specific source IP address group. type: list - elements: str + elements: int required: false dest_addresses: description: @@ -147,6 +152,7 @@ description: - Destination countries for which the rule is applicable. - If not set, the rule is not restricted to specific destination countries. + - Provide a ISO3166 Alpha2 code. visit the following site for reference U(https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes) type: list elements: str required: false @@ -155,51 +161,112 @@ - User-defined destination IP address groups on which the rule is applied. - If not set, the rule is not restricted to a specific destination IP address group. type: list + elements: int + required: false + source_countries: + description: + - The list of source countries that must be included or excluded from the rule based on the excludeSrcCountries field value. + - If no value is set, this field is ignored during policy evaluation and the rule is applied to all source countries. + - Provide a ISO3166 Alpha2 code. visit the following site for reference U(https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes) + type: list elements: str required: false + exclude_src_countries: + description: + - Indicates whether the countries specified in the sourceCountries field are included or excluded from the rule. + - A true value denotes that the specified source countries are excluded from the rule. + - A false value denotes that the rule is applied to the source countries if there is a match. + - Provide a ISO3166 Alpha2 code. visit the following site for reference U(https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes) + type: bool + required: false nw_services: description: - User-defined network services on which the rule is applied. - If not set, the rule is not restricted to a specific network service. type: list - elements: str + elements: int required: false nw_service_groups: description: - User-defined network service group on which the rule is applied. - If not set, the rule is not restricted to a specific network service group. type: list - elements: str + elements: int required: false nw_applications: description: - User-defined network service applications on which the rule is applied. - If not set, the rule is not restricted to a specific network service application. type: list - elements: str + elements: int required: false nw_application_groups: description: - User-defined network service application group on which the rule is applied. - If not set, the rule is not restricted to a specific network service application group. type: list - elements: str + elements: int required: false app_services: description: "Application services on which this rule is applied" type: list - elements: str + elements: int required: false app_service_groups: description: "Application service groups on which this rule is applied" type: list - elements: str + elements: int required: false labels: description: "Labels that are applicable to the rule." type: list + elements: int + required: false + dest_ipv6_groups: + description: + - Destination IPv6 address groups for which the rule is applicable. + - If not set, the rule is not restricted to a specific source IPv6 address group. + type: list + elements: int + required: false + src_ipv6_groups: + description: + - Source IPv6 address groups for which the rule is applicable. + - If not set, the rule is not restricted to a specific source IPv6 address group. + type: list + elements: int + required: false + device_groups: + description: + - Name-ID pairs of device groups for which the rule must be applied. + - This field is applicable for devices that are managed using Zscaler Client Connector. + - If no value is set, this field is ignored during the policy evaluation. + type: list + elements: int + required: false + devices: + description: + - Name-ID pairs of devices for which rule must be applied. + - Specifies devices that are managed using Zscaler Client Connector. + - If no value is set, this field is ignored during the policy evaluation. + type: list + elements: int + required: false + device_trust_levels: + description: + - List of device trust levels for which the rule must be applied. + - This field is applicable for devices that are managed using Zscaler Client Connector. + - The trust levels are assigned to the devices based on your posture configurations. + - If no value is set, this field is ignored during the policy evaluation. + type: list elements: str required: false + choices: + - ANY + - UNKNOWN_DEVICETRUSTLEVEL + - LOW_TRUST + - MEDIUM_TRUST + - HIGH_TRUST """ EXAMPLES = r""" @@ -544,7 +611,7 @@ def main(): required=False, ) argument_spec.update( - id=dict(type="str", required=False), + id=dict(type="int", required=False), name=dict(type="str", required=True), description=dict(type="str", required=False), enabled=dict(type="bool", required=False), @@ -580,7 +647,6 @@ def main(): action=dict( type="str", required=False, - default="ALLOW", choices=["ALLOW", "BLOCK_DROP", "BLOCK_RESET", "BLOCK_ICMP", "EVAL_NWAPP"], ), device_trust_levels=dict( @@ -588,6 +654,7 @@ def main(): elements="str", required=False, choices=[ + "ANY", "UNKNOWN_DEVICETRUSTLEVEL", "LOW_TRUST", "MEDIUM_TRUST", diff --git a/plugins/modules/zia_cloud_firewall_filtering_rule_facts.py b/plugins/modules/zia_cloud_firewall_filtering_rule_facts.py index cc23b91..0e1bdc3 100644 --- a/plugins/modules/zia_cloud_firewall_filtering_rule_facts.py +++ b/plugins/modules/zia_cloud_firewall_filtering_rule_facts.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -32,21 +33,23 @@ description: Retrieves rules in the Cloud Firewall module. author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider + - zscaler.ziacloud.fragments.documentation options: id: description: - Unique identifier for the Firewall Filtering policy rule. type: int + required: false name: description: - Name of the Firewall Filtering policy rule - required: true + required: false type: str """ diff --git a/plugins/modules/zia_cloud_firewall_ip_destination_groups.py b/plugins/modules/zia_cloud_firewall_ip_destination_groups.py index 81d76a0..ed0bee4 100644 --- a/plugins/modules/zia_cloud_firewall_ip_destination_groups.py +++ b/plugins/modules/zia_cloud_firewall_ip_destination_groups.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -33,13 +34,14 @@ - "This module allows you to create IP destination groups within the Zscaler Internet Access (ZIA) Cloud firewall." author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider - + - zscaler.ziacloud.fragments.documentation - zscaler.ziacloud.fragments.state + options: id: description: "Unique identifier for the destination IP group." @@ -51,11 +53,11 @@ type: str description: description: "Additional information about the destination IP group." - required: true + required: false type: str type: description: "Destination IP group type (i.e., the group can contain destination IP addresses or FQDNs)." - required: true + required: false type: str choices: - DSTN_IP @@ -69,24 +71,16 @@ required: false ip_categories: description: - - "Destination IP address URL categories." - - "You can identify destinations based on the URL category of the domain." - - "There are hundreds of categories available such as 'ANY', 'NONE', 'SOCIAL_ADULT', 'OTHER_BUSINESS_AND_ECONOMY', etc." - - "For a complete list of all available categories, please refer to the Zscaler URL Categories documentation at:" - - "U(https://help.zscaler.com/zia/firewall-policies#/ipDestinationGroups-get)" + - Destination IP address URL categories. + - You can identify destinations based on the URL category of the domain. + - There are hundreds of categories available such as ANY, NONE, SOCIAL_ADULT, OTHER_BUSINESS_AND_ECONOMY, etc. + - Visit for choices U(https://help.zscaler.com/zia/firewall-policies#/ipDestinationGroups-get). type: list elements: str required: false - choices: - - ANY - - SOCIAL_ADULT - - OTHER_BUSINESS_AND_ECONOMY - - CORPORATE_MARKETING - - PROFESSIONAL_SERVICES - - CLASSIFIEDS - - TRADING_BROKARAGE_INSURANCE countries: description: + - This option is available only when the attribute type is set to DSTN_OTHER - Destination IP address countries. - You can identify destinations based on the location of a server. - Supports 2-letter ISO3166 Alpha2 Country i.e BR, CA, US. @@ -94,6 +88,15 @@ type: list elements: str required: false + url_categories: + description: + - This option is available only when the attribute type is set to DSTN_OTHER + - To identify destinations based on the URL category of a domain, select the required URL categories. + - If no category is selected, the field remains set to Any, and the criteria will be ignored during policy evaluation. + - Only custom URL categories are supported + type: list + elements: str + required: false """ EXAMPLES = r""" diff --git a/plugins/modules/zia_cloud_firewall_ip_destination_groups_facts.py b/plugins/modules/zia_cloud_firewall_ip_destination_groups_facts.py index 6b3c37f..d3db34c 100644 --- a/plugins/modules/zia_cloud_firewall_ip_destination_groups_facts.py +++ b/plugins/modules/zia_cloud_firewall_ip_destination_groups_facts.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -33,11 +34,12 @@ - "Gets a list of all IP destination groups" author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider + - zscaler.ziacloud.fragments.documentation options: id: @@ -46,8 +48,17 @@ type: int name: description: "Destination IP group name" - required: true + required: false + type: str + exclude_type: + description: Filter based on the IP destination group's type. + required: false type: str + choices: + - DSTN_IP + - DSTN_FQDN + - DSTN_DOMAIN + - DSTN_OTHER """ EXAMPLES = r""" @@ -117,7 +128,16 @@ def main(): argument_spec.update( name=dict(type="str", required=False), id=dict(type="int", required=False), - exclude_type=dict(type="str", required=False), # Add the exclude_type parameter + exclude_type=dict( + type="str", + required=False, + choices=[ + "DSTN_IP", + "DSTN_FQDN", + "DSTN_DOMAIN", + "DSTN_OTHER", + ], + ), ) module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True) diff --git a/plugins/modules/zia_cloud_firewall_ip_source_groups.py b/plugins/modules/zia_cloud_firewall_ip_source_groups.py index e566e4b..fc5fbf2 100644 --- a/plugins/modules/zia_cloud_firewall_ip_source_groups.py +++ b/plugins/modules/zia_cloud_firewall_ip_source_groups.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -33,25 +34,26 @@ - "List of Cloud Firewall IP source groups" author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider - + - zscaler.ziacloud.fragments.documentation - zscaler.ziacloud.fragments.state + options: id: description: "A unique identifier of the source IP address group" required: false - type: str + type: int name: description: "The name of the source IP address group" required: true type: str description: description: "The description of the source IP address group" - required: true + required: false type: str ip_addresses: description: "Source IP addresses added to the group" diff --git a/plugins/modules/zia_cloud_firewall_ip_source_groups_facts.py b/plugins/modules/zia_cloud_firewall_ip_source_groups_facts.py index d4f4b29..4b0e21f 100644 --- a/plugins/modules/zia_cloud_firewall_ip_source_groups_facts.py +++ b/plugins/modules/zia_cloud_firewall_ip_source_groups_facts.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -33,19 +34,21 @@ - "List of Cloud Firewall IP source groups" author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider + - zscaler.ziacloud.fragments.documentation options: id: description: "A unique identifier of the source IP address group" type: int + required: false name: description: "The name of the source IP address group" - required: true + required: false type: str """ diff --git a/plugins/modules/zia_cloud_firewall_network_application_facts.py b/plugins/modules/zia_cloud_firewall_network_application_facts.py index 5b4030a..f79f1eb 100644 --- a/plugins/modules/zia_cloud_firewall_network_application_facts.py +++ b/plugins/modules/zia_cloud_firewall_network_application_facts.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -33,18 +34,19 @@ - "Gets a list of all network application groups." author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider + - zscaler.ziacloud.fragments.documentation options: - app_id: + id: description: - The unique identifier for the network application required: false - type: str + type: int name: description: - The search string used to match against a network application's description attribute." @@ -110,8 +112,9 @@ def core(module): def main(): argument_spec = ZIAClientHelper.zia_argument_spec() argument_spec.update( + id=dict(type="int", required=False), name=dict(type="str", required=False), - id=dict(type="str", required=False), + locale=dict(type="str", required=False), ) module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True) try: diff --git a/plugins/modules/zia_cloud_firewall_network_application_group.py b/plugins/modules/zia_cloud_firewall_network_application_group.py index d8ed74b..fddf0a9 100644 --- a/plugins/modules/zia_cloud_firewall_network_application_group.py +++ b/plugins/modules/zia_cloud_firewall_network_application_group.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -33,21 +34,27 @@ - "Creates a new custom network application group." author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider + - zscaler.ziacloud.fragments.documentation - zscaler.ziacloud.fragments.state + options: id: description: "A unique identifier of the network application groups" required: false - type: str + type: int name: description: "The name of the network application groups" required: true type: str + description: + description: "The description of the network application groups" + required: false + type: str network_applications: description: "List of applications in the network application group" type: list diff --git a/plugins/modules/zia_cloud_firewall_network_application_group_facts.py b/plugins/modules/zia_cloud_firewall_network_application_group_facts.py index e883d7d..0ae94be 100644 --- a/plugins/modules/zia_cloud_firewall_network_application_group_facts.py +++ b/plugins/modules/zia_cloud_firewall_network_application_group_facts.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -33,20 +34,21 @@ - "Gets a list of all network application groups." author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider + - zscaler.ziacloud.fragments.documentation options: id: description: "A unique identifier of the network application groups" required: false - type: str + type: int name: description: "The name of the network application groups" - required: true + required: false type: str """ diff --git a/plugins/modules/zia_cloud_firewall_network_services.py b/plugins/modules/zia_cloud_firewall_network_services.py index 87e8faf..7ef6147 100644 --- a/plugins/modules/zia_cloud_firewall_network_services.py +++ b/plugins/modules/zia_cloud_firewall_network_services.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -32,13 +33,14 @@ description: "Adds a new network service." author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider - + - zscaler.ziacloud.fragments.documentation - zscaler.ziacloud.fragments.state + options: id: description: "The unique identifier for the network service" @@ -61,23 +63,73 @@ - PREDEFINED - CUSTOM default: STANDARD - is_name_l10n_tag: - description: "" - required: false - default: false - type: bool tag: description: "The network service tag" required: false - type: str - choices: [ 'ICMP_ANY', 'UDP_ANY', 'TCP_ANY', 'OTHER_NETWORK_SERVICE', 'DNS', 'NETBIOS', - 'FTP', 'GNUTELLA', 'H_323', 'HTTP', 'HTTPS', 'IKE', 'IMAP', 'ILS', 'IKE_NAT', - 'IRC', 'LDAP', 'QUIC', 'TDS', 'NETMEETING', 'NFS', 'NTP', 'SIP', 'SNMP', 'SMB', - 'SMTP', 'SSH', 'SYSLOG', 'TELNET', 'TRACEROUTE', 'POP3', 'PPTP', 'RADIUS', 'REAL_MEDIA', - 'RTSP', 'VNC', 'WHOIS', 'KERBEROS_SEC', 'TACACS', 'SNMPTRAP', 'NMAP', 'RSYNC', 'L2TP', - 'HTTP_PROXY', 'PC_ANYWHERE', 'MSN', 'ECHO', 'AIM', 'IDENT', 'YMSG', 'SCCP', 'MGCP_UA', - 'MGCP_CA', 'VDO_LIVE', 'OPENVPN', 'TFTP', 'FTPS_IMPLICIT', 'ZSCALER_PROXY_NW_SERVICES', - 'GRE_PROTOCOL', 'ESP_PROTOCOL, DHCP' ] + type: list + elements: str + choices: + - ICMP_ANY + - UDP_ANY + - TCP_ANY + - OTHER_NETWORK_SERVICE + - DNS + - NETBIOS + - FTP + - GNUTELLA + - H_323 + - HTTP + - HTTPS + - IKE + - IMAP + - ILS + - IKE_NAT + - IRC + - LDAP + - QUIC + - TDS + - NETMEETING + - NFS + - NTP + - SIP + - SNMP + - SMB + - SMTP + - SSH + - SYSLOG + - TELNET + - TRACEROUTE + - POP3 + - PPTP + - RADIUS + - REAL_MEDIA + - RTSP + - VNC + - WHOIS + - KERBEROS_SEC + - TACACS + - SNMPTRAP + - NMAP + - RSYNC + - L2TP + - HTTP_PROXY + - PC_ANYWHERE + - MSN + - ECHO + - AIM + - IDENT + - YMSG + - SCCP + - MGCP_UA + - MGCP_CA + - VDO_LIVE + - OPENVPN + - TFTP + - FTPS_IMPLICIT + - ZSCALER_PROXY_NW_SERVICES + - GRE_PROTOCOL + - ESP_PROTOCOL + - DHCP src_tcp_ports: type: list elements: dict @@ -214,7 +266,6 @@ def core(module): "dest_tcp_ports", "src_udp_ports", "dest_udp_ports", - "is_name_l10n_tag", ] for param_name in params: network_service[param_name] = module.params.get(param_name, None) @@ -269,7 +320,6 @@ def core(module): src_udp_ports=existing_network_service.get("src_udp_ports", ""), dest_udp_ports=existing_network_service.get("dest_udp_ports", ""), description=existing_network_service.get("description", ""), - is_name_l10n_tag=existing_network_service.get("is_name_l10n_tag", ""), ).to_dict() module.exit_json(changed=True, data=existing_network_service) else: @@ -282,7 +332,6 @@ def core(module): src_udp_ports=network_service.get("src_udp_ports", ""), dest_udp_ports=network_service.get("dest_udp_ports", ""), description=network_service.get("description", ""), - is_name_l10n_tag=network_service.get("is_name_l10n_tag", ""), ).to_dict() module.exit_json(changed=False, data=network_service) elif state == "absent": @@ -302,7 +351,6 @@ def main(): id=dict(type="int", required=False), name=dict(type="str", required=True), description=dict(type="str", required=False), - is_name_l10n_tag=dict(type="bool", default=False, required=False), type=dict( type="str", required=False, @@ -345,6 +393,74 @@ def main(): ), required=False, ), + tag=dict( + type="list", + elements="str", + required=False, + choices=[ + "ICMP_ANY", + "UDP_ANY", + "TCP_ANY", + "OTHER_NETWORK_SERVICE", + "DNS", + "NETBIOS", + "FTP", + "GNUTELLA", + "H_323", + "HTTP", + "HTTPS", + "IKE", + "IMAP", + "ILS", + "IKE_NAT", + "IRC", + "LDAP", + "QUIC", + "TDS", + "NETMEETING", + "NFS", + "NTP", + "SIP", + "SNMP", + "SMB", + "SMTP", + "SSH", + "SYSLOG", + "TELNET", + "TRACEROUTE", + "POP3", + "PPTP", + "RADIUS", + "REAL_MEDIA", + "RTSP", + "VNC", + "WHOIS", + "KERBEROS_SEC", + "TACACS", + "SNMPTRAP", + "NMAP", + "RSYNC", + "L2TP", + "HTTP_PROXY", + "PC_ANYWHERE", + "MSN", + "ECHO", + "AIM", + "IDENT", + "YMSG", + "SCCP", + "MGCP_UA", + "MGCP_CA", + "VDO_LIVE", + "OPENVPN", + "TFTP", + "FTPS_IMPLICIT", + "ZSCALER_PROXY_NW_SERVICES", + "GRE_PROTOCOL", + "ESP_PROTOCOL", + "DHCP", + ], + ), state=dict(type="str", choices=["present", "absent"], default="present"), ) module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True) diff --git a/plugins/modules/zia_cloud_firewall_network_services_facts.py b/plugins/modules/zia_cloud_firewall_network_services_facts.py index 9114aa5..895ab65 100644 --- a/plugins/modules/zia_cloud_firewall_network_services_facts.py +++ b/plugins/modules/zia_cloud_firewall_network_services_facts.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -33,11 +34,12 @@ - "Gets a list of all network services." author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider + - zscaler.ziacloud.fragments.documentation options: id: @@ -46,7 +48,7 @@ type: int name: description: "The network services name" - required: true + required: false type: str """ diff --git a/plugins/modules/zia_cloud_firewall_network_services_groups.py b/plugins/modules/zia_cloud_firewall_network_services_groups.py index e963ec4..3cf9706 100644 --- a/plugins/modules/zia_cloud_firewall_network_services_groups.py +++ b/plugins/modules/zia_cloud_firewall_network_services_groups.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -33,27 +34,32 @@ - "Adds a new network service group." author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider - + - zscaler.ziacloud.fragments.documentation - zscaler.ziacloud.fragments.state + options: id: description: "A unique identifier of the network services groups" required: false - type: str + type: int name: description: "The name of the network services groups" required: true type: str + description: + description: "The description of the network services groups" + required: false + type: str service_ids: type: list elements: dict description: "List of network service IDs" - required: false + required: true """ EXAMPLES = r""" @@ -181,7 +187,7 @@ def main(): argument_spec = ZIAClientHelper.zia_argument_spec() id_name_spec = dict( type="list", - elements="str", + elements="dict", required=True, ) argument_spec.update( diff --git a/plugins/modules/zia_cloud_firewall_network_services_groups_facts.py b/plugins/modules/zia_cloud_firewall_network_services_groups_facts.py index 8942512..d95d5a1 100644 --- a/plugins/modules/zia_cloud_firewall_network_services_groups_facts.py +++ b/plugins/modules/zia_cloud_firewall_network_services_groups_facts.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -33,20 +34,21 @@ - "Gets a list of all network service groups." author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider + - zscaler.ziacloud.fragments.documentation options: id: description: "A unique identifier of the network services groups" required: false - type: str + type: int name: description: "The name of the network services groups" - required: true + required: false type: str """ diff --git a/plugins/modules/zia_cloud_firewall_time_windows_facts.py b/plugins/modules/zia_cloud_firewall_time_windows_facts.py index b1e5603..668a2ca 100644 --- a/plugins/modules/zia_cloud_firewall_time_windows_facts.py +++ b/plugins/modules/zia_cloud_firewall_time_windows_facts.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -32,11 +33,12 @@ description: "Gets a list of time intervals used for by the Firewall policy or the URL Filtering policy." author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider + - zscaler.ziacloud.fragments.documentation options: id: @@ -44,7 +46,7 @@ type: int name: description: "Name of the Time Interval" - required: true + required: false type: str """ diff --git a/plugins/modules/zia_dlp_dictionaries.py b/plugins/modules/zia_dlp_dictionaries.py index ad4c7b1..b735c36 100644 --- a/plugins/modules/zia_dlp_dictionaries.py +++ b/plugins/modules/zia_dlp_dictionaries.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -33,13 +34,14 @@ - "Create a new custom DLP dictionary." author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider - + - zscaler.ziacloud.fragments.documentation - zscaler.ziacloud.fragments.state + options: id: description: "Unique identifier for the DLP dictionary" @@ -151,36 +153,35 @@ description: - The EDM template's primary field. secondary_fields: - type: int + type: list + elements: int required: false description: - The EDM template's secondary fields. secondary_field_match_on: - type: str + type: list + elements: str required: false description: - The EDM secondary field to match on. choices: - - MATCHON_NONE, MATCHON_ANY_1, MATCHON_ANY_2, MATCHON_ANY_3, MATCHON_ANY_4 - - MATCHON_ANY_5, MATCHON_ANY_6, MATCHON_ANY_7, MATCHON_ANY_8, MATCHON_ANY_9 - - MATCHON_ANY_10, MATCHON_ANY_11, MATCHON_ANY_12, MATCHON_ANY_13, MATCHON_ANY_14 - - MATCHON_ANY_15, MATCHON_ALL - hierarchical_identifiers: - description: - - The list of identifiers selected within a DLP dictionary of hierarchical type. - - Each identifier represents a sub-dictionary that consists of specific patterns. - required: false - type: str - choices: - - CRED_AMAZON_MWS_TOKEN, CRED_GIT_TOKEN, CRED_GITHUB_TOKEN, CRED_GOOGLE_API, CRED_GOOGLE_OAUTH_TOKEN, - - CRED_GOOGLE_OAUTH_ID, CRED_JWT_TOKEN, CRED_PAYPAL_TOKEN, CRED_PICATIC_API_KEY, CRED_PRIVATE_KEY, - - CRED_SENDGRID_API_KEY, CRED_SLACK_TOKEN, CRED_SLACK_WEBHOOK, CRED_SQUARE_ACCESS_TOKEN, CRED_SQUARE_OAUTH_SECRET, - - CRED_STRIPE_API_KEY, EUPP_AT, EUPP_BE, EUPP_BG, EUPP_CZ, EUPP_DK, EUPP_EE, EUPP_FL, EUPP_FR, EUPP_DE, EUPP_GR, - - EUPP_HU, EUPP_IE, EUPP_IT, EUPP_LV, EUPP_LU, EUPP_NL, EUPP_PL, EUPP_PT, EUPP_RO, EUPP_SK, EUPP_SI, EUPP_ES, EUPP_SE, - - USDL_AL, USDL_AK, USDL_AZ, USDL_AR, USDL_CA, USDL_CO, USDL_CT, USDL_DE, USDL_DC, USDL_FL, USDL_GA, USDL_HI, USDL_ID, - - USDL_IL, USDL_IN, USDL_IA, USDL_KS, USDL_KY, USDL_LA, USDL_ME, USDL_MD, USDL_MA, USDL_MI, USDL_MN, USDL_MS, USDL_MO, - - USDL_MT, USDL_NE, USDL_NV, USDL_NH, USDL_NJ, USDL_NM, USDL_NY, USDL_NC, USDL_ND, USDL_OH, USDL_OK, USDL_OR, USDL_PA, - - USDL_RI, USDL_SC, USDL_SD, USDL_TN, USDL_TX, USDL_UT, USDL_VT, USDL_VA, USDL_WA, USDL_WV, USDL_WI, USDL_WY + - MATCHON_NONE + - MATCHON_ANY_1 + - MATCHON_ANY_2 + - MATCHON_ANY_3 + - MATCHON_ANY_4 + - MATCHON_ANY_5 + - MATCHON_ANY_6 + - MATCHON_ANY_7 + - MATCHON_ANY_8 + - MATCHON_ANY_9 + - MATCHON_ANY_10 + - MATCHON_ANY_11 + - MATCHON_ANY_12 + - MATCHON_ANY_13 + - MATCHON_ANY_14 + - MATCHON_ANY_15 + - MATCHON_ALL idm_profile_match_accuracy: type: list elements: dict @@ -189,7 +190,8 @@ required: false suboptions: adp_idm_profile: - type: int + type: list + elements: int required: false description: - The IDM template reference. @@ -312,7 +314,6 @@ def core(module): "exact_data_match_details", "idm_profile_match_accuracy", "ignore_exact_match_idm_dict", - "hierarchical_identifiers", "include_bin_numbers", "bin_numbers", "dict_template_id", @@ -383,7 +384,7 @@ def main(): argument_spec = ZIAClientHelper.zia_argument_spec() id_spec = dict( type="list", - elements="str", + elements="int", required=False, ) argument_spec.update( @@ -455,9 +456,10 @@ def main(): dictionary_edm_mapping_id=dict(type="int", required=False), schema_id=dict(type="int", required=False), primary_field=dict(type="int", required=False), - secondary_fields=dict(type="list", elements="str", required=False), + secondary_fields=dict(type="list", elements="int", required=False), secondary_field_match_on=dict( - type="str", + type="list", + elements="str", required=False, choices=[ "MATCHON_NONE", diff --git a/plugins/modules/zia_dlp_dictionaries_facts.py b/plugins/modules/zia_dlp_dictionaries_facts.py index 3b8749c..3fed8ab 100644 --- a/plugins/modules/zia_dlp_dictionaries_facts.py +++ b/plugins/modules/zia_dlp_dictionaries_facts.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -32,11 +33,12 @@ description: "Gets information on all custom and predefined DLP dictionaries." author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider + - zscaler.ziacloud.fragments.documentation options: id: @@ -44,7 +46,7 @@ type: int name: description: "Name of the DLP dictionary's name" - required: true + required: false type: str """ diff --git a/plugins/modules/zia_dlp_engine.py b/plugins/modules/zia_dlp_engine.py index c03a3b3..73d1848 100644 --- a/plugins/modules/zia_dlp_engine.py +++ b/plugins/modules/zia_dlp_engine.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -32,17 +33,18 @@ description: "Adds a new custom DLP engine." author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider - + - zscaler.ziacloud.fragments.documentation - zscaler.ziacloud.fragments.state + options: id: description: "The unique identifier for the DLP engine." - type: str + type: int name: description: - The DLP engine name as configured by the admin. @@ -51,7 +53,7 @@ type: str description: description: "The DLP engine description." - required: true + required: false type: str engine_expression: description: @@ -68,7 +70,7 @@ required: true custom_dlp_engine: description: "The DLP engine description." - required: true + required: false type: bool """ @@ -121,7 +123,6 @@ def core(module): "id", "name", "description", - "predefined_engine_name", "engine_expression", "custom_dlp_engine", ] @@ -168,9 +169,6 @@ def core(module): engine_id=existing_engine.get("id", ""), name=existing_engine.get("name", ""), description=existing_engine.get("description", ""), - predefined_engine_name=existing_engine.get( - "predefined_engine_name", "" - ), engine_expression=existing_engine.get("engine_expression", ""), custom_dlp_engine=existing_engine.get("custom_dlp_engine", ""), ) @@ -188,7 +186,6 @@ def core(module): dict( name=dlp_engine.get("name", ""), description=dlp_engine.get("description", ""), - predefined_engine_name=dlp_engine.get("predefined_engine_name", ""), engine_expression=dlp_engine.get("engine_expression", ""), custom_dlp_engine=dlp_engine.get("custom_dlp_engine", ""), ) @@ -213,8 +210,7 @@ def main(): id=dict(type="int", required=False), name=dict(type="str", required=True), description=dict(type="str", required=False), - predefined_engine_name=dict(type="str", required=False), - engine_expression=dict(type="str", required=False), + engine_expression=dict(type="str", required=True), custom_dlp_engine=dict(type="bool", required=False), state=dict(type="str", choices=["present", "absent"], default="present"), ) diff --git a/plugins/modules/zia_dlp_engine_facts.py b/plugins/modules/zia_dlp_engine_facts.py index f60550b..82ace49 100644 --- a/plugins/modules/zia_dlp_engine_facts.py +++ b/plugins/modules/zia_dlp_engine_facts.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -33,19 +34,21 @@ - "Get a list of DLP engines." author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider + - zscaler.ziacloud.fragments.documentation options: id: description: "The unique identifier for the DLP engine." type: int + required: false name: type: str - required: true + required: false description: - The DLP engine name as configured by the admin. """ diff --git a/plugins/modules/zia_dlp_icap_server_facts.py b/plugins/modules/zia_dlp_icap_server_facts.py index c1058ef..6949610 100644 --- a/plugins/modules/zia_dlp_icap_server_facts.py +++ b/plugins/modules/zia_dlp_icap_server_facts.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -33,16 +34,18 @@ - "Gets a the list of DLP servers using ICAP." author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider + - zscaler.ziacloud.fragments.documentation options: id: description: "The unique identifier for a DLP ICAP server." type: int + required: false name: type: str required: false diff --git a/plugins/modules/zia_dlp_idm_profile_facts.py b/plugins/modules/zia_dlp_idm_profile_facts.py index 18f62b6..d6755e0 100644 --- a/plugins/modules/zia_dlp_idm_profile_facts.py +++ b/plugins/modules/zia_dlp_idm_profile_facts.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -33,16 +34,18 @@ - "Get IDM template information for the specified ID or Name" author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider + - zscaler.ziacloud.fragments.documentation options: profile_id: description: "The identifier (1-64) for the IDM template (i.e., IDM profile) that is unique within the organization" type: int + required: false profile_name: type: str required: false diff --git a/plugins/modules/zia_dlp_incident_receiver_facts.py b/plugins/modules/zia_dlp_incident_receiver_facts.py index fd262ae..5bd39c7 100644 --- a/plugins/modules/zia_dlp_incident_receiver_facts.py +++ b/plugins/modules/zia_dlp_incident_receiver_facts.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -33,16 +34,18 @@ - "Gets a list of DLP Incident Receivers." author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider + - zscaler.ziacloud.fragments.documentation options: id: description: "The unique identifier for the Incident Receiver." type: int + required: false name: type: str required: false diff --git a/plugins/modules/zia_dlp_notification_template.py b/plugins/modules/zia_dlp_notification_template.py index 92dc221..d3b2d59 100644 --- a/plugins/modules/zia_dlp_notification_template.py +++ b/plugins/modules/zia_dlp_notification_template.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -33,14 +34,15 @@ - This module allows for the management of Zscaler Internet Access (ZIA) Data Loss Prevention (DLP) Notification Templates. - It supports the creation, updating, and deletion of DLP Notification Templates. - It allows for the customization of the subject line, message body (both plain text and HTML), and various other settings related to DLP notifications. -version_added: "1.0.0" +version_added: "0.1.0" author: William Guilherme (@willguibr) requirements: - Zscaler SDK Python (obtainable from PyPI U(https://pypi.org/project/zscaler-sdk-python/)) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider - + - zscaler.ziacloud.fragments.documentation - zscaler.ziacloud.fragments.state + options: id: description: @@ -55,22 +57,27 @@ description: - The subject line that is displayed within the DLP notification email. type: str + required: True attach_content: description: - If set to true, the content that triggered the violation is attached to the DLP notification email. type: bool + required: False plain_text_message: description: - The template for the plain text UTF-8 message body that is displayed in the DLP notification email. type: str + required: True html_message: description: - The template for the HTML message body that is displayed in the DLP notification email. type: str + required: True tls_enabled: description: - If set to true, enables TLS for the DLP notification template. type: bool + required: False """ EXAMPLES = r""" @@ -121,9 +128,7 @@ def normalize_dlp_template(template): """ normalized = template.copy() - computed_values = [ - "id", - ] + computed_values = [] for attr in computed_values: normalized.pop(attr, None) diff --git a/plugins/modules/zia_dlp_notification_template_facts.py b/plugins/modules/zia_dlp_notification_template_facts.py index 1856b4c..373caf7 100644 --- a/plugins/modules/zia_dlp_notification_template_facts.py +++ b/plugins/modules/zia_dlp_notification_template_facts.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -33,16 +34,18 @@ - "Get a list of DLP notification templates." author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider + - zscaler.ziacloud.fragments.documentation options: id: description: "The unique identifier for the DLP engine." type: int + required: false name: type: str required: false diff --git a/plugins/modules/zia_dlp_web_rules.py b/plugins/modules/zia_dlp_web_rules.py index 13ef29b..8fb3d3d 100644 --- a/plugins/modules/zia_dlp_web_rules.py +++ b/plugins/modules/zia_dlp_web_rules.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -32,13 +33,14 @@ description: "Adds a new DLP policy rule." author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider - + - zscaler.ziacloud.fragments.documentation - zscaler.ziacloud.fragments.state + options: id: description: "The unique identifier for the DLP policy rule." @@ -55,15 +57,30 @@ description: "The rule order of execution for the DLP policy rule with respect to other rules." required: true type: int + action: + description: "The action taken when traffic matches the DLP policy rule criteria." + required: false + type: str + choices: + - ANY + - BLOCK + - ALLOW + - ICAP_RESPONSE + enabled: + description: + - Enables or disables the DLP policy rule. + required: false + type: bool protocols: description: "The protocol criteria specified for the DLP policy rule" required: false - type: str + type: list + elements: str choices: - - "ANY_RULE" - - "FTP_RULE" - - "HTTPS_RULE" - - "HTTP_RULE" + - ANY_RULE + - FTP_RULE + - HTTPS_RULE + - HTTP_RULE rank: description: "The admin rank of the admin who created the DLP policy rule." required: false @@ -111,14 +128,16 @@ required: false include_domain_profiles: description: - - The list of domain profiles that must be added to the DLP rule criteria in order to apply the DLP rules only to domains that are part of the specified profiles. - - A maximum of 8 profiles can be selected. + - "The list of domain profiles that must be added to the DLP rule criteria in order to apply the DLP rules." + - "Only to domains that are part of the specified profiles." + - "A maximum of 8 profiles can be selected." type: list elements: int required: false exclude_domain_profiles: description: - - The list of domain profiles that must be added to the DLP rule criteria in order to apply the DLP rules to all domains excluding the domains that are part of the specified profiles. + - The list of domain profiles that must be added to the DLP rule criteria in order to apply the DLP rules. + - It applies to all domains excluding the domains that are part of the specified profiles. - A maximum of 8 profiles can be selected. type: list elements: int @@ -126,34 +145,17 @@ file_types: description: "The list of file types to which the DLP policy rule must be applied." required: false - type: str + type: list + elements: str cloud_applications: description: "The list of cloud applications to which the DLP policy rule must be applied." required: false - type: str + type: list + elements: str min_size: description: "The minimum file size (in KB) used for evaluation of the DLP policy rule.." - required: true - type: int - action: - description: "The action taken when traffic matches the DLP policy rule criteria." required: false - type: str - choices: - - "ANY" - - "NONE" - - "BLOCK" - - "ALLOW" - - "ICAP_RESPONSE" - enabled: - description: - - Enables or disables the DLP policy rule. - required: false - type: str - choices: - - DISABLED - - ENABLED - default: ENABLED + type: int time_windows: description: "The time windows to which the DLP policy rule must be applied." type: list @@ -179,7 +181,7 @@ required: false type: bool icap_server: - description: "The DLP server, using ICAP, to which the transaction content is forwarded." + description: The DLP server using ICAP to which the transaction content is forwarded. type: list elements: int required: false @@ -224,6 +226,16 @@ - RULE_SEVERITY_MEDIUM - RULE_SEVERITY_LOW - RULE_SEVERITY_INFO + user_risk_score_levels: + description: Indicates the user risk level selected for the DLP rule violation. + required: false + type: list + elements: str + choices: + - LOW + - MEDIUM + - HIGH + - CRITICAL sub_rules: description: - The list of exception rules added to a parent rule @@ -237,6 +249,18 @@ - The unique identifier of the parent rule under which an exception rule is added. required: false type: int + dlp_download_scan_enabled: + description: + - If this field is set to true, DLP scan is enabled for file downloads from cloud applications configured in the rule. + - If this field is set to false, DLP scan is disabled for downloads from the cloud applications. + required: false + type: bool + zcc_notifications_enabled: + description: + - If this field is set to true, Zscaler Client Connector notification is enabled for the block action triggered by the web DLP rule. + - If this field is set to false, Zscaler Client Connector notification is disabled. + required: false + type: bool """ EXAMPLES = r""" @@ -389,7 +413,7 @@ def core(module): # Ensure file_types is a list of strings if rule.get("file_types"): - rule["file_types"] = [file_types for file_types in rule["file_types"]] + rule["file_types"] = list(rule["file_types"]) rule_id = rule.get("id", None) rule_name = rule.get("name", None) @@ -636,11 +660,11 @@ def main(): required=False, ) argument_spec.update( - id=dict(type="str", required=False), + id=dict(type="int", required=False), name=dict(type="str", required=True), description=dict(type="str", required=False), enabled=dict(type="bool", required=False), - order=dict(type="int", required=False), + order=dict(type="int", required=True), rank=dict(type="int", required=False, default=7), locations=id_spec, location_groups=id_spec, @@ -658,8 +682,8 @@ def main(): workload_groups=id_spec, include_domain_profiles=id_spec, exclude_domain_profiles=id_spec, - protocols=dict(type="list", elements="str", required=False), - url_categories=dict(type="list", elements="str", required=False), + protocols=dict(type="list", elements="str", required=False, choices=["ANY_RULE", "FTP_RULE", "HTTPS_RULE", "HTTP_RULE"]), + url_categories=dict(type="list", elements="int", required=False), cloud_applications=dict(type="list", elements="str", required=False), sub_rules=dict(type="list", elements="str", required=False), external_auditor_email=dict(type="str", required=False), @@ -671,16 +695,11 @@ def main(): zscaler_incident_receiver=dict(type="bool", required=False), zcc_notifications_enabled=dict(type="bool", required=False), dlp_download_scan_enabled=dict(type="bool", required=False), - icap_server=dict( - type="dict", - options=dict(id=dict(type="int", required=True)), - required=False, - ), + icap_server=dict(type="list", elements="int", required=False), action=dict( type="str", required=False, - default="NONE", - choices=["ANY", "NONE", "BLOCK", "ALLOW", "ICAP_RESPONSE"], + choices=["ANY", "BLOCK", "ALLOW", "ICAP_RESPONSE"], ), user_risk_score_levels=dict( type="list", @@ -689,8 +708,7 @@ def main(): choices=["LOW", "MEDIUM", "HIGH", "CRITICAL"], ), severity=dict( - type="list", - elements="str", + type="str", required=False, choices=[ "RULE_SEVERITY_HIGH", @@ -703,90 +721,6 @@ def main(): type="list", elements="str", required=False, - choices=[ - "ALL_OUTBOUND", - "BITMAP", - "JPEG", - "PNG", - "TIFF", - "MSC", - "ASM", - "MATLAB_FILES", - "SAS", - "SCALA", - "BCP", - "TABLEAU_FILES", - "DELPHI", - "APPLE_DOCUMENTS", - "COMPILED_HTML_HELP", - "MS_RTF", - "MS_MDB", - "DMD", - "POWERSHELL", - "DAT", - "LOG_FILES", - "XAML", - "ACCDB", - "MAKE_FILES", - "JAVA_FILES", - "RUBY_FILES", - "MS_CPP_FILES", - "PERL_FILES", - "MS_EXCEL", - "BASH_SCRIPTS", - "MS_MSG", - "CHEMDRAW_FILES", - "PDF_DOCUMENT", - "F_FILES", - "APPX", - "INCLUDE_FILES", - "EML_FILES", - "SC", - "MS_WORD", - "QLIKVIEW_FILES", - "PYTHON", - "CP", - "RPY", - "FOR", - "INF", - "YAML_FILES", - "SHELL_SCRAP", - "VISUAL_BASIC_SCRIPT", - "BASIC_SOURCE_CODE", - "SCT", - "VISUAL_CPP_FILES", - "JAVASCRIPT", - "SCZIP", - "DSP", - "RES_FILES", - "AU3", - "MM", - "CSX", - "WINDOWS_META_FORMAT", - "OAB", - "TXT", - "CML", - "C_FILES", - "COBOL", - "RSP", - "TLI", - "VSDX", - "WINDOWS_SCRIPT_FILES", - "POSTSCRIPT", - "JAVA_APPLET", - "FORM_DATA_POST", - "TLH", - "MS_POWERPOINT", - "SQL", - "X1B", - "POD", - "GO_FILES", - "NATVIS", - "CSV", - "VISUAL_BASIC_FILES", - "BORLAND_CPP_FILES", - "IFC", - ], ), state=dict(type="str", choices=["present", "absent"], default="present"), ) diff --git a/plugins/modules/zia_dlp_web_rules_facts.py b/plugins/modules/zia_dlp_web_rules_facts.py index c7528be..6ff826a 100644 --- a/plugins/modules/zia_dlp_web_rules_facts.py +++ b/plugins/modules/zia_dlp_web_rules_facts.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -32,19 +33,21 @@ description: "Gets a list of DLP policy rules, excluding SaaS Security API DLP policy rules" author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider + - zscaler.ziacloud.fragments.documentation options: id: description: "Unique identifier for the DLP Web rule" type: int + required: false name: description: "Name of the DLP Web rule" - required: true + required: false type: str """ diff --git a/plugins/modules/zia_forwarding_control_policy.py b/plugins/modules/zia_forwarding_control_policy.py deleted file mode 100644 index 7d3ded8..0000000 --- a/plugins/modules/zia_forwarding_control_policy.py +++ /dev/null @@ -1,752 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Copyright (c) 2023 Zscaler Technology Alliances, - -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: - -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. - -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -from __future__ import absolute_import, division, print_function - -__metaclass__ = type - -DOCUMENTATION = r""" ---- -module: zia_forwarding_control_policy -short_description: "Forwarding Control policy rule." -description: "Adds a new Forwarding Control policy rule." -author: - - William Guilherme (@willguibr) -version_added: "1.0.0" -requirements: - - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) -extends_documentation_fragment: - - zscaler.ziacloud.fragments.provider - - - zscaler.ziacloud.fragments.state -options: - id: - description: "Unique identifier for the Forwarding Control policy rule" - required: false - type: int - name: - description: "Name of the Forwarding Control policy rule" - required: true - type: str - description: - description: "Indicates whether the forwarding rule is enabled or disabled" - required: false - type: str - order: - description: "Rule order number of the Forwarding Control policy rule" - required: true - type: int - rank: - description: "Admin rank of the Forwarding Control policy rule" - required: false - default: 7 - type: int - locations: - description: "The locations to which the Forwarding Control policy rule applies" - type: list - elements: str - required: false - location_groups: - description: "The location groups to which the Forwarding Control policy rule applies" - type: list - elements: str - required: false - ec_groups: - description: "Name-ID pairs of the Zscaler Cloud Connector groups to which the forwarding rule applies" - type: list - elements: str - required: false - departments: - description: "The departments to which the Forwarding Control policy rule applies" - type: list - elements: str - required: false - groups: - description: "The groups to which the Forwarding Control policy rule applies" - type: list - elements: str - required: false - users: - description: "The users to which the Forwarding Control policy rule applies" - type: list - elements: str - required: false - type: - description: "The rule type selected from the available options" - required: false - type: str - choices: - - FIREWALL - - DNS - - DNAT - - SNAT - - FORWARDING - - INTRUSION_PREVENTION - - EC_DNS - - EC_RDR - - EC_SELF - - DNS_RESPONSE - forward_method: - description: "The type of traffic forwarding method selected from the available options" - required: false - type: str - choices: - - INVALID - - DIRECT - - PROXYCHAIN - - ZIA - - ZPA - - ECZPA - - ECSELF - - DROP - enabled: - description: Determines whether the Forwarding Control policy rule is enabled or disabled - required: false - type: bool - choices: - - true - - false - src_ips: - description: - - User-defined source IP addresses for which the rule is applicable. - - If not set, the rule is not restricted to a specific source IP address. - type: list - elements: str - required: false - src_ip_groups: - description: - - User-defined source IP address groups for which the rule is applicable. - - If not set, the rule is not restricted to a specific source IP address group. - type: list - elements: str - required: false - src_ipv6_groups: - description: - - Source IPv6 address groups for which the rule is applicable. - - If not set, the rule is not restricted to a specific source IPv6 address group. - type: list - elements: str - required: false - dest_addresses: - description: - - List of destination IP addresses to which this rule will be applied. - - CIDR notation can be used for destination IP addresses. - type: list - elements: str - required: false - dest_ip_categories: - description: - - IP address categories of destination for which the DNAT rule is applicable. - - If not set, the rule is not restricted to specific destination IP categories. - type: list - elements: str - required: false - res_categories: - description: List of destination domain categories to which the rule applies - type: list - elements: str - required: false - dest_countries: - description: - - Destination countries for which the rule is applicable. - - If not set, the rule is not restricted to specific destination countries. - type: list - elements: str - required: false - dest_ip_groups: - description: - - User-defined destination IP address groups on which the rule is applied. - - If not set, the rule is not restricted to a specific destination IP address group. - type: list - elements: str - required: false - dest_ipv6_groups: - description: - - Destination IPv6 address groups for which the rule is applicable. - - If not set, the rule is not restricted to a specific source IPv6 address group. - type: list - elements: str - required: false - nw_services: - description: - - User-defined network services on which the rule is applied. - - If not set, the rule is not restricted to a specific network service. - type: list - elements: str - required: false - nw_service_groups: - description: - - User-defined network service group on which the rule is applied. - - If not set, the rule is not restricted to a specific network service group. - type: list - elements: str - required: false - nw_applications: - description: - - User-defined network service applications on which the rule is applied. - - If not set, the rule is not restricted to a specific network service application. - type: list - elements: str - required: false - nw_application_groups: - description: - - User-defined network service application group on which the rule is applied. - - If not set, the rule is not restricted to a specific network service application group. - type: list - elements: str - required: false - app_service_groups: - description: "Application service groups on which this rule is applied" - type: list - elements: str - required: false - labels: - description: "Labels that are applicable to the rule." - type: list - elements: str - required: false - devices: - description: - - Name-ID pairs of devices for which the rule must be applied. - - Specifies devices that are managed using Zscaler Client Connector. - - If no value is set, this field is ignored during the policy evaluation. - type: list - elements: str - required: false - device_groups: - description: - - Name-ID pairs of devices for which the rule must be applied. - - Specifies devices that are managed using Zscaler Client Connector. - - If no value is set, this field is ignored during the policy evaluation. - type: list - elements: str - required: false - proxy_gateway: - description: - - The proxy gateway for which the rule is applicable. - - This field is applicable only for the Proxy Chaining forwarding method. - type: list - elements: str - required: false - zpa_gateway: - description: - - The ZPA Server Group for which this rule is applicable. - - Only the Server Groups that are associated with the selected Application Segments are allowed. - - This field is applicable only for the ZPA forwarding method. - type: list - elements: str - required: false - zpa_app_segments: - description: - - The list of ZPA Application Segments for which this rule is applicable. - - This field is applicable only for the ZPA Gateway forwarding method. - type: list - elements: str - required: false - zpa_application_segments: - description: - - List of ZPA Application Segments for which this rule is applicable. - - This field is applicable only for the ECZPA forwarding method (used for Zscaler Cloud Connector). - type: list - elements: str - required: false - zpa_application_segment_groups: - description: - - List of ZPA Application Segment Groups for which this rule is applicable. - - This field is applicable only for the ECZPA forwarding method (used for Zscaler Cloud Connector). - type: list - elements: str - required: false -""" - -EXAMPLES = r""" -- name: Create/Update Forwarding Control ZPA Forward Method - zscaler.ziacloud.zia_forwarding_control_policy: - provider: '{{ provider }}' - name: 'Example' - description: 'TT#1965232865' - type: 'FORWARDING' - forward_method: 'DIRECT' - enabled: true - order: 1 - zpa_gateway: - - id: 2590247 - name: 'ZPA_GW01' -""" - -RETURN = r""" -# Returns information on the newly created cloud Forwarding Control rule. -""" - - -from traceback import format_exc - -from ansible.module_utils._text import to_native -from ansible.module_utils.basic import AnsibleModule -from ansible_collections.zscaler.ziacloud.plugins.module_utils.utils import ( - deleteNone, - validate_iso3166_alpha2, -) -from ansible_collections.zscaler.ziacloud.plugins.module_utils.zia_client import ( - ZIAClientHelper, -) - - -def normalize_rule(rule): - """ - Normalize rule data by setting computed values. - """ - normalized = rule.copy() - - computed_values = [] - for attr in computed_values: - normalized.pop(attr, None) - - return normalized - - -def validate_forwarding_rule_constraints(module): - forward_method = module.params.get("forward_method") - rule_type = module.params.get("type") - - def is_set(attr): - return module.params.get(attr) is not None - - if rule_type == "FORWARDING": - if forward_method == "ZPA": - required_attrs = ["zpa_app_segments", "zpa_gateway"] - missing_attrs = [attr for attr in required_attrs if not is_set(attr)] - if missing_attrs: - missing_attrs_str = ", ".join(missing_attrs) - module.fail_json( - msg=f"The {missing_attrs_str} are required for ZPA forwarding" - ) - - elif forward_method == "DIRECT": - prohibited_attrs = [ - "zpa_gateway", - "proxy_gateway", - "zpa_app_segments", - "zpa_application_segments", - "zpa_application_segment_groups", - ] - for attr in prohibited_attrs: - if is_set(attr): - module.fail_json( - msg=f"{attr} attribute cannot be set when type is 'FORWARDING' and forward_method is 'DIRECT'" - ) - - elif forward_method == "PROXYCHAIN": - if not is_set("proxy_gateway"): - module.fail_json( - msg="Proxy gateway is mandatory for Proxy Chaining forwarding" - ) - prohibited_attrs = [ - "zpa_gateway", - "zpa_app_segments", - "zpa_application_segments", - "zpa_application_segment_groups", - ] - for attr in prohibited_attrs: - if is_set(attr): - module.fail_json( - msg=f"{attr} attribute cannot be set when type is 'FORWARDING' and forward_method is 'PROXYCHAIN'" - ) - - return None # Return None to indicate no error - - -def core(module): - state = module.params.get("state", None) - client = ZIAClientHelper(module) - rule = dict() - params = [ - "id", - "name", - "description", - "enabled", - "order", - "rank", - "locations", - "location_groups", - "ec_groups", - "departments", - "groups", - "users", - "type", - "forward_method", - "device_groups", - "src_ips", - "src_ip_groups", - "src_ipv6_groups", - "dest_addresses", - "dest_ip_categories", - "dest_countries", - "res_categories", - "source_countries", - "dest_ip_groups", - "dest_ipv6_groups", - "nw_services", - "nw_service_groups", - "nw_applications", - "nw_application_groups", - "app_service_groups", - "labels", - "proxy_gateway", - "zpa_gateway", - "zpa_app_segments", - "zpa_application_segments", - "zpa_application_segment_groups", - ] - for param_name in params: - rule[param_name] = module.params.get(param_name, None) - - # Validate forwarding rule constraints - validation_error = validate_forwarding_rule_constraints(module) - if validation_error: - return validation_error # This will terminate the execution if there's a validation error - - # Perform validation and prepending 'COUNTRY_' for source_countries - source_countries = rule.get("source_countries") - if source_countries: - validated_source_countries = [] - for country_code in source_countries: - if validate_iso3166_alpha2(country_code): - validated_source_countries.append(f"COUNTRY_{country_code}") - else: - module.fail_json( - msg=( - f"The source country code '{country_code}' is not a valid ISO3166 Alpha2 code. " - "Please visit the following site for reference: " - "https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes" - ) - ) - rule["source_countries"] = validated_source_countries - - # Perform validation and prepending 'COUNTRY_' for dest_countries - dest_countries = rule.get("dest_countries") - if dest_countries: - validated_dest_countries = [] - for country_code in dest_countries: - if validate_iso3166_alpha2(country_code): - validated_dest_countries.append(f"COUNTRY_{country_code}") - else: - module.fail_json( - msg=( - f"The destination country code '{country_code}' is not a valid ISO3166 Alpha2 code. " - "Please visit the following site for reference: " - "https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes" - ) - ) - rule["dest_countries"] = validated_dest_countries - - rule_id = rule.get("id", None) - rule_name = rule.get("name", None) - - existing_rule = None - if rule_id is not None: - ruleBox = client.forwarding_control.get_rule(rule_id=rule_id) - if ruleBox is not None: - existing_rule = ruleBox.to_dict() - elif rule_name is not None: - rules = client.forwarding_control.list_rules().to_list() - for rule_ in rules: - if rule_.get("name") == rule_name: - existing_rule = rule_ - - # Normalize and compare existing and desired data - desired_rule = normalize_rule(rule) - current_rule = normalize_rule(existing_rule) if existing_rule else {} - - def preprocess_rules(rule, params): - """ - Preprocess specific attributes in the rule based on their type and structure. - :param rule: Dict containing the rule data. - :param params: List of attribute names to be processed. - :return: Preprocessed rule. - """ - for attr in params: - if attr in rule and rule[attr] is not None: - # Process list attributes - if isinstance(rule[attr], list): - # If list contains dictionaries with 'id', extract IDs - if all( - isinstance(item, dict) and "id" in item for item in rule[attr] - ): - rule[attr] = [item["id"] for item in rule[attr]] - else: - # Sort lists for consistent order - rule[attr] = sorted(rule[attr]) - # Add more conditions here if needed for other types - return rule - - existing_rule_preprocessed = preprocess_rules(current_rule, params) - desired_rule_preprocessed = preprocess_rules(desired_rule, params) - - # Then proceed with your comparison logic - differences_detected = False - for key in params: - desired_value = desired_rule_preprocessed.get(key) - current_value = existing_rule_preprocessed.get(key) - - # Handling for list attributes where None should be treated as an empty list - if isinstance(current_value, list) and desired_value is None: - desired_value = [] - - # Skip comparison for 'id' if it's not in the desired rule but present in the existing rule - if key == "id" and desired_value is None and current_value is not None: - continue - - # Convert 'state' in current_rule to boolean 'enabled' - if key == "enabled" and "state" in current_rule: - current_value = current_rule["state"] == "ENABLED" - - # Handling None values for all attributes - if desired_value is None and key != "enabled": - # Explicitly setting to empty list or empty value based on type - rule[key] = [] if isinstance(current_value, list) else None - - # Special handling for lists of IDs like device_groups - if isinstance(desired_value, list) and isinstance(current_value, list): - if all(isinstance(x, int) for x in desired_value) and all( - isinstance(x, int) for x in current_value - ): - desired_value = sorted(desired_value) - current_value = sorted(current_value) - - if current_value != desired_value: - differences_detected = True - module.warn( - f"Difference detected in {key}. Current: {current_value}, Desired: {desired_value}" - ) - - if existing_rule is not None: - id = existing_rule.get("id") - existing_rule.update(rule) - existing_rule["id"] = id - - module.warn(f"Final payload being sent to SDK: {rule}") - if state == "present": - if existing_rule is not None: - if differences_detected: - """Update""" - update_rule = deleteNone( - dict( - rule_id=existing_rule.get("id"), - name=existing_rule.get("name"), - order=existing_rule.get("order"), - rank=existing_rule.get("rank"), - type=existing_rule.get("type"), - forward_method=existing_rule.get("forward_method"), - enabled=existing_rule.get("enabled"), - description=existing_rule.get("description"), - src_ips=existing_rule.get("src_ips"), - dest_addresses=existing_rule.get("dest_addresses"), - dest_ip_categories=existing_rule.get("dest_ip_categories"), - dest_countries=existing_rule.get("dest_countries"), - res_categories=existing_rule.get("res_categories"), - source_countries=existing_rule.get("source_countries"), - device_groups=existing_rule.get("device_groups"), - nw_applications=existing_rule.get("nw_applications"), - dest_ip_groups=existing_rule.get("dest_ip_groups"), - nw_services=existing_rule.get("nw_services"), - nw_service_groups=existing_rule.get("nw_service_groups"), - nw_application_groups=existing_rule.get( - "nw_application_groups" - ), - app_service_groups=existing_rule.get("app_service_groups"), - labels=existing_rule.get("labels"), - locations=existing_rule.get("locations"), - location_groups=existing_rule.get("location_groups"), - ec_groups=existing_rule.get("ec_groups"), - departments=existing_rule.get("departments"), - groups=existing_rule.get("groups"), - users=existing_rule.get("users"), - src_ip_groups=existing_rule.get("src_ip_groups"), - proxy_gateway=existing_rule.get("proxy_gateway"), - zpa_gateway=existing_rule.get("zpa_gateway"), - zpa_app_segments=existing_rule.get("zpa_app_segments"), - zpa_application_segments=existing_rule.get( - "zpa_application_segments" - ), - zpa_application_segment_groups=existing_rule.get( - "zpa_application_segment_groups" - ), - ) - ) - module.warn("Payload Update for SDK: {}".format(update_rule)) - updated_rule = client.forwarding_control.update_rule( - **update_rule - ).to_dict() - module.exit_json(changed=True, data=updated_rule) - else: - module.warn("Creating new rule as no existing rule found") - """Create""" - create_rule = deleteNone( - dict( - name=rule.get("name"), - description=rule.get("description"), - order=rule.get("order"), - rank=rule.get("rank"), - type=rule.get("type"), - forward_method=rule.get("forward_method"), - enabled=rule.get("enabled"), - src_ips=rule.get("src_ips"), - dest_addresses=rule.get("dest_addresses"), - dest_ip_categories=rule.get("dest_ip_categories"), - dest_countries=rule.get("dest_countries"), - res_categories=rule.get("res_categories"), - source_countries=rule.get("source_countries"), - device_groups=rule.get("device_groups"), - nw_applications=rule.get("nw_applications"), - dest_ip_groups=rule.get("dest_ip_groups"), - dest_ipv6_groups=rule.get("dest_ipv6_groups"), - nw_services=rule.get("nw_services"), - nw_service_groups=rule.get("nw_service_groups"), - nw_application_groups=rule.get("nw_application_groups"), - app_service_groups=rule.get("app_service_groups"), - labels=rule.get("labels"), - locations=rule.get("locations"), - location_groups=rule.get("location_groups"), - ec_groups=rule.get("ec_groups"), - departments=rule.get("departments"), - groups=rule.get("groups"), - users=rule.get("users"), - src_ip_groups=rule.get("src_ip_groups"), - src_ipv6_groups=rule.get("src_ipv6_groups"), - proxy_gateway=rule.get("proxy_gateway"), - zpa_gateway=rule.get("zpa_gateway"), - zpa_app_segments=rule.get("zpa_app_segments"), - zpa_application_segments=rule.get("zpa_application_segments"), - zpa_application_segment_groups=rule.get( - "zpa_application_segment_groups" - ), - ) - ) - module.warn("Payload for SDK: {}".format(create_rule)) - new_rule = client.forwarding_control.add_rule(**create_rule).to_dict() - module.exit_json(changed=True, data=new_rule) - elif ( - state == "absent" - and existing_rule is not None - and existing_rule.get("id") is not None - ): - code = client.forwarding_control.delete_rule(rule_id=existing_rule.get("id")) - if code > 299: - module.exit_json(changed=False, data=None) - module.exit_json(changed=True, data=existing_rule) - module.exit_json(changed=False, data={}) - - -def main(): - argument_spec = ZIAClientHelper.zia_argument_spec() - id_spec = dict( - type="list", - elements="int", - required=False, - ) - # Define the spec for a dictionary with id and name - id_name_dict_spec = dict( - id=dict(type="int", required=True), - name=dict(type="str", required=True), - ) - external_id_name_dict_spec = dict( - external_id=dict(type="int", required=True), - name=dict(type="str", required=True), - ) - argument_spec.update( - id=dict(type="str", required=False), - name=dict(type="str", required=True), - description=dict(type="str", required=False), - enabled=dict(type="bool", required=False), - order=dict(type="int", required=True), - rank=dict(type="int", required=False, default=7), - src_ips=dict(type="list", elements="str", required=False), - dest_addresses=dict(type="list", elements="str", required=False), - dest_ip_categories=dict(type="list", elements="str", required=False), - dest_countries=dict(type="list", elements="str", required=False), - res_categories=dict(type="list", elements="str", required=False), - source_countries=dict(type="list", elements="str", required=False), - type=dict( - type="str", - required=False, - choices=[ - "FIREWALL", - "DNS", - "DNAT", - "SNAT", - "FORWARDING", - "INTRUSION_PREVENTION", - "EC_DNS", - "EC_RDR", - "EC_SELF", - "DNS_RESPONSE", - ], - ), - forward_method=dict( - type="str", - required=False, - choices=[ - "INVALID", - "DIRECT", - "PROXYCHAIN", - "ZIA", - "ZPA", - "ECZPA", - "ECSELF", - "DROP", - ], - ), - device_groups=id_spec, - nw_applications=id_spec, - dest_ip_groups=id_spec, - dest_ipv6_groups=id_spec, - nw_services=id_spec, - nw_service_groups=id_spec, - nw_application_groups=id_spec, - app_service_groups=id_spec, - labels=id_spec, - locations=id_spec, - location_groups=id_spec, - ec_groups=id_spec, - departments=id_spec, - groups=id_spec, - users=id_spec, - src_ip_groups=id_spec, - src_ipv6_groups=id_spec, - proxy_gateway=id_name_dict_spec, - zpa_gateway=id_name_dict_spec, - zpa_app_segments=external_id_name_dict_spec, - zpa_application_segments=external_id_name_dict_spec, - zpa_application_segment_groups=external_id_name_dict_spec, - state=dict(type="str", choices=["present", "absent"], default="present"), - ) - module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True) - try: - core(module) - except Exception as e: - module.fail_json(msg=to_native(e), exception=format_exc()) - - -if __name__ == "__main__": - main() diff --git a/plugins/modules/zia_forwarding_control_policy_facts.py b/plugins/modules/zia_forwarding_control_policy_facts.py index 431f387..6399ed1 100644 --- a/plugins/modules/zia_forwarding_control_policy_facts.py +++ b/plugins/modules/zia_forwarding_control_policy_facts.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -32,19 +33,21 @@ description: "Gets the list of forwarding rules configured in the ZIA Admin Portal." author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider + - zscaler.ziacloud.fragments.documentation options: id: description: "Unique identifier for the Forwarding Filtering policy rule" type: int + required: false name: description: "Name of the Forwarding Filtering policy rule" - required: true + required: false type: str """ diff --git a/plugins/modules/zia_ip_source_anchoring_zpa_gateway.py b/plugins/modules/zia_ip_source_anchoring_zpa_gateway.py index 58f724f..678b5d6 100644 --- a/plugins/modules/zia_ip_source_anchoring_zpa_gateway.py +++ b/plugins/modules/zia_ip_source_anchoring_zpa_gateway.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -34,13 +35,14 @@ - "It allows for the configuration of server groups and application segments for source IP anchoring." author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python (available on PyPI at https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider - + - zscaler.ziacloud.fragments.documentation - zscaler.ziacloud.fragments.state + options: id: description: "Unique identifier for the ZPA gateway." @@ -55,10 +57,13 @@ required: false type: str type: - description: "Type of ZPA gateway. Choose 'ZPA' for Zscaler Internet Access or 'ECZPA' for Zscaler Cloud Connector." + description: "Type of ZPA gateway. Choose ZPA for Zscaler Internet Access or ECZPA for Zscaler Cloud Connector." required: false type: str - choices: [ZPA, ECZPA] + default: ZPA + choices: + - ZPA + - ECZPA zpa_server_group: description: "Server group associated with the ZPA gateway for source IP anchoring." required: true diff --git a/plugins/modules/zia_ip_source_anchoring_zpa_gateway_facts.py b/plugins/modules/zia_ip_source_anchoring_zpa_gateway_facts.py index 066376b..24488b8 100644 --- a/plugins/modules/zia_ip_source_anchoring_zpa_gateway_facts.py +++ b/plugins/modules/zia_ip_source_anchoring_zpa_gateway_facts.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -33,16 +34,18 @@ - "Gets the list of Zscaler Private Access (ZPA) gateways." author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider + - zscaler.ziacloud.fragments.documentation options: id: description: "A unique identifier assigned to the ZPA gateway" type: int + required: false name: description: "The name of the ZPA gateway" required: false diff --git a/plugins/modules/zia_location_groups_facts.py b/plugins/modules/zia_location_groups_facts.py index d86bf52..9409bf0 100644 --- a/plugins/modules/zia_location_groups_facts.py +++ b/plugins/modules/zia_location_groups_facts.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -33,16 +34,18 @@ - "Gets locations only, not sub-locations." author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider + - zscaler.ziacloud.fragments.documentation options: id: description: "Unique identifier for the location group" type: int + required: false name: description: "Location group name" required: false diff --git a/plugins/modules/zia_location_management.py b/plugins/modules/zia_location_management.py index 4f17248..220c406 100644 --- a/plugins/modules/zia_location_management.py +++ b/plugins/modules/zia_location_management.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -33,12 +34,14 @@ - "Adds new locations and sub-locations." author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider + - zscaler.ziacloud.fragments.documentation - zscaler.ziacloud.fragments.state + options: id: description: "Location ID" @@ -88,39 +91,37 @@ description: "Enforce Authentication. Required when ports are enabled, IP Surrogate is enabled, or Kerberos Authentication is enabled." type: bool required: false - default: false ssl_scan_enabled: description: - "This parameter was deprecated and no longer has an effect on SSL policy." - "It remains supported in the API payload in order to maintain backwards compatibility with existing scripts, but it will be removed in future." - - Enable SSL Inspection. Set to true in order to apply your SSL Inspection policy to HTTPS traffic in the location and inspect HTTPS transactions for data leakage, malicious content, and viruses. + - "Enable SSL Inspection." + - "Set to true in order to apply your SSL Inspection policy to HTTPS traffic." - To Learn More, see Deploying SSL Inspection U(https://help.zscaler.com/zia/deploying-ssl-inspection) type: bool required: false - default: false zapp_ssl_scan_enabled: description: - "This parameter was deprecated and no longer has an effect on SSL policy." - "It remains supported in the API payload in order to maintain backwards compatibility with existing scripts, but it will be removed in future." - - "Enable Zscaler App SSL Setting. When set to true, the Zscaler App SSL Scan Setting takes effect, irrespective of the SSL policy that is configured for the location." + - "Enable Zscaler App SSL Setting." + - "When set to true, the Zscaler App SSL Scan Setting takes effect, irrespective of the SSL policy that is configured for the location." - To Learn More, see Deploying SSL Inspection U(https://help.zscaler.com/z-app/configuring-ssl-inspection-zscaler-app#configure-SSL-Zscaler-App) type: bool required: false - default: false xff_forward_enabled: description: - - "Enable XFF Forwarding for a location. When set to true, traffic is passed to Zscaler Cloud via the X-Forwarded-For (XFF) header." + - "Enable XFF Forwarding for a location." + - "When set to true, traffic is passed to Zscaler Cloud via the X-Forwarded-For (XFF) header." - "Note: For sublocations, this attribute is a read-only field as the value is inherited from the parent location." type: bool required: false - default: false surrogate_ip: description: - "Enable Surrogate IP. When set to true, users are mapped to internal device IP addresses." - "To Learn More, see Deploying SSL Inspection U(https://help.zscaler.com/zia/about-surrogate-ip)" type: bool required: false - default: false idle_time_in_minutes: description: "Idle Time to Disassociation. The user mapping idle time (in minutes) is required if a Surrogate IP is enabled." type: int @@ -129,13 +130,16 @@ description: "Display Time Unit. The time unit to display for IP Surrogate idle time to disassociation." type: str required: false + choices: + - MINUTE + - HOUR + - DAY surrogate_ip_enforced_for_known_browsers: description: - "Enforce Surrogate IP for Known Browsers. When set to true, IP Surrogate is enforced for all known browsers." - "To Learn More, see Deploying SSL Inspection U(https://help.zscaler.com/zia/about-surrogate-ip)" type: bool required: false - default: false surrogate_refresh_time_in_minutes: description: - "Refresh Time for re-validation of Surrogacy." @@ -149,47 +153,41 @@ type: str required: false choices: - - 'MINUTE' - - 'HOUR' - - 'DAY' + - MINUTE + - HOUR + - DAY ofw_enabled: description: "Enable Firewall. When set to true, Firewall is enabled for the location." type: bool required: false - default: false ips_control: description: "Enable IPS Control. When set to true, IPS Control is enabled for the location if Firewall is enabled." type: bool required: false - default: false aup_enabled: description: - "Enable AUP. When set to true, AUP is enabled for the location." - "To Learn More, see Deploying SSL Inspection U(https://help.zscaler.com/zia/about-end-user-notifications)" type: bool required: false - default: false caution_enabled: description: - "Enable Caution. When set to true, a caution notifcation is enabled for the location." - "To Learn More, see Deploying SSL Inspection U(https://help.zscaler.com/zia/configuring-caution-notification#caution-interval)" type: bool required: false - default: false aup_block_internet_until_accepted: description: - "For First Time AUP Behavior, Block Internet Access." - "When set, all internet access (including non-HTTP traffic) is disabled until the user accepts the AUP." type: bool required: false - default: false aup_force_ssl_inspection: description: - "For First Time AUP Behavior, Force SSL Inspection." - "When set, Zscaler forces SSL Inspection in order to enforce AUP for HTTPS traffic." type: bool required: false - default: false aup_timeout_in_days: description: "Custom AUP Frequency. Refresh time (in days) to re-validate the AUP." type: int @@ -245,15 +243,15 @@ """ EXAMPLES = """ -- name: Create/Update/Delete Location. - zscaler.ziacloud.zia_location_management: +- name: Create UFQDN VPN Credential. + zscaler.ziacloud.zia_traffic_forwarding_vpn_credentials: type: "UFQDN" fqdn: "usa_sjc37@acme.com" comments: "Created via Ansible" - pre_shared_key: "newPassword123!" + pre_shared_key: "************!" register: vpn_credential_ufqdn -- name: Gather Information Details of a ZIA User Role +- name: Create Location Management with UFQDN VPN Type zscaler.ziacloud.zia_location_management: name: "USA_SJC_37" description: "Created with Ansible" @@ -266,20 +264,31 @@ xff_forward_enabled: true ofw_enabled: true ips_control: true - ip_addresses: "1.1.1.1" vpn_credentials: - id: "{{ vpn_credential_ufqdn.data.id }}" type: "{{ vpn_credential_ufqdn.data.type }}" +# Create Location Management with VPN IP Type +- name: Create/Update/Delete a Static IP. + zscaler.ziacloud.zia_traffic_forwarding_static_ip: + provider: '{{ provider }}' + ip_address: "1.1.1.1" + routable_ip: true + comment: "Created with Ansible" + geo_override: true + latitude: "-36.848461" + longitude: "174.763336" + register: static_ip + - name: Create/Update/Delete VPN Credentials Type IP. zscaler.ziacloud.zia_location_management: type: "IP" - ip_address: "1.1.1.1" + ip_address: "static_ip.data.ip_address" comments: "Created via Ansible" - pre_shared_key: "newPassword123!" + pre_shared_key: "*************" register: vpn_credential_ip -- name: Gather Information Details of a ZIA User Role +- name: Create Location Management with IP VPN Type zscaler.ziacloud.zia_location_management: name: "USA_SJC_37" description: "Created with Ansible" @@ -292,7 +301,7 @@ xff_forward_enabled: true ofw_enabled: true ips_control: true - ip_addresses: "1.1.1.1" + ip_addresses: "static_ip.data.ip_address" vpn_credentials: - id: "{{ vpn_credential_ip.data.id }}" type: "{{ vpn_credential_ip.data.type }}" @@ -348,7 +357,6 @@ def normalize_vpn_credentials(vpn_creds): "type": cred.get("type"), "fqdn": cred.get("fqdn"), "ip_address": cred.get("ip_address"), - "pre_shared_key": cred.get("pre_shared_key"), } normalized_creds.append(normalized_cred) return normalized_creds @@ -358,6 +366,8 @@ def core(module): client = ZIAClientHelper(module) state = module.params.get("state", None) location_mgmt = dict() + + # Processing and adding VPN credentials to location_mgmt as before params = [ "id", "name", @@ -368,7 +378,6 @@ def core(module): "tz", "ip_addresses", "ports", - "vpn_credentials", "auth_required", "ssl_scan_enabled", "zapp_ssl_scan_enabled", @@ -392,6 +401,10 @@ def core(module): for param_name in params: location_mgmt[param_name] = module.params.get(param_name, None) + location_mgmt["vpn_credentials"] = normalize_vpn_credentials( + module.params.get("vpn_credentials", []) + ) + validate_location_mgmt(location_mgmt) # Set default values for attributes that have system defaults @@ -409,13 +422,11 @@ def core(module): existing_location_mgmt = None if location_id is not None: - locationBox = client.locations.get_location(location_id=location_id) - if locationBox is not None: - existing_location_mgmt = locationBox.to_dict() + existing_location_mgmt = client.locations.get_location(location_id=location_id) elif location_name is not None: - locationBox = client.locations.get_location(location_name=location_name) - if locationBox is not None: - existing_location_mgmt = locationBox.to_dict() + existing_location_mgmt = client.locations.get_location( + location_name=location_name + ) # Normalize and compare existing and desired data desired_location = normalize_location(location_mgmt) @@ -423,14 +434,11 @@ def core(module): normalize_location(existing_location_mgmt) if existing_location_mgmt else {} ) - # Adjusted Comparison Logic differences_detected = False for key, desired_value in desired_location.items(): current_value = current_location.get(key) - # Special handling for lists/dictionaries if key == "vpn_credentials": - # Normalize vpn_credentials for comparison normalized_current_creds = normalize_vpn_credentials(current_value) normalized_desired_creds = normalize_vpn_credentials(desired_value) @@ -439,13 +447,7 @@ def core(module): module.warn( f"Difference detected in {key}. Current: {normalized_current_creds}, Desired: {normalized_desired_creds}" ) - - # Special handling for specific attributes - if key in ["aup_enabled", "aup_timeout_in_days", "profile"]: - # Your comparison logic for these attributes - pass elif desired_value is None: - # Skip updating this attribute if it's None (not specified) continue elif desired_value != current_value: differences_detected = True @@ -453,139 +455,43 @@ def core(module): f"Difference detected in {key}. Current: {current_value}, Desired: {desired_value}" ) - if existing_location_mgmt is not None: - id = existing_location_mgmt.get("id") - existing_location_mgmt.update(desired_location) - existing_location_mgmt["id"] = id - - module.warn(f"Final payload being sent to SDK: {location_mgmt}") if state == "present": - if existing_location_mgmt is not None: - if differences_detected: - """Update""" - update_location = deleteNone( - dict( - location_id=existing_location_mgmt.get("id"), - name=existing_location_mgmt.get("name"), - parent_id=existing_location_mgmt.get("parent_id"), - up_bandwidth=existing_location_mgmt.get("up_bandwidth"), - dn_bandwidth=existing_location_mgmt.get("dn_bandwidth"), - country=existing_location_mgmt.get("country"), - tz=existing_location_mgmt.get("tz"), - ip_addresses=existing_location_mgmt.get("ip_addresses"), - ports=existing_location_mgmt.get("ports"), - vpn_credentials=existing_location_mgmt.get("vpn_credentials"), - auth_required=existing_location_mgmt.get("auth_required"), - ssl_scan_enabled=existing_location_mgmt.get("ssl_scan_enabled"), - zapp_ssl_scan_enabled=existing_location_mgmt.get( - "zapp_ssl_scan_enabled" - ), - xff_forward_enabled=existing_location_mgmt.get( - "xff_forward_enabled" - ), - surrogate_ip=existing_location_mgmt.get("surrogate_ip"), - idle_time_in_minutes=existing_location_mgmt.get( - "idle_time_in_minutes" - ), - display_time_unit=existing_location_mgmt.get( - "display_time_unit" - ), - surrogate_ip_enforced_for_known_browsers=existing_location_mgmt.get( - "surrogate_ip_enforced_for_known_browsers" - ), - surrogate_refresh_time_in_minutes=existing_location_mgmt.get( - "surrogate_refresh_time_in_minutes" - ), - surrogate_refresh_time_unit=existing_location_mgmt.get( - "surrogate_refresh_time_unit" - ), - ofw_enabled=existing_location_mgmt.get("ofw_enabled"), - ips_control=existing_location_mgmt.get("ips_control"), - aup_enabled=existing_location_mgmt.get("aup_enabled"), - caution_enabled=existing_location_mgmt.get("caution_enabled"), - aup_block_internet_until_accepted=existing_location_mgmt.get( - "aup_block_internet_until_accepted" - ), - aup_force_ssl_inspection=existing_location_mgmt.get( - "aup_force_ssl_inspection" - ), - aup_timeout_in_days=existing_location_mgmt.get( - "aup_timeout_in_days" - ), - managed_by=existing_location_mgmt.get("managed_by"), - profile=existing_location_mgmt.get("profile"), - description=existing_location_mgmt.get("description"), - iot_discovery_enabled=existing_location_mgmt.get( - "iot_discovery_enabled" - ), - ) - ) + if existing_location_mgmt: + location_id = existing_location_mgmt.get( + "id" + ) # Ensure we have the location ID + if location_id and differences_detected: + # Include location_id in the update call + update_location = deleteNone(desired_location) module.warn("Payload Update for SDK: {}".format(update_location)) - updated_location = client.locations.update_location( - **update_location - ).to_dict() - module.exit_json(changed=True, data=updated_location) + try: + updated_location = client.locations.update_location( + location_id, **update_location + ).to_dict() + module.exit_json(changed=True, data=updated_location) + except Exception as e: + module.fail_json(msg="Failed to update location: {}".format(str(e))) + else: + module.warn("Creating new location as no existing location found") + create_location = deleteNone(desired_location) + module.warn("Payload for SDK: {}".format(create_location)) + new_location = client.locations.add_location(**create_location) + module.exit_json(changed=True, data=new_location) + else: module.warn("Creating new location as no existing location found") - """Create""" - create_location = deleteNone( - dict( - name=location_mgmt.get("name"), - parent_id=location_mgmt.get("parent_id"), - up_bandwidth=location_mgmt.get("up_bandwidth"), - dn_bandwidth=location_mgmt.get("dn_bandwidth"), - country=location_mgmt.get("country"), - tz=location_mgmt.get("tz"), - ip_addresses=location_mgmt.get("ip_addresses"), - ports=location_mgmt.get("ports"), - vpn_credentials=location_mgmt.get("vpn_credentials"), - auth_required=location_mgmt.get("auth_required"), - ssl_scan_enabled=location_mgmt.get("ssl_scan_enabled"), - zapp_ssl_scan_enabled=location_mgmt.get("zapp_ssl_scan_enabled"), - xff_forward_enabled=location_mgmt.get("xff_forward_enabled"), - surrogate_ip=location_mgmt.get("surrogate_ip"), - idle_time_in_minutes=location_mgmt.get("idle_time_in_minutes"), - display_time_unit=location_mgmt.get("display_time_unit"), - surrogate_ip_enforced_for_known_browsers=location_mgmt.get( - "surrogate_ip_enforced_for_known_browsers" - ), - surrogate_refresh_time_in_minutes=location_mgmt.get( - "surrogate_refresh_time_in_minutes" - ), - surrogate_refresh_time_unit=location_mgmt.get( - "surrogate_refresh_time_unit" - ), - ofw_enabled=location_mgmt.get("ofw_enabled"), - ips_control=location_mgmt.get("ips_control"), - aup_enabled=location_mgmt.get("aup_enabled"), - caution_enabled=location_mgmt.get("caution_enabled"), - aup_block_internet_until_accepted=location_mgmt.get( - "aup_block_internet_until_accepted" - ), - aup_force_ssl_inspection=location_mgmt.get( - "aup_force_ssl_inspection" - ), - aup_timeout_in_days=location_mgmt.get("aup_timeout_in_days"), - profile=location_mgmt.get("profile"), - description=location_mgmt.get("description"), - iot_discovery_enabled=location_mgmt.get("iot_discovery_enabled"), - ) - ) + create_location = deleteNone(desired_location) module.warn("Payload for SDK: {}".format(create_location)) new_location = client.locations.add_location(**create_location) module.exit_json(changed=True, data=new_location) - elif ( - state == "absent" - and existing_location_mgmt is not None - and existing_location_mgmt.get("id") is not None - ): - code = client.locations.delete_location( - location_id=existing_location_mgmt.get("id") - ) - if code > 299: - module.exit_json(changed=False, data=None) - module.exit_json(changed=True, data=existing_location_mgmt) - module.exit_json(changed=False, data={}) + elif state == "absent" and existing_location_mgmt: + try: + client.locations.delete_location(location_id=existing_location_mgmt["id"]) + module.exit_json(changed=True, message="Location deleted successfully.") + except Exception as e: + module.fail_json(msg="Failed to delete location: {}".format(str(e))) + else: + module.exit_json(changed=False, message="No applicable changes to apply.") def main(): @@ -640,7 +546,6 @@ def main(): type=dict(type="str", default="UFQDN", choices=["UFQDN", "IP"]), fqdn=dict(type="str", required=False), ip_address=dict(type="str", required=False), - pre_shared_key=dict(type="str", required=False), ), required=False, ), diff --git a/plugins/modules/zia_location_management_facts.py b/plugins/modules/zia_location_management_facts.py index 0c93010..e67107e 100644 --- a/plugins/modules/zia_location_management_facts.py +++ b/plugins/modules/zia_location_management_facts.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -33,16 +34,18 @@ - "Gets locations only, not sub-locations." author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider + - zscaler.ziacloud.fragments.documentation options: id: description: "The unique identifier for the location" type: int + required: false name: description: "The location name" required: false diff --git a/plugins/modules/zia_rule_labels.py b/plugins/modules/zia_rule_labels.py index 14b2448..af7ad2a 100644 --- a/plugins/modules/zia_rule_labels.py +++ b/plugins/modules/zia_rule_labels.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -33,12 +34,14 @@ - "Adds a rule label." author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider + - zscaler.ziacloud.fragments.documentation - zscaler.ziacloud.fragments.state + options: id: description: "The unique identifier for the rule label." diff --git a/plugins/modules/zia_rule_labels_facts.py b/plugins/modules/zia_rule_labels_facts.py index 8825dfe..8434c3b 100644 --- a/plugins/modules/zia_rule_labels_facts.py +++ b/plugins/modules/zia_rule_labels_facts.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -33,19 +34,21 @@ - "Gets a list of rule labels" author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider + - zscaler.ziacloud.fragments.documentation options: id: description: "The unique identifier for the rule label." type: int + required: false name: description: "The rule label name." - required: true + required: false type: str """ diff --git a/plugins/modules/zia_sandbox_advanced_settings.py b/plugins/modules/zia_sandbox_advanced_settings.py index 3089923..cc8ce20 100644 --- a/plugins/modules/zia_sandbox_advanced_settings.py +++ b/plugins/modules/zia_sandbox_advanced_settings.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -34,12 +35,14 @@ - It allows adding or removing hashes from the blocklist and ensures idempotency. author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python (obtainable from PyPI U(https://pypi.org/project/zscaler-sdk-python/)) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider + - zscaler.ziacloud.fragments.documentation - zscaler.ziacloud.fragments.state + options: file_hashes_to_be_blocked: description: @@ -132,14 +135,9 @@ def core(module): for hash_string in file_hashes_to_be_blocked: is_valid, hash_type = hash_type_and_validate(hash_string) if not is_valid: - if hash_type in ["SHA1", "SHA256"]: - module.fail_json( - msg=f"Error: {hash_type} hashes are not supported. Please provide a valid MD5 hash." - ) - else: - module.fail_json( - msg=f"Error: The provided string '{hash_string}' is not a valid MD5 hash." - ) + module.fail_json( + msg=f"Error: The provided string '{hash_string}' is not a valid {hash_type} hash. Only MD5 hashes are supported." + ) client = ZIAClientHelper(module) sandbox_api = client.sandbox @@ -148,28 +146,27 @@ def core(module): current_hashes = sandbox_api.get_behavioral_analysis().file_hashes_to_be_blocked # Determine if a change is needed - change_needed = False + desired_hashes_set = set(file_hashes_to_be_blocked) + current_hashes_set = set(current_hashes) if state == "present": - # Compare current hashes with desired hashes for additions - change_needed = set(file_hashes_to_be_blocked) != set(current_hashes) - elif state == "absent": - # Check if the list is already empty - change_needed = bool(current_hashes) + change_needed = desired_hashes_set != current_hashes_set + else: # state == "absent" + change_needed = bool( + current_hashes_set + ) # change is needed if there are any hashes currently blocked # Perform update only if change is needed if change_needed: if state == "present": - # Call the method to add MD5 hashes to the custom list sandbox_api.add_hash_to_custom_list(file_hashes_to_be_blocked) - elif state == "absent": - # Call the method to empty the custom list of hashes - sandbox_api.erase_hash_to_custom_list() + else: # Clear the list by passing an empty list + sandbox_api.add_hash_to_custom_list([]) - # After updating, get the file hash count + # Fetch the updated hash count after the operation file_hash_count_data = sandbox_api.get_file_hash_count().to_dict() module.exit_json( changed=True, - msg="MD5 hash list updated.", + msg="MD5 hash list has been updated.", file_hash_count=file_hash_count_data, ) else: diff --git a/plugins/modules/zia_sandbox_advanced_settings_facts.py b/plugins/modules/zia_sandbox_advanced_settings_facts.py index c44e1f5..194ddc9 100644 --- a/plugins/modules/zia_sandbox_advanced_settings_facts.py +++ b/plugins/modules/zia_sandbox_advanced_settings_facts.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -33,11 +34,13 @@ - Gets the custom list of MD5 file hashes that are blocked by Sandbox. author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider + - zscaler.ziacloud.fragments.documentation + """ EXAMPLES = r""" diff --git a/plugins/modules/zia_sandbox_submission.py b/plugins/modules/zia_sandbox_submission.py index a2ff958..66b36aa 100644 --- a/plugins/modules/zia_sandbox_submission.py +++ b/plugins/modules/zia_sandbox_submission.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -27,19 +28,19 @@ DOCUMENTATION = r""" --- -module: zia_sandbox_submit +module: zia_sandbox_submission short_description: "Submits a file to the ZIA Advanced Cloud Sandbox for analysis." description: - Submits a file to the ZIA Advanced Cloud Sandbox for analysis. author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider + - zscaler.ziacloud.fragments.documentation - - zscaler.ziacloud.fragments.state options: file_path: description: "Path to the file that will be submitted for sandbox analysis." @@ -48,15 +49,32 @@ force: description: "Force ZIA to analyse the file even if it has been submitted previously." type: bool - default: false + inspection_mode: + description: + - Sandbox option submits raw or archive files e.g., ZIP to Sandbox for analysis. + - You can submit up to 100 files per day and it supports all file types that are currently supported by Sandbox. + - Out Of Band option Submits raw or archive files e.g., ZIP to the Zscaler service for out-of-band file inspection. + - Generate real-time verdicts for known and unknown files. + type: str + default: sandbox + choices: + - sandbox + - out_of_band """ EXAMPLES = r""" - name: Submit a file for analysis. - zscaler.ziacloud.zia_sandbox_submit: + zscaler.ziacloud.zia_sandbox_submission: provider: '{{ provider }}' file_path: "/path/to/malware.exe" force: True + inspection_mode: sandbox + +- name: Submit a file for analysis. + zscaler.ziacloud.zia_sandbox_submission: + provider: '{{ provider }}' + file_path: "/path/to/malware.exe" + inspection_mode: out_of_band """ RETURN = r""" @@ -97,7 +115,7 @@ def main(): argument_spec = ZIAClientHelper.zia_argument_spec() argument_spec.update( file_path=dict(type="str", required=True), - force=dict(type="bool", default=False), + force=dict(type="bool", required=False), inspection_mode=dict( type="str", choices=["sandbox", "out_of_band"], default="sandbox" ), diff --git a/plugins/modules/zia_security_policy_settings.py b/plugins/modules/zia_security_policy_settings.py index f1f74b1..f1a4bfa 100644 --- a/plugins/modules/zia_security_policy_settings.py +++ b/plugins/modules/zia_security_policy_settings.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -33,28 +34,30 @@ - Adds a URL to or removes a URL from the Denylist. author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider - + - zscaler.ziacloud.fragments.documentation - zscaler.ziacloud.fragments.state + options: urls: description: - URLs on the denylist for your organization. Allow up to 25000 URLs. type: list elements: str - required: false + required: true url_type: description: - The type of URL to be whitelisted or blacklisted. required: false type: str + default: whitelist choices: - - "whitelist" - - "blacklist" + - whitelist + - blacklist """ EXAMPLES = r""" diff --git a/plugins/modules/zia_traffic_forwarding_gre_internal_ranges_facts.py b/plugins/modules/zia_traffic_forwarding_gre_internal_ranges_facts.py index 48021fb..67a69bf 100644 --- a/plugins/modules/zia_traffic_forwarding_gre_internal_ranges_facts.py +++ b/plugins/modules/zia_traffic_forwarding_gre_internal_ranges_facts.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -32,20 +33,21 @@ description: "Gets the next available GRE tunnel internal IP address ranges" author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider + - zscaler.ziacloud.fragments.documentation options: start_ip_address: description: Starting IP address in the range - required: true + required: false type: str end_ip_address: description: Ending IP address in the range - required: true + required: false type: str internal_ip_range: description: Internal IP range information diff --git a/plugins/modules/zia_traffic_forwarding_gre_tunnel_facts.py b/plugins/modules/zia_traffic_forwarding_gre_tunnel_facts.py index 98743b3..d4ec6dd 100644 --- a/plugins/modules/zia_traffic_forwarding_gre_tunnel_facts.py +++ b/plugins/modules/zia_traffic_forwarding_gre_tunnel_facts.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -32,11 +33,12 @@ description: "Gets the GRE tunnel information for the specified ID." author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider + - zscaler.ziacloud.fragments.documentation options: id: @@ -116,7 +118,7 @@ def core(module): def main(): argument_spec = ZIAClientHelper.zia_argument_spec() argument_spec.update( - source_ip=dict(type="str", required=False), + source_ip=dict(type="str", required=True), id=dict(type="int", required=False), ) module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True) diff --git a/plugins/modules/zia_traffic_forwarding_gre_tunnels.py b/plugins/modules/zia_traffic_forwarding_gre_tunnels.py index b95fc19..6701c30 100644 --- a/plugins/modules/zia_traffic_forwarding_gre_tunnels.py +++ b/plugins/modules/zia_traffic_forwarding_gre_tunnels.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -32,18 +33,19 @@ description: "GRE tunnel information" author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider - + - zscaler.ziacloud.fragments.documentation - zscaler.ziacloud.fragments.state + options: id: description: "Unique identifier of the static IP address that is associated to a GRE tunnel" type: int - required: False + required: false source_ip: description: - The source IP address of the GRE tunnel. @@ -53,48 +55,34 @@ type: str comment: description: Additional information about this GRE tunnel - required: True + required: false type: str internal_ip_range: description: The start of the internal IP address in /29 CIDR range. - required: True + required: false type: str within_country: description: Restrict the data center virtual IP addresses (VIPs) only to those within the same country as the source IP address. - required: False + required: false type: bool ip_unnumbered: description: This is required to support the automated SD-WAN provisioning of GRE tunnels, when set to true gre_tun_ip and gre_tun_id are set to null - required: False + required: false type: bool sub_cloud: description: Restrict the data center virtual IP addresses (VIPs) only to those part of the subcloud - required: False + required: false type: str - primary_dest_vip: - type: list - elements: dict - required: False + primary_dest_vip_id: description: "The primary destination data center and virtual IP address (VIP) of the GRE tunnel" - suboptions: - id: - description: "Unique identifer of the GRE virtual IP address (VIP)" - type: str - virtual_ip: - description: "GRE cluster virtual IP address (VIP)" - type: str - secondary_dest_vip: type: list - elements: dict - required: False + elements: str + required: false + secondary_dest_vip_id: description: "The secondary destination data center and virtual IP address (VIP) of the GRE tunnel" - suboptions: - id: - description: "Unique identifer of the GRE virtual IP address (VIP)" - type: str - virtual_ip: - description: "GRE cluster virtual IP address (VIP)" - type: str + type: list + elements: str + required: false """ EXAMPLES = r""" @@ -199,9 +187,9 @@ def core(module): available_ranges = client.traffic.list_gre_ranges(limit=1).to_list() if available_ranges: first_range = available_ranges[0] - gre_tunnel[ - "internal_ip_range" - ] = f"{first_range['start_ip_address']}-{first_range['end_ip_address']}" + gre_tunnel["internal_ip_range"] = ( + f"{first_range['start_ip_address']}-{first_range['end_ip_address']}" + ) else: module.fail_json(msg="No available IP ranges found.") @@ -250,14 +238,16 @@ def core(module): "internal_ip_range": gre_tunnel.get("internal_ip_range"), "ip_unnumbered": gre_tunnel.get("ip_unnumbered"), "within_country": gre_tunnel.get("within_country"), - "primary_dest_vip_id": gre_tunnel.get("primary_dest_vip_id")[0] - if gre_tunnel.get("primary_dest_vip_id") - else None, - "secondary_dest_vip_id": gre_tunnel.get( - "secondary_dest_vip_id" - )[0] - if gre_tunnel.get("secondary_dest_vip_id") - else None, + "primary_dest_vip_id": ( + gre_tunnel.get("primary_dest_vip_id")[0] + if gre_tunnel.get("primary_dest_vip_id") + else None + ), + "secondary_dest_vip_id": ( + gre_tunnel.get("secondary_dest_vip_id")[0] + if gre_tunnel.get("secondary_dest_vip_id") + else None + ), "sub_cloud": gre_tunnel.get("sub_cloud"), } ) @@ -277,12 +267,16 @@ def core(module): "internal_ip_range": gre_tunnel.get("internal_ip_range"), "ip_unnumbered": gre_tunnel.get("ip_unnumbered"), "within_country": gre_tunnel.get("within_country"), - "primary_dest_vip_id": gre_tunnel.get("primary_dest_vip_id")[0] - if gre_tunnel.get("primary_dest_vip_id") - else None, - "secondary_dest_vip_id": gre_tunnel.get("secondary_dest_vip_id")[0] - if gre_tunnel.get("secondary_dest_vip_id") - else None, + "primary_dest_vip_id": ( + gre_tunnel.get("primary_dest_vip_id")[0] + if gre_tunnel.get("primary_dest_vip_id") + else None + ), + "secondary_dest_vip_id": ( + gre_tunnel.get("secondary_dest_vip_id")[0] + if gre_tunnel.get("secondary_dest_vip_id") + else None + ), "sub_cloud": gre_tunnel.get("sub_cloud"), } ) diff --git a/plugins/modules/zia_traffic_forwarding_static_ip.py b/plugins/modules/zia_traffic_forwarding_static_ip.py index db3450e..d183170 100644 --- a/plugins/modules/zia_traffic_forwarding_static_ip.py +++ b/plugins/modules/zia_traffic_forwarding_static_ip.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -33,16 +34,16 @@ - "Adds a static IP address." author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider - + - zscaler.ziacloud.fragments.documentation - zscaler.ziacloud.fragments.state options: id: - description: "" + description: "The unique identifier for the static IP address" type: int required: False ip_address: @@ -72,21 +73,13 @@ - Required only if the geoOverride attribute is set. - Latitude with 7 digit precision after decimal point, ranges between -90 and 90 degrees. required: False - type: int + type: float longitude: description: - Required only if the geoOverride attribute is set. - Longitude with 7 digit precision after decimal point, ranges between -180 and 180 degrees. required: False - type: int - state: - description: - - Whether the app connector group should be present or absent. - type: str - choices: - - present - - absent - default: present + type: float """ EXAMPLES = r""" @@ -162,8 +155,8 @@ def core(module): longitude = static_ip.get("longitude") if latitude is not None and longitude is not None: - _, lat_errors = validate_latitude(latitude) - _, lon_errors = validate_longitude(longitude) + unused_result_lat, lat_errors = validate_latitude(latitude) + unused_result_lon, lon_errors = validate_longitude(longitude) if lat_errors: module.fail_json(msg="; ".join(lat_errors)) if lon_errors: diff --git a/plugins/modules/zia_traffic_forwarding_static_ip_facts.py b/plugins/modules/zia_traffic_forwarding_static_ip_facts.py index d6e496a..ec0dcd1 100644 --- a/plugins/modules/zia_traffic_forwarding_static_ip_facts.py +++ b/plugins/modules/zia_traffic_forwarding_static_ip_facts.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -32,11 +33,12 @@ description: "Gets static IP address for the specified ID" author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider + - zscaler.ziacloud.fragments.documentation options: ip_address: @@ -108,7 +110,7 @@ def core(module): def main(): argument_spec = ZIAClientHelper.zia_argument_spec() argument_spec.update( - ip_address=dict(type="str", required=False), + ip_address=dict(type="str", required=True), id=dict(type="int", required=False), ) module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True) diff --git a/plugins/modules/zia_traffic_forwarding_vpn_credentials.py b/plugins/modules/zia_traffic_forwarding_vpn_credentials.py index d3461ed..39101a7 100644 --- a/plugins/modules/zia_traffic_forwarding_vpn_credentials.py +++ b/plugins/modules/zia_traffic_forwarding_vpn_credentials.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -33,13 +34,14 @@ - "Adds VPN credentials that can be associated to locations." author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider - + - zscaler.ziacloud.fragments.documentation - zscaler.ziacloud.fragments.state + options: id: description: @@ -52,7 +54,6 @@ - It is not modifiable after VpnCredential is created. required: false type: str - default: "UFQDN" choices: - IP - UFQDN @@ -61,22 +62,26 @@ required: false type: str pre_shared_key: - description: "Pre-shared key. This is a required field for UFQDN and IP auth type." + description: + - This is a required field for UFQDN and IP auth type. + required: false + type: str + update_psk: + description: + - This is a required when updating the pre_shared_key value. required: false type: bool comments: - description: "Additional information about this VPN credential." + description: + - Additional information about this VPN credential. required: false type: str - state: + ip_address: description: - - Whether the app connector group should be present or absent. + - Static IP address for VPN that is self-provisioned or provisioned by Zscaler. + - This is a required field for IP auth type and is not applicable to other auth types. + required: false type: str - choices: - - present - - absent - default: present - """ EXAMPLES = r""" @@ -285,13 +290,12 @@ def main(): type=dict( type="str", required=False, - default="UFQDN", - choices=["UFQDN", "IP", "CN", "XAUTH"], + choices=["UFQDN", "IP"], ), fqdn=dict(type="str", required=False), ip_address=dict(type="str", required=False), pre_shared_key=dict(type="str", required=False, no_log=True), - update_psk=dict(type="bool", required=False, Default=False), + update_psk=dict(type="bool", required=False), comments=dict(type="str", required=False), state=dict(type="str", choices=["present", "absent"], default="present"), ) diff --git a/plugins/modules/zia_traffic_forwarding_vpn_credentials_facts.py b/plugins/modules/zia_traffic_forwarding_vpn_credentials_facts.py index a89be31..e85ff5c 100644 --- a/plugins/modules/zia_traffic_forwarding_vpn_credentials_facts.py +++ b/plugins/modules/zia_traffic_forwarding_vpn_credentials_facts.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -33,11 +34,12 @@ - "Gets VPN credentials that can be associated to locations" author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider + - zscaler.ziacloud.fragments.documentation options: id: @@ -49,7 +51,11 @@ description: "Fully Qualified Domain Name. Applicable only to UFQDN or XAUTH (or HOSTED_MOBILE_USERS) auth type." required: false type: str - + ip_address: + description: + - This is a required field for IP auth type and is not applicable to other auth types. + required: false + type: str """ EXAMPLES = r""" diff --git a/plugins/modules/zia_url_categories.py b/plugins/modules/zia_url_categories.py index ab0460d..2a3a32f 100644 --- a/plugins/modules/zia_url_categories.py +++ b/plugins/modules/zia_url_categories.py @@ -1,25 +1,26 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Copyright (c) 2023 Zscaler Technology Alliances, - -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: - -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. - -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. +# #!/usr/bin/python +# # -*- coding: utf-8 -*- +# # +# # Copyright (c) 2023 Zscaler Inc, + +# # MIT License +# # Permission is hereby granted, free of charge, to any person obtaining a copy +# # of this software and associated documentation files (the "Software"), to deal +# # in the Software without restriction, including without limitation the rights +# # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# # copies of the Software, and to permit persons to whom the Software is +# # furnished to do so, subject to the following conditions: + +# # The above copyright notice and this permission notice shall be included in all +# # copies or substantial portions of the Software. + +# # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# # SOFTWARE. from __future__ import absolute_import, division, print_function @@ -33,24 +34,148 @@ - "Adds a new custom URL category." author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider - + - zscaler.ziacloud.fragments.documentation - zscaler.ziacloud.fragments.state + +options: + id: + description: URL category ID. See U(https://help.zscaler.com/zia/url-categories#/urlCategories-get) + required: false + type: str + configured_name: + description: "Name of the URL category. This is only required for custom URL categories." + required: false + type: str + description: + description: "Description of the URL category." + required: false + type: str + super_category: + description: + - Super Category of the URL category. + - This field is required when creating custom URL categories. + required: false + type: str + editable: + description: Value is set to false for custom URL category when due to scope user does not have edit permission + required: false + type: bool + type: + description: "Type of the custom categories." + required: false + type: str + choices: + - URL_CATEGORY + - TLD_CATEGORY + - ALL + keywords: + description: + - Custom keywords associated to a URL category. + - "Up to 2048 custom keywords can be added per organization across all categories including bandwidth classes" + required: false + type: list + elements: str + keywords_retaining_parent_category: + description: + - "Retained custom keywords from the parent URL category that is associated to a URL category." + - "Up to 2048 retained parent keywords can be added per organization across all categories including bandwidth classes." + required: false + type: list + elements: str + urls: + description: + - Retained custom keywords from the parent URL category that is associated to a URL category. + - "Up to 2048 retained parent keywords can be added per organization across all categories including bandwidth classes." + required: false + type: list + elements: str + db_categorized_urls: + description: + - URLs added to a custom URL category are also retained under the original parent URL category. + - i.e. the predefined category the URL previously belonged to. + - The URLs entered are covered by policies that reference the original parent URL category. + - If you add www.amazon.com, this URL is covered by policies that reference the custom URL category. + required: false + type: list + elements: str + ip_ranges: + description: + - Custom IP address ranges associated to a URL category. + - Up to 2000 custom IP address ranges and retaining parent custom IP address ranges can be added, per organization, across all categories. + - This field is available only if the option to configure custom IP ranges is enabled for your organization. + - To enable this option, contact Zscaler Support. + required: false + type: list + elements: str + ip_ranges_retaining_parent_category: + description: + - The retaining parent custom IP address ranges associated to a URL category. + - Up to 2000 custom IP ranges and retaining parent custom IP address ranges can be added, per organization, across all categories. + required: false + type: list + elements: str + custom_category: + description: + - Set to true for custom URL category. Up to 48 custom URL categories can be added per organization. + required: false + type: bool + scopes: + description: + - Scope of the custom categories. + type: list + elements: dict + required: false + suboptions: + type: + type: str + required: false + description: + - The admin scope type. The attribute name is subject to change. + choices: + - ORGANIZATION + - DEPARTMENT + - LOCATION + - LOCATION_GROUP + scope_entities: + description: + - Based on the admin scope type, the entities can be the ID/name pair of departments, locations, or location groups. + - The attribute name is subject to change. + type: list + elements: int + required: false """ EXAMPLES = r""" -- name: Gather Information Details of all custom URL Categories - zscaler.ziacloud.zia_url_categories: - provider: '{{ provider }}' - -- name: Gather Information Details of a custom URL Categories by Name +- name: Create a URL Category zscaler.ziacloud.zia_url_categories: provider: '{{ provider }}' - name: "IOS" + super_category: USER_DEFINED + configured_name: Example_Category + description: Example_Category + type: URL_CATEGORY + keywords: + - microsoft + custom_category: true + db_categorized_urls: + - .creditkarma.com + - .youku.com + urls: + - .coupons.com + - .resource.alaskaair.net + - .techrepublic.com + - .dailymotion.com + - .osiriscomm.com + - .uefa.com + - .Logz.io + - .alexa.com + - .baidu.com + - .cnn.com + - .level3.com """ RETURN = r""" @@ -98,15 +223,11 @@ def core(module): "keywords_retaining_parent_category", "urls", "db_categorized_urls", - # "ip_ranges", - # "ip_ranges_retaining_parent_category", + "ip_ranges", + "ip_ranges_retaining_parent_category", "scopes", - "editable", "type", - # "custom_urls_count", - # "urls_retaining_parent_category_count", - # "custom_ip_ranges_count", - # "ip_ranges_retaining_parent_category_count", + "editable" ] for param_name in params: category[param_name] = module.params.get(param_name, None) @@ -143,7 +264,7 @@ def preprocess_category(category, params): # Handling the 'editable' attribute, default to False if not provided if attr == "editable": - preprocessed[attr] = False if value is None else value + preprocessed[attr] = True if value is None else value # 'super_category' is required, so it should be directly assigned elif attr == "super_category": @@ -239,26 +360,27 @@ def preprocess_category(category, params): def main(): argument_spec = ZIAClientHelper.zia_argument_spec() + id_spec = dict( + type="list", + elements="int", + required=False, + ) argument_spec.update( id=dict(type="str"), configured_name=dict(type="str", required=False), description=dict(type="str", required=False), custom_category=dict(type="bool", required=False), - keywords=dict(type="list", elements="str", required=False), + keywords=dict(type="list", elements="str", required=False, no_log=True), keywords_retaining_parent_category=dict( - type="list", elements="str", required=False + type="list", elements="str", required=False, no_log=True ), urls=dict(type="list", elements="str", required=False), db_categorized_urls=dict(type="list", elements="str", required=False), - # ip_ranges=dict(type="list", elements="str", required=False), - # ip_ranges_retaining_parent_category=dict( - # type="list", elements="str", required=False - # ), + ip_ranges=dict(type="list", elements="str", required=False), + ip_ranges_retaining_parent_category=dict( + type="list", elements="str", required=False + ), editable=dict(type="bool", required=False), - # custom_urls_count=dict(type="int", required=False), - # urls_retaining_parent_category_count=dict(type="int", required=False), - # custom_ip_ranges_count=dict(type="int", required=False), - # ip_ranges_retaining_parent_category_count=dict(type="int", required=False), type=dict( type="str", required=False, @@ -268,14 +390,7 @@ def main(): type="list", elements="dict", options=dict( - scope_entities=dict( - type="list", - elements="dict", - options=dict( - id=dict(type="int", required=False), - ), - required=False, - ), + scope_entities=id_spec, type=dict( type="str", required=False, @@ -292,47 +407,6 @@ def main(): super_category=dict( type="str", required=False, - choices=[ - "ANY", - "ADVANCED_SECURITY", - "ENTERTAINMENT_AND_RECREATION", - "NEWS_AND_MEDIA", - "USER_DEFINED", - "EDUCATION", - "BUSINESS_AND_ECONOMY", - "JOB_SEARCH", - "INFORMATION_TECHNOLOGY", - "INTERNET_COMMUNICATION", - "OFFICE_365", - "CUSTOM_SUPERCATEGORY", - "CUSTOM_BP", - "CUSTOM_BW", - "MISCELLANEOUS", - "TRAVEL", - "VEHICLES", - "GOVERNMENT_AND_POLITICS", - "GLOBAL_INT", - "GLOBAL_INT_BP", - "GLOBAL_INT_BW", - "GLOBAL_INT_OFC365", - "ADULT_MATERIAL", - "DRUGS", - "GAMBLING", - "VIOLENCE", - "WEAPONS_AND_BOMBS", - "TASTELESS", - "MILITANCY_HATE_AND_EXTREMISM", - "ILLEGAL_OR_QUESTIONABLE", - "SOCIETY_AND_LIFESTYLE", - "HEALTH", - "SPORTS", - "SPECIAL_INTERESTS_SOCIAL_ORGANIZATIONS", - "GAMES", - "SHOPPING_AND_AUCTIONS", - "SOCIAL_AND_FAMILY_ISSUES", - "RELIGION", - "SECURITY", - ], ), state=dict(type="str", choices=["present", "absent"], default="present"), ) diff --git a/plugins/modules/zia_url_categories_facts.py b/plugins/modules/zia_url_categories_facts.py index 3d3b7fc..4475c1a 100644 --- a/plugins/modules/zia_url_categories_facts.py +++ b/plugins/modules/zia_url_categories_facts.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -32,11 +33,22 @@ description: "Gets information about all or custom URL categories." author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider + - zscaler.ziacloud.fragments.documentation + +options: + id: + description: URL category ID. See U(https://help.zscaler.com/zia/url-categories#/urlCategories-get) + required: false + type: str + configured_name: + description: "Name of the URL category. This is only required for custom URL categories." + required: false + type: str """ diff --git a/plugins/modules/zia_url_filtering_rule_facts.py b/plugins/modules/zia_url_filtering_rule_facts.py index 4af1492..9ac2cb2 100644 --- a/plugins/modules/zia_url_filtering_rule_facts.py +++ b/plugins/modules/zia_url_filtering_rule_facts.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -32,11 +33,12 @@ description: "Gets all rules in the URL filtering policy." author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider + - zscaler.ziacloud.fragments.documentation options: id: @@ -45,7 +47,7 @@ type: int name: description: "Name of the URL filtering rule" - required: true + required: false type: str """ diff --git a/plugins/modules/zia_url_filtering_rules.py b/plugins/modules/zia_url_filtering_rules.py index 5777995..a86456b 100644 --- a/plugins/modules/zia_url_filtering_rules.py +++ b/plugins/modules/zia_url_filtering_rules.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -32,13 +33,15 @@ description: "Adds a new URL Filtering rule." author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider - + - zscaler.ziacloud.fragments.documentation - zscaler.ziacloud.fragments.state + + options: id: description: "Unique identifier for the URL Filtering policy rule" @@ -52,15 +55,34 @@ description: "Additional information about the rule" required: false type: str + enabled: + description: + - Determines whether the URL Filtering rule is enabled or disabled + required: false + type: bool order: description: "Rule order number of the URL Filtering policy rule" required: true type: int + action: + description: + - Action taken when traffic matches rule criteria + - When the action is set to CAUTION the attribute request_methods accepts only the following values are CONNECT GET HEAD + required: false + type: str + choices: + - ANY + - BLOCK + - CAUTION + - ALLOW + - ISOLATE + - ICAP_RESPONSE protocols: description: - Protocol criteria required: false - type: str + type: list + elements: str choices: - SMRULEF_ZPA_BROKERS_RULE - ANY_RULE @@ -81,25 +103,25 @@ description: - Name-ID pairs of locations for which rule must be applied type: list - elements: str + elements: int required: false groups: description: - Name-ID pairs of groups for which rule must be applied type: list - elements: str + elements: int required: false departments: description: - Name-ID pairs of departments for which rule will be applied type: list - elements: str + elements: int required: false users: description: - Name-ID pairs of users for which rule must be applied type: list - elements: str + elements: int required: false workload_groups: description: "The list of preconfigured workload groups to which the policy must be applied." @@ -112,20 +134,27 @@ type: list elements: str required: false - enabled: + device_groups: description: - - Determines whether the URL Filtering rule is enabled or disabled + - Name-ID pairs of device groups for which the rule must be applied. + - This field is applicable for devices that are managed using Zscaler Client Connector. + - If no value is set, this field is ignored during the policy evaluation. + type: list + elements: int + required: false + devices: + description: + - Name-ID pairs of devices for which rule must be applied. + - Specifies devices that are managed using Zscaler Client Connector. + - If no value is set, this field is ignored during the policy evaluation. + type: list + elements: int required: false - type: str - choices: - - DISABLED - - ENABLED - default: ENABLED time_windows: description: - Name-ID pairs of time interval during which rule must be enforced. type: list - elements: str + elements: int required: false rank: description: @@ -139,7 +168,7 @@ - If not set, rule will be applied to all methods" type: list elements: str - required: false + required: true choices: - OPTIONS - GET @@ -150,6 +179,46 @@ - TRACE - CONNECT - OTHER + user_agent_types: + description: + - Any number of user agents to which the rule applies. + type: list + elements: str + required: false + choices: + - OPERA + - FIREFOX + - MSIE + - MSEDGE + - CHROME + - SAFARI + - OTHER + - MSCHREDGE + user_risk_score_levels: + description: Indicates the user risk level selected for the DLP rule violation. + required: false + type: list + elements: str + choices: + - LOW + - MEDIUM + - HIGH + - CRITICAL + device_trust_levels: + description: + - List of device trust levels for which the rule must be applied. + - This field is applicable for devices that are managed using Zscaler Client Connector. + - The trust levels are assigned to the devices based on your posture configurations. + - If no value is set, this field is ignored during the policy evaluation. + type: list + elements: str + required: false + choices: + - ANY + - UNKNOWN_DEVICETRUSTLEVEL + - LOW_TRUST + - MEDIUM_TRUST + - HIGH_TRUST end_user_notification_url: description: - URL of end user notification page to be displayed when the rule is matched. @@ -162,7 +231,7 @@ - Applicable only if block_override is set to true, action is BLOCK and override_groups is not set. - If this override_users is not set, BLOCK action can be overridden for any user. type: list - elements: str + elements: int required: false override_groups: description: @@ -170,7 +239,7 @@ - Applicable only if block_override is set to true and action is BLOCK. - If this override_groups is not set, BLOCK action can be overridden for any group. type: list - elements: str + elements: int required: false block_override: description: @@ -179,7 +248,6 @@ - If block_override is not set, BLOCK action cannot be overridden. type: bool required: false - default: false time_quota: description: - Action must be set to CAUTION @@ -200,20 +268,19 @@ description: - Name-ID pairs of the location groups to which the rule must be applied. type: list - elements: str + elements: int required: false labels: description: - The URL Filtering rule label. Rule labels allow you to logically group your organization policy rules. - Policy rules that are not associated with a rule label are grouped under the Untagged label. type: list - elements: str + elements: int required: false enforce_time_validity: description: - Enforce a set a validity time period for the URL Filtering rule. type: bool - default: false validity_start_time: description: - If enforce_time_validity is set to true, the URL Filtering rule will be valid starting on this date and time. @@ -221,25 +288,17 @@ - Notice that validity_start_time cannot be in the past required: false type: str - validity_end_time: + validity_time_zone_id: description: - - If enforce_time_validity is set to true, the URL Filtering rule will cease to be valid on this end date and time. - - Example ( 12/21/2023 12:00 AM ) + - If enforceTimeValidity is set to true, the URL Filtering rule date and time is valid based on this time zone ID. required: false type: str - action: + validity_end_time: description: - - Action taken when traffic matches rule criteria - - When the action is set to CAUTION the attribute request_methods accepts only the following values are CONNECT GET HEAD + - If enforce_time_validity is set to true, the URL Filtering rule will cease to be valid on this end date and time. + - Example ( 12/21/2023 12:00 AM ) required: false type: str - choices: - - ANY - - NONE - - BLOCK - - CAUTION - - ALLOW - - ICAP_RESPONSE cipa_rule: description: - If set to true, the CIPA Compliance rule is enabled @@ -296,11 +355,10 @@ """ import time -import pytz from datetime import datetime from traceback import format_exc from ansible.module_utils._text import to_native -from ansible.module_utils.basic import AnsibleModule +from ansible.module_utils.basic import AnsibleModule, missing_required_lib from ansible_collections.zscaler.ziacloud.plugins.module_utils.utils import ( deleteNone, ) @@ -308,30 +366,30 @@ ZIAClientHelper, ) +try: + import pytz + HAS_PYTZ = True + PYTZ_IMPORT_ERROR = None # Explicitly set to None when import is successful +except ImportError: + pytz = None # Set to None to indicate the module is unavailable + HAS_PYTZ = False + PYTZ_IMPORT_ERROR = missing_required_lib("pytz") # Use missing_required_lib for better error messages + def validate_and_convert_time_fields(rule): - """ - Validate time-related fields and convert start and end times to epoch if enforce_time_validity is True. - """ + if not HAS_PYTZ: + raise ImportError(PYTZ_IMPORT_ERROR) # Properly handle the case where pytz is not available + enforce_time_validity = rule.get("enforce_time_validity") if enforce_time_validity: - # Mandatory fields check - for field in [ - "validity_start_time", - "validity_end_time", - "validity_time_zone_id", - ]: + for field in ["validity_start_time", "validity_end_time", "validity_time_zone_id"]: if not rule.get(field): - raise ValueError( - f"'{field}' must be set when 'enforce_time_validity' is True" - ) + raise ValueError(f"'{field}' must be set when 'enforce_time_validity' is True") - # Validate and convert time zone timezone_id = rule["validity_time_zone_id"] if timezone_id not in pytz.all_timezones: raise ValueError(f"Invalid timezone ID: {timezone_id}") - # Convert start and end times to epoch for time_field in ["validity_start_time", "validity_end_time"]: time_str = rule.get(time_field) if time_str: @@ -645,7 +703,7 @@ def main(): url=dict(type="str", required=True), ) argument_spec.update( - id=dict(type="str", required=False), + id=dict(type="int", required=False), name=dict(type="str", required=True), description=dict(type="str", required=False), enabled=dict(type="bool", required=False), @@ -676,12 +734,12 @@ def main(): cbi_profile=dict( type="dict", options=id_name_url_dict_spec, - required=True, + required=False, ), action=dict( type="str", required=False, - choices=["BLOCK", "CAUTION", "ALLOW", "ISOLATE", "ICAP_RESPONSE"], + choices=["ANY", "BLOCK", "CAUTION", "ALLOW", "ISOLATE", "ICAP_RESPONSE"], ), protocols=dict( type="list", @@ -724,7 +782,7 @@ def main(): user_agent_types=dict( type="list", elements="str", - required=True, + required=False, choices=[ "OPERA", "FIREFOX", @@ -757,6 +815,9 @@ def main(): state=dict(type="str", choices=["present", "absent"], default="present"), ) module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True) + if not HAS_PYTZ: + module.fail_json(msg="The 'pytz' library is required by this module.", exception=PYTZ_IMPORT_ERROR) + try: core(module) except Exception as e: diff --git a/plugins/modules/zia_user_management_department_facts.py b/plugins/modules/zia_user_management_department_facts.py index bbeaec3..2b8bf98 100644 --- a/plugins/modules/zia_user_management_department_facts.py +++ b/plugins/modules/zia_user_management_department_facts.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -33,11 +34,12 @@ - "Gets a list of departments" author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider + - zscaler.ziacloud.fragments.documentation options: id: @@ -46,7 +48,7 @@ type: int name: description: "Department name." - required: true + required: false type: str """ @@ -102,7 +104,7 @@ def main(): argument_spec = ZIAClientHelper.zia_argument_spec() argument_spec.update( name=dict(type="str", required=False), - id=dict(type="str", required=False), + id=dict(type="int", required=False), ) module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True) try: diff --git a/plugins/modules/zia_user_management_facts.py b/plugins/modules/zia_user_management_facts.py index f3cbf84..95719e1 100644 --- a/plugins/modules/zia_user_management_facts.py +++ b/plugins/modules/zia_user_management_facts.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -33,11 +34,12 @@ - "Gets a list of users" author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider + - zscaler.ziacloud.fragments.documentation options: id: @@ -46,7 +48,7 @@ type: int name: description: "User name. This appears when choosing users for policies." - required: true + required: false type: str """ diff --git a/plugins/modules/zia_user_management_groups_facts.py b/plugins/modules/zia_user_management_groups_facts.py index c4e2ce1..5a8496c 100644 --- a/plugins/modules/zia_user_management_groups_facts.py +++ b/plugins/modules/zia_user_management_groups_facts.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -33,11 +34,12 @@ - "Gets a list of user groups. " author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider + - zscaler.ziacloud.fragments.documentation options: id: @@ -46,7 +48,7 @@ type: int name: description: "Group name." - required: true + required: false type: str """ diff --git a/plugins/modules/zia_workload_groups_facts.py b/plugins/modules/zia_workload_groups_facts.py index fdcae8f..efb5a5b 100644 --- a/plugins/modules/zia_workload_groups_facts.py +++ b/plugins/modules/zia_workload_groups_facts.py @@ -1,8 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (c) 2023 Zscaler Technology Alliances, +# Copyright (c) 2023 Zscaler Inc, +# MIT License # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -33,11 +34,12 @@ - "Get a list of workload groups." author: - William Guilherme (@willguibr) -version_added: "1.0.0" +version_added: "0.1.0" requirements: - Zscaler SDK Python can be obtained from PyPI U(https://pypi.org/project/zscaler-sdk-python/) extends_documentation_fragment: - zscaler.ziacloud.fragments.provider + - zscaler.ziacloud.fragments.documentation options: id: diff --git a/poetry.lock b/poetry.lock index a851425..8780610 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,88 +1,111 @@ # This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. +[[package]] +name = "aenum" +version = "3.1.15" +description = "Advanced Enumerations (compatible with Python's stdlib Enum), NamedTuples, and NamedConstants" +optional = false +python-versions = "*" +files = [ + {file = "aenum-3.1.15-py2-none-any.whl", hash = "sha256:27b1710b9d084de6e2e695dab78fe9f269de924b51ae2850170ee7e1ca6288a5"}, + {file = "aenum-3.1.15-py3-none-any.whl", hash = "sha256:e0dfaeea4c2bd362144b87377e2c61d91958c5ed0b4daf89cb6f45ae23af6288"}, + {file = "aenum-3.1.15.tar.gz", hash = "sha256:8cbd76cd18c4f870ff39b24284d3ea028fbe8731a58df3aa581e434c575b9559"}, +] + +[[package]] +name = "aiofiles" +version = "23.2.1" +description = "File support for asyncio." +optional = false +python-versions = ">=3.7" +files = [ + {file = "aiofiles-23.2.1-py3-none-any.whl", hash = "sha256:19297512c647d4b27a2cf7c34caa7e405c0d60b5560618a29a9fe027b18b0107"}, + {file = "aiofiles-23.2.1.tar.gz", hash = "sha256:84ec2218d8419404abcb9f0c02df3f34c6e0a68ed41072acfb1cef5cbc29051a"}, +] + [[package]] name = "aiohttp" -version = "3.9.3" +version = "3.9.5" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.8" files = [ - {file = "aiohttp-3.9.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:939677b61f9d72a4fa2a042a5eee2a99a24001a67c13da113b2e30396567db54"}, - {file = "aiohttp-3.9.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1f5cd333fcf7590a18334c90f8c9147c837a6ec8a178e88d90a9b96ea03194cc"}, - {file = "aiohttp-3.9.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:82e6aa28dd46374f72093eda8bcd142f7771ee1eb9d1e223ff0fa7177a96b4a5"}, - {file = "aiohttp-3.9.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f56455b0c2c7cc3b0c584815264461d07b177f903a04481dfc33e08a89f0c26b"}, - {file = "aiohttp-3.9.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bca77a198bb6e69795ef2f09a5f4c12758487f83f33d63acde5f0d4919815768"}, - {file = "aiohttp-3.9.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e083c285857b78ee21a96ba1eb1b5339733c3563f72980728ca2b08b53826ca5"}, - {file = "aiohttp-3.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab40e6251c3873d86ea9b30a1ac6d7478c09277b32e14745d0d3c6e76e3c7e29"}, - {file = "aiohttp-3.9.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df822ee7feaaeffb99c1a9e5e608800bd8eda6e5f18f5cfb0dc7eeb2eaa6bbec"}, - {file = "aiohttp-3.9.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:acef0899fea7492145d2bbaaaec7b345c87753168589cc7faf0afec9afe9b747"}, - {file = "aiohttp-3.9.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:cd73265a9e5ea618014802ab01babf1940cecb90c9762d8b9e7d2cc1e1969ec6"}, - {file = "aiohttp-3.9.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:a78ed8a53a1221393d9637c01870248a6f4ea5b214a59a92a36f18151739452c"}, - {file = "aiohttp-3.9.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:6b0e029353361f1746bac2e4cc19b32f972ec03f0f943b390c4ab3371840aabf"}, - {file = "aiohttp-3.9.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7cf5c9458e1e90e3c390c2639f1017a0379a99a94fdfad3a1fd966a2874bba52"}, - {file = "aiohttp-3.9.3-cp310-cp310-win32.whl", hash = "sha256:3e59c23c52765951b69ec45ddbbc9403a8761ee6f57253250c6e1536cacc758b"}, - {file = "aiohttp-3.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:055ce4f74b82551678291473f66dc9fb9048a50d8324278751926ff0ae7715e5"}, - {file = "aiohttp-3.9.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6b88f9386ff1ad91ace19d2a1c0225896e28815ee09fc6a8932fded8cda97c3d"}, - {file = "aiohttp-3.9.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c46956ed82961e31557b6857a5ca153c67e5476972e5f7190015018760938da2"}, - {file = "aiohttp-3.9.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:07b837ef0d2f252f96009e9b8435ec1fef68ef8b1461933253d318748ec1acdc"}, - {file = "aiohttp-3.9.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad46e6f620574b3b4801c68255492e0159d1712271cc99d8bdf35f2043ec266"}, - {file = "aiohttp-3.9.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ed3e046ea7b14938112ccd53d91c1539af3e6679b222f9469981e3dac7ba1ce"}, - {file = "aiohttp-3.9.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:039df344b45ae0b34ac885ab5b53940b174530d4dd8a14ed8b0e2155b9dddccb"}, - {file = "aiohttp-3.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7943c414d3a8d9235f5f15c22ace69787c140c80b718dcd57caaade95f7cd93b"}, - {file = "aiohttp-3.9.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84871a243359bb42c12728f04d181a389718710129b36b6aad0fc4655a7647d4"}, - {file = "aiohttp-3.9.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5eafe2c065df5401ba06821b9a054d9cb2848867f3c59801b5d07a0be3a380ae"}, - {file = "aiohttp-3.9.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:9d3c9b50f19704552f23b4eaea1fc082fdd82c63429a6506446cbd8737823da3"}, - {file = "aiohttp-3.9.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:f033d80bc6283092613882dfe40419c6a6a1527e04fc69350e87a9df02bbc283"}, - {file = "aiohttp-3.9.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:2c895a656dd7e061b2fd6bb77d971cc38f2afc277229ce7dd3552de8313a483e"}, - {file = "aiohttp-3.9.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1f5a71d25cd8106eab05f8704cd9167b6e5187bcdf8f090a66c6d88b634802b4"}, - {file = "aiohttp-3.9.3-cp311-cp311-win32.whl", hash = "sha256:50fca156d718f8ced687a373f9e140c1bb765ca16e3d6f4fe116e3df7c05b2c5"}, - {file = "aiohttp-3.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:5fe9ce6c09668063b8447f85d43b8d1c4e5d3d7e92c63173e6180b2ac5d46dd8"}, - {file = "aiohttp-3.9.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:38a19bc3b686ad55804ae931012f78f7a534cce165d089a2059f658f6c91fa60"}, - {file = "aiohttp-3.9.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:770d015888c2a598b377bd2f663adfd947d78c0124cfe7b959e1ef39f5b13869"}, - {file = "aiohttp-3.9.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ee43080e75fc92bf36219926c8e6de497f9b247301bbf88c5c7593d931426679"}, - {file = "aiohttp-3.9.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52df73f14ed99cee84865b95a3d9e044f226320a87af208f068ecc33e0c35b96"}, - {file = "aiohttp-3.9.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc9b311743a78043b26ffaeeb9715dc360335e5517832f5a8e339f8a43581e4d"}, - {file = "aiohttp-3.9.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b955ed993491f1a5da7f92e98d5dad3c1e14dc175f74517c4e610b1f2456fb11"}, - {file = "aiohttp-3.9.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:504b6981675ace64c28bf4a05a508af5cde526e36492c98916127f5a02354d53"}, - {file = "aiohttp-3.9.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a6fe5571784af92b6bc2fda8d1925cccdf24642d49546d3144948a6a1ed58ca5"}, - {file = "aiohttp-3.9.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ba39e9c8627edc56544c8628cc180d88605df3892beeb2b94c9bc857774848ca"}, - {file = "aiohttp-3.9.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e5e46b578c0e9db71d04c4b506a2121c0cb371dd89af17a0586ff6769d4c58c1"}, - {file = "aiohttp-3.9.3-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:938a9653e1e0c592053f815f7028e41a3062e902095e5a7dc84617c87267ebd5"}, - {file = "aiohttp-3.9.3-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:c3452ea726c76e92f3b9fae4b34a151981a9ec0a4847a627c43d71a15ac32aa6"}, - {file = "aiohttp-3.9.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ff30218887e62209942f91ac1be902cc80cddb86bf00fbc6783b7a43b2bea26f"}, - {file = "aiohttp-3.9.3-cp312-cp312-win32.whl", hash = "sha256:38f307b41e0bea3294a9a2a87833191e4bcf89bb0365e83a8be3a58b31fb7f38"}, - {file = "aiohttp-3.9.3-cp312-cp312-win_amd64.whl", hash = "sha256:b791a3143681a520c0a17e26ae7465f1b6f99461a28019d1a2f425236e6eedb5"}, - {file = "aiohttp-3.9.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0ed621426d961df79aa3b963ac7af0d40392956ffa9be022024cd16297b30c8c"}, - {file = "aiohttp-3.9.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7f46acd6a194287b7e41e87957bfe2ad1ad88318d447caf5b090012f2c5bb528"}, - {file = "aiohttp-3.9.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:feeb18a801aacb098220e2c3eea59a512362eb408d4afd0c242044c33ad6d542"}, - {file = "aiohttp-3.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f734e38fd8666f53da904c52a23ce517f1b07722118d750405af7e4123933511"}, - {file = "aiohttp-3.9.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b40670ec7e2156d8e57f70aec34a7216407848dfe6c693ef131ddf6e76feb672"}, - {file = "aiohttp-3.9.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fdd215b7b7fd4a53994f238d0f46b7ba4ac4c0adb12452beee724ddd0743ae5d"}, - {file = "aiohttp-3.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:017a21b0df49039c8f46ca0971b3a7fdc1f56741ab1240cb90ca408049766168"}, - {file = "aiohttp-3.9.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e99abf0bba688259a496f966211c49a514e65afa9b3073a1fcee08856e04425b"}, - {file = "aiohttp-3.9.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:648056db9a9fa565d3fa851880f99f45e3f9a771dd3ff3bb0c048ea83fb28194"}, - {file = "aiohttp-3.9.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8aacb477dc26797ee089721536a292a664846489c49d3ef9725f992449eda5a8"}, - {file = "aiohttp-3.9.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:522a11c934ea660ff8953eda090dcd2154d367dec1ae3c540aff9f8a5c109ab4"}, - {file = "aiohttp-3.9.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:5bce0dc147ca85caa5d33debc4f4d65e8e8b5c97c7f9f660f215fa74fc49a321"}, - {file = "aiohttp-3.9.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b4af9f25b49a7be47c0972139e59ec0e8285c371049df1a63b6ca81fdd216a2"}, - {file = "aiohttp-3.9.3-cp38-cp38-win32.whl", hash = "sha256:298abd678033b8571995650ccee753d9458dfa0377be4dba91e4491da3f2be63"}, - {file = "aiohttp-3.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:69361bfdca5468c0488d7017b9b1e5ce769d40b46a9f4a2eed26b78619e9396c"}, - {file = "aiohttp-3.9.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0fa43c32d1643f518491d9d3a730f85f5bbaedcbd7fbcae27435bb8b7a061b29"}, - {file = "aiohttp-3.9.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:835a55b7ca49468aaaac0b217092dfdff370e6c215c9224c52f30daaa735c1c1"}, - {file = "aiohttp-3.9.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:06a9b2c8837d9a94fae16c6223acc14b4dfdff216ab9b7202e07a9a09541168f"}, - {file = "aiohttp-3.9.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abf151955990d23f84205286938796c55ff11bbfb4ccfada8c9c83ae6b3c89a3"}, - {file = "aiohttp-3.9.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59c26c95975f26e662ca78fdf543d4eeaef70e533a672b4113dd888bd2423caa"}, - {file = "aiohttp-3.9.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f95511dd5d0e05fd9728bac4096319f80615aaef4acbecb35a990afebe953b0e"}, - {file = "aiohttp-3.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:595f105710293e76b9dc09f52e0dd896bd064a79346234b521f6b968ffdd8e58"}, - {file = "aiohttp-3.9.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7c8b816c2b5af5c8a436df44ca08258fc1a13b449393a91484225fcb7545533"}, - {file = "aiohttp-3.9.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f1088fa100bf46e7b398ffd9904f4808a0612e1d966b4aa43baa535d1b6341eb"}, - {file = "aiohttp-3.9.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f59dfe57bb1ec82ac0698ebfcdb7bcd0e99c255bd637ff613760d5f33e7c81b3"}, - {file = "aiohttp-3.9.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:361a1026c9dd4aba0109e4040e2aecf9884f5cfe1b1b1bd3d09419c205e2e53d"}, - {file = "aiohttp-3.9.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:363afe77cfcbe3a36353d8ea133e904b108feea505aa4792dad6585a8192c55a"}, - {file = "aiohttp-3.9.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e2c45c208c62e955e8256949eb225bd8b66a4c9b6865729a786f2aa79b72e9d"}, - {file = "aiohttp-3.9.3-cp39-cp39-win32.whl", hash = "sha256:f7217af2e14da0856e082e96ff637f14ae45c10a5714b63c77f26d8884cf1051"}, - {file = "aiohttp-3.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:27468897f628c627230dba07ec65dc8d0db566923c48f29e084ce382119802bc"}, - {file = "aiohttp-3.9.3.tar.gz", hash = "sha256:90842933e5d1ff760fae6caca4b2b3edba53ba8f4b71e95dacf2818a2aca06f7"}, + {file = "aiohttp-3.9.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fcde4c397f673fdec23e6b05ebf8d4751314fa7c24f93334bf1f1364c1c69ac7"}, + {file = "aiohttp-3.9.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5d6b3f1fabe465e819aed2c421a6743d8debbde79b6a8600739300630a01bf2c"}, + {file = "aiohttp-3.9.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ae79c1bc12c34082d92bf9422764f799aee4746fd7a392db46b7fd357d4a17a"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d3ebb9e1316ec74277d19c5f482f98cc65a73ccd5430540d6d11682cd857430"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84dabd95154f43a2ea80deffec9cb44d2e301e38a0c9d331cc4aa0166fe28ae3"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c8a02fbeca6f63cb1f0475c799679057fc9268b77075ab7cf3f1c600e81dd46b"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c26959ca7b75ff768e2776d8055bf9582a6267e24556bb7f7bd29e677932be72"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:714d4e5231fed4ba2762ed489b4aec07b2b9953cf4ee31e9871caac895a839c0"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7a6a8354f1b62e15d48e04350f13e726fa08b62c3d7b8401c0a1314f02e3558"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c413016880e03e69d166efb5a1a95d40f83d5a3a648d16486592c49ffb76d0db"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ff84aeb864e0fac81f676be9f4685f0527b660f1efdc40dcede3c251ef1e867f"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ad7f2919d7dac062f24d6f5fe95d401597fbb015a25771f85e692d043c9d7832"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:702e2c7c187c1a498a4e2b03155d52658fdd6fda882d3d7fbb891a5cf108bb10"}, + {file = "aiohttp-3.9.5-cp310-cp310-win32.whl", hash = "sha256:67c3119f5ddc7261d47163ed86d760ddf0e625cd6246b4ed852e82159617b5fb"}, + {file = "aiohttp-3.9.5-cp310-cp310-win_amd64.whl", hash = "sha256:471f0ef53ccedec9995287f02caf0c068732f026455f07db3f01a46e49d76bbb"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ae53e33ee7476dd3d1132f932eeb39bf6125083820049d06edcdca4381f342"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c088c4d70d21f8ca5c0b8b5403fe84a7bc8e024161febdd4ef04575ef35d474d"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:639d0042b7670222f33b0028de6b4e2fad6451462ce7df2af8aee37dcac55424"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f26383adb94da5e7fb388d441bf09c61e5e35f455a3217bfd790c6b6bc64b2ee"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66331d00fb28dc90aa606d9a54304af76b335ae204d1836f65797d6fe27f1ca2"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ff550491f5492ab5ed3533e76b8567f4b37bd2995e780a1f46bca2024223233"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f22eb3a6c1080d862befa0a89c380b4dafce29dc6cd56083f630073d102eb595"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a81b1143d42b66ffc40a441379387076243ef7b51019204fd3ec36b9f69e77d6"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f64fd07515dad67f24b6ea4a66ae2876c01031de91c93075b8093f07c0a2d93d"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:93e22add827447d2e26d67c9ac0161756007f152fdc5210277d00a85f6c92323"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:55b39c8684a46e56ef8c8d24faf02de4a2b2ac60d26cee93bc595651ff545de9"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4715a9b778f4293b9f8ae7a0a7cef9829f02ff8d6277a39d7f40565c737d3771"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:afc52b8d969eff14e069a710057d15ab9ac17cd4b6753042c407dcea0e40bf75"}, + {file = "aiohttp-3.9.5-cp311-cp311-win32.whl", hash = "sha256:b3df71da99c98534be076196791adca8819761f0bf6e08e07fd7da25127150d6"}, + {file = "aiohttp-3.9.5-cp311-cp311-win_amd64.whl", hash = "sha256:88e311d98cc0bf45b62fc46c66753a83445f5ab20038bcc1b8a1cc05666f428a"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:c7a4b7a6cf5b6eb11e109a9755fd4fda7d57395f8c575e166d363b9fc3ec4678"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0a158704edf0abcac8ac371fbb54044f3270bdbc93e254a82b6c82be1ef08f3c"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d153f652a687a8e95ad367a86a61e8d53d528b0530ef382ec5aaf533140ed00f"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82a6a97d9771cb48ae16979c3a3a9a18b600a8505b1115cfe354dfb2054468b4"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:60cdbd56f4cad9f69c35eaac0fbbdf1f77b0ff9456cebd4902f3dd1cf096464c"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8676e8fd73141ded15ea586de0b7cda1542960a7b9ad89b2b06428e97125d4fa"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da00da442a0e31f1c69d26d224e1efd3a1ca5bcbf210978a2ca7426dfcae9f58"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18f634d540dd099c262e9f887c8bbacc959847cfe5da7a0e2e1cf3f14dbf2daf"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:320e8618eda64e19d11bdb3bd04ccc0a816c17eaecb7e4945d01deee2a22f95f"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:2faa61a904b83142747fc6a6d7ad8fccff898c849123030f8e75d5d967fd4a81"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:8c64a6dc3fe5db7b1b4d2b5cb84c4f677768bdc340611eca673afb7cf416ef5a"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:393c7aba2b55559ef7ab791c94b44f7482a07bf7640d17b341b79081f5e5cd1a"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c671dc117c2c21a1ca10c116cfcd6e3e44da7fcde37bf83b2be485ab377b25da"}, + {file = "aiohttp-3.9.5-cp312-cp312-win32.whl", hash = "sha256:5a7ee16aab26e76add4afc45e8f8206c95d1d75540f1039b84a03c3b3800dd59"}, + {file = "aiohttp-3.9.5-cp312-cp312-win_amd64.whl", hash = "sha256:5ca51eadbd67045396bc92a4345d1790b7301c14d1848feaac1d6a6c9289e888"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:694d828b5c41255e54bc2dddb51a9f5150b4eefa9886e38b52605a05d96566e8"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0605cc2c0088fcaae79f01c913a38611ad09ba68ff482402d3410bf59039bfb8"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4558e5012ee03d2638c681e156461d37b7a113fe13970d438d95d10173d25f78"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dbc053ac75ccc63dc3a3cc547b98c7258ec35a215a92bd9f983e0aac95d3d5b"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4109adee842b90671f1b689901b948f347325045c15f46b39797ae1bf17019de"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6ea1a5b409a85477fd8e5ee6ad8f0e40bf2844c270955e09360418cfd09abac"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3c2890ca8c59ee683fd09adf32321a40fe1cf164e3387799efb2acebf090c11"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3916c8692dbd9d55c523374a3b8213e628424d19116ac4308e434dbf6d95bbdd"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8d1964eb7617907c792ca00b341b5ec3e01ae8c280825deadbbd678447b127e1"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d5ab8e1f6bee051a4bf6195e38a5c13e5e161cb7bad83d8854524798bd9fcd6e"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:52c27110f3862a1afbcb2af4281fc9fdc40327fa286c4625dfee247c3ba90156"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:7f64cbd44443e80094309875d4f9c71d0401e966d191c3d469cde4642bc2e031"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8b4f72fbb66279624bfe83fd5eb6aea0022dad8eec62b71e7bf63ee1caadeafe"}, + {file = "aiohttp-3.9.5-cp38-cp38-win32.whl", hash = "sha256:6380c039ec52866c06d69b5c7aad5478b24ed11696f0e72f6b807cfb261453da"}, + {file = "aiohttp-3.9.5-cp38-cp38-win_amd64.whl", hash = "sha256:da22dab31d7180f8c3ac7c7635f3bcd53808f374f6aa333fe0b0b9e14b01f91a"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1732102949ff6087589408d76cd6dea656b93c896b011ecafff418c9661dc4ed"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c6021d296318cb6f9414b48e6a439a7f5d1f665464da507e8ff640848ee2a58a"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:239f975589a944eeb1bad26b8b140a59a3a320067fb3cd10b75c3092405a1372"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b7b30258348082826d274504fbc7c849959f1989d86c29bc355107accec6cfb"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd2adf5c87ff6d8b277814a28a535b59e20bfea40a101db6b3bdca7e9926bc24"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9a3d838441bebcf5cf442700e3963f58b5c33f015341f9ea86dcd7d503c07e2"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e3a1ae66e3d0c17cf65c08968a5ee3180c5a95920ec2731f53343fac9bad106"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c69e77370cce2d6df5d12b4e12bdcca60c47ba13d1cbbc8645dd005a20b738b"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0cbf56238f4bbf49dab8c2dc2e6b1b68502b1e88d335bea59b3f5b9f4c001475"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d1469f228cd9ffddd396d9948b8c9cd8022b6d1bf1e40c6f25b0fb90b4f893ed"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:45731330e754f5811c314901cebdf19dd776a44b31927fa4b4dbecab9e457b0c"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:3fcb4046d2904378e3aeea1df51f697b0467f2aac55d232c87ba162709478c46"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8cf142aa6c1a751fcb364158fd710b8a9be874b81889c2bd13aa8893197455e2"}, + {file = "aiohttp-3.9.5-cp39-cp39-win32.whl", hash = "sha256:7b179eea70833c8dee51ec42f3b4097bd6370892fa93f510f76762105568cf09"}, + {file = "aiohttp-3.9.5-cp39-cp39-win_amd64.whl", hash = "sha256:38d80498e2e169bc61418ff36170e0aad0cd268da8b38a17c4cf29d254a8b3f1"}, + {file = "aiohttp-3.9.5.tar.gz", hash = "sha256:edea7d15772ceeb29db4aff55e482d4bcfb6ae160ce144f2682de02f6d693551"}, ] [package.dependencies] @@ -112,13 +135,13 @@ frozenlist = ">=1.1.0" [[package]] name = "alabaster" -version = "0.7.13" -description = "A configurable sidebar-enabled Sphinx theme" +version = "0.7.16" +description = "A light, configurable Sphinx theme" optional = false -python-versions = ">=3.6" +python-versions = ">=3.9" files = [ - {file = "alabaster-0.7.13-py3-none-any.whl", hash = "sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3"}, - {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, + {file = "alabaster-0.7.16-py3-none-any.whl", hash = "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92"}, + {file = "alabaster-0.7.16.tar.gz", hash = "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65"}, ] [[package]] @@ -132,6 +155,221 @@ files = [ {file = "annotated_types-0.6.0.tar.gz", hash = "sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d"}, ] +[[package]] +name = "ansible-compat" +version = "4.1.11" +description = "Ansible compatibility goodies" +optional = false +python-versions = ">=3.9" +files = [ + {file = "ansible-compat-4.1.11.tar.gz", hash = "sha256:b3e9f9d7c3a1ce6222de444e9dc6fece7eba70ac64f2a0befdc4e2d542018b4a"}, + {file = "ansible_compat-4.1.11-py3-none-any.whl", hash = "sha256:74a91807808a39af48ab6595811b9340d1458db26b138362f48bf39292190705"}, +] + +[package.dependencies] +ansible-core = ">=2.12" +jsonschema = ">=4.6.0" +packaging = "*" +PyYAML = "*" +subprocess-tee = ">=0.4.1" +typing-extensions = {version = ">=4.5.0", markers = "python_version < \"3.10\""} + +[package.extras] +docs = ["argparse-manpage", "black", "mkdocs-ansible[lock] (>=0.1.2)"] +test = ["coverage", "pip-tools", "pytest (>=7.2.0)", "pytest-mock", "pytest-plus (>=0.6.1)"] + +[[package]] +name = "ansible-core" +version = "2.15.10" +description = "Radically simple IT automation" +optional = false +python-versions = ">=3.9" +files = [ + {file = "ansible-core-2.15.10.tar.gz", hash = "sha256:954dbe8e4e802a4dd5df0366193975b692a05806aa8d7358418a7e617346b20f"}, + {file = "ansible_core-2.15.10-py3-none-any.whl", hash = "sha256:42e49f1a6d8cf6cccde775c06c1394885353b71ad9e5f670c6f32d2890127ce8"}, +] + +[package.dependencies] +cryptography = "*" +importlib-resources = {version = ">=5.0,<5.1", markers = "python_version < \"3.10\""} +jinja2 = ">=3.0.0" +packaging = "*" +PyYAML = ">=5.1" +resolvelib = ">=0.5.3,<1.1.0" + +[[package]] +name = "ansible-lint" +version = "6.8.7" +description = "Checks playbooks for practices and behavior that could potentially be improved" +optional = false +python-versions = ">=3.8" +files = [ + {file = "ansible-lint-6.8.7.tar.gz", hash = "sha256:de3de4e57cd54e17c1ec3a0b4a21d4811838e77d67b56cbe8f91107f2a434432"}, + {file = "ansible_lint-6.8.7-py3-none-any.whl", hash = "sha256:1824afce2a5619b47c19f6377a0d85b4f39e80b1fc1857191d6a908d68396bf9"}, +] + +[package.dependencies] +ansible-compat = ">=2.2.5" +ansible-core = {version = ">=2.12.0", markers = "python_version >= \"3.9\""} +black = ">=22.1.0" +filelock = "*" +jsonschema = ">=4.17.0" +packaging = "*" +pyyaml = ">=5.4.1" +rich = ">=12.6.0" +"ruamel.yaml" = ">=0.17.21,<0.18" +wcmatch = ">=8.4.1" +yamllint = ">=1.28.0" + +[package.extras] +docs = ["myst-parser (>=0.16.1)", "pipdeptree (>=2.2.1)", "sphinx (>=4.4.0)", "sphinx-ansible-theme (>=0.9.1)", "sphinx-rtd-theme (>=1.0.0,<2.0.0)", "sphinxcontrib-apidoc (>=0.3.0)", "sphinxcontrib-programoutput2 (>=2.0a1)"] +test = ["black", "coverage-enable-subprocess", "coverage[toml] (>=6.4.4)", "flake8", "flake8-future-annotations", "flaky (>=3.7.0)", "mypy", "psutil", "pylint", "pytest (>=7.2.0)", "pytest-mock", "pytest-plus (>=0.2)", "pytest-xdist (>=2.1.0)"] + +[[package]] +name = "ansible-pygments" +version = "0.1.1" +description = "Tools for building the Ansible Distribution" +optional = false +python-versions = ">=3.6.0,<4.0.0" +files = [ + {file = "ansible-pygments-0.1.1.tar.gz", hash = "sha256:0d0a23cc562f94f4b464f931059ad1688635aac9642962bc68ae3acdb6efbcd0"}, + {file = "ansible_pygments-0.1.1-py3-none-any.whl", hash = "sha256:85aa7412a46c83efcfe460c8016da289600c171d2edfa0f474e0dc30a398b002"}, +] + +[package.dependencies] +pygments = ">=2.4.0" + +[[package]] +name = "antsibull-changelog" +version = "0.26.0" +description = "Changelog tool for Ansible-core and Ansible collections" +optional = false +python-versions = ">=3.9.0" +files = [ + {file = "antsibull_changelog-0.26.0-py3-none-any.whl", hash = "sha256:0a6aa5327790e89a686872fd452a9c31be288a3cb2deb9cc23eb3fc5ea7f0a19"}, + {file = "antsibull_changelog-0.26.0.tar.gz", hash = "sha256:8060c438d9fb5a1025a1e98d4de0ce8d897be6e0c21014216151b93f4e4891ff"}, +] + +[package.dependencies] +docutils = "*" +packaging = "*" +pyyaml = "*" +rstcheck = ">=3.0.0,<7.0.0" +semantic-version = "*" + +[package.extras] +codeqa = ["flake8 (>=3.8.0)", "pylint", "reuse"] +coverage = ["coverage[toml]"] +dev = ["antsibull-changelog[codeqa]", "antsibull-changelog[coverage]", "antsibull-changelog[formatters]", "antsibull-changelog[test]", "antsibull-changelog[typing]", "nox"] +formatters = ["black (>=24)", "isort"] +test = ["pytest", "pytest-cov", "pytest-error-for-skips"] +toml = ["tomli"] +typing = ["mypy", "pyre-check (>=0.9.17)", "types-docutils", "types-pyyaml", "types-toml"] + +[[package]] +name = "antsibull-core" +version = "3.0.1" +description = "Tools for building the Ansible Distribution" +optional = false +python-versions = ">=3.9" +files = [ + {file = "antsibull_core-3.0.1-py3-none-any.whl", hash = "sha256:653f44b010c85b6bcd37aacde64b35e56adec8f62119d2764aa56add7299c2f8"}, + {file = "antsibull_core-3.0.1.tar.gz", hash = "sha256:d7fddfb539757849725f8ae88ff049cef360c088a67251de0d1d8cb041243a9c"}, +] + +[package.dependencies] +aiofiles = "*" +aiohttp = ">=3.0.0" +build = "*" +packaging = ">=20.0" +perky = "*" +pydantic = ">=2.0,<3.0" +pyyaml = "*" +semantic-version = "*" +twiggy = ">=0.5.0" + +[package.extras] +codeqa = ["antsibull-changelog", "flake8 (>=6.0.0)", "pylint (>=2.15.7)", "reuse"] +coverage = ["coverage[toml]"] +dev = ["antsibull-changelog", "asynctest", "black (>=24)", "coverage[toml]", "cryptography", "flake8 (>=6.0.0)", "isort", "mypy", "nox", "pylint (>=2.15.7)", "pyre-check (>=0.9.17)", "pytest", "pytest-asyncio (>=0.20)", "pytest-cov", "pytest-error-for-skips", "reuse", "types-aiofiles", "types-pyyaml", "typing-extensions"] +formatters = ["black (>=24)", "isort"] +test = ["asynctest", "cryptography", "pytest", "pytest-asyncio (>=0.20)", "pytest-cov", "pytest-error-for-skips"] +typing = ["mypy", "pyre-check (>=0.9.17)", "types-aiofiles", "types-pyyaml", "typing-extensions"] + +[[package]] +name = "antsibull-docs" +version = "2.10.0" +description = "Tools for building Ansible documentation" +optional = false +python-versions = ">=3.9" +files = [ + {file = "antsibull_docs-2.10.0-py3-none-any.whl", hash = "sha256:b2c7bf2c771bbf34d3679b91f6196d4cc9c58a4e99fdcf0bcbebad7c50a1e646"}, + {file = "antsibull_docs-2.10.0.tar.gz", hash = "sha256:e266dc18ee7ebe2ab2918a426c992d8ca422dfb891f2a2bb1f960c37af9af38e"}, +] + +[package.dependencies] +aiohttp = ">=3.0.0" +ansible-pygments = "*" +antsibull-changelog = ">=0.24.0" +antsibull-core = ">=2.1.0,<4.0.0" +antsibull-docs-parser = ">=1.0.0,<2.0.0" +asyncio-pool = "*" +docutils = "*" +jinja2 = ">=3.0" +packaging = ">=20.0" +pydantic = ">=1.0.0,<3.0.0" +pyyaml = "*" +rstcheck = ">=3.0.0,<7.0.0" +semantic-version = "*" +sphinx = "*" +twiggy = "*" + +[package.extras] +codeqa = ["flake8 (>=3.8.0)", "pylint (>=2.17.2)", "reuse"] +coverage = ["coverage[toml]"] +dev = ["ansible-core (>=2.14.0)", "asynctest", "black (>=24)", "cryptography", "flake8 (>=3.8.0)", "isort", "mypy", "nox", "pylint (>=2.17.2)", "pyre-check (>=0.9.17)", "pytest", "pytest-asyncio (>=0.12)", "pytest-cov", "pytest-error-for-skips", "reuse", "types-aiofiles", "types-docutils", "types-pyyaml"] +formatters = ["black (>=24)", "isort"] +test = ["ansible-core (>=2.14.0)", "asynctest", "cryptography", "pytest", "pytest-asyncio (>=0.12)", "pytest-cov", "pytest-error-for-skips"] +typing = ["mypy", "pyre-check (>=0.9.17)", "types-aiofiles", "types-docutils", "types-pyyaml"] + +[[package]] +name = "antsibull-docs-parser" +version = "1.0.1" +description = "Python library for processing Ansible documentation markup" +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "antsibull_docs_parser-1.0.1-py3-none-any.whl", hash = "sha256:2c92e60315ee8635537242226cfdb6c43d8036fe6d771f7c52fd037667ff0b4f"}, + {file = "antsibull_docs_parser-1.0.1.tar.gz", hash = "sha256:38c49a9cc9362c70c3024ea6ad1bd44cad8006eb80086ad2f59bd2ead7b16bb3"}, +] + +[package.extras] +codeqa = ["antsibull-changelog", "flake8", "pylint", "reuse"] +coverage = ["coverage[toml]"] +dev = ["antsibull-docs-parser[codeqa]", "antsibull-docs-parser[coverage]", "antsibull-docs-parser[formatters]", "antsibull-docs-parser[test]", "antsibull-docs-parser[typing]", "nox"] +formatters = ["black", "isort"] +test = ["pytest", "pytest-cov", "pytest-error-for-skips", "pyyaml"] +typing = ["mypy", "pyre-check (>=0.9.17)"] + +[[package]] +name = "arrow" +version = "1.3.0" +description = "Better dates & times for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "arrow-1.3.0-py3-none-any.whl", hash = "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80"}, + {file = "arrow-1.3.0.tar.gz", hash = "sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85"}, +] + +[package.dependencies] +python-dateutil = ">=2.7.0" +types-python-dateutil = ">=2.8.10" + +[package.extras] +doc = ["doc8", "sphinx (>=7.0.0)", "sphinx-autobuild", "sphinx-autodoc-typehints", "sphinx_rtd_theme (>=1.3.0)"] +test = ["dateparser (==1.*)", "pre-commit", "pytest", "pytest-cov", "pytest-mock", "pytz (==2021.1)", "simplejson (==3.*)"] + [[package]] name = "astroid" version = "2.11.7" @@ -160,23 +398,35 @@ files = [ {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, ] +[[package]] +name = "asyncio-pool" +version = "0.6.0" +description = "Pool of asyncio coroutines with familiar interface" +optional = false +python-versions = ">=3.5" +files = [ + {file = "asyncio_pool-0.6.0-py3-none-any.whl", hash = "sha256:bf4417be93c2776262d93decabbbd633579f7610947fb73d80857823689e1455"}, + {file = "asyncio_pool-0.6.0.tar.gz", hash = "sha256:d7ba5e299ba58d4fb0cebbc722989d1f880df4c4b19e37055075b3dabc062c5b"}, +] + [[package]] name = "attrs" -version = "23.1.0" +version = "23.2.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.7" files = [ - {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, - {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, + {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, + {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, ] [package.extras] cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] -dev = ["attrs[docs,tests]", "pre-commit"] +dev = ["attrs[tests]", "pre-commit"] docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] +tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] [[package]] name = "babel" @@ -238,6 +488,42 @@ d = ["aiohttp (>=3.7.4)", "aiohttp (>=3.7.4,!=3.9.0)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] uvloop = ["uvloop (>=0.15.2)"] +[[package]] +name = "bracex" +version = "2.4" +description = "Bash style brace expander." +optional = false +python-versions = ">=3.8" +files = [ + {file = "bracex-2.4-py3-none-any.whl", hash = "sha256:efdc71eff95eaff5e0f8cfebe7d01adf2c8637c8c92edaf63ef348c241a82418"}, + {file = "bracex-2.4.tar.gz", hash = "sha256:a27eaf1df42cf561fed58b7a8f3fdf129d1ea16a81e1fadd1d17989bc6384beb"}, +] + +[[package]] +name = "build" +version = "1.2.1" +description = "A simple, correct Python build frontend" +optional = false +python-versions = ">=3.8" +files = [ + {file = "build-1.2.1-py3-none-any.whl", hash = "sha256:75e10f767a433d9a86e50d83f418e83efc18ede923ee5ff7df93b6cb0306c5d4"}, + {file = "build-1.2.1.tar.gz", hash = "sha256:526263f4870c26f26c433545579475377b2b7588b6f1eac76a001e873ae3e19d"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "os_name == \"nt\""} +importlib-metadata = {version = ">=4.6", markers = "python_full_version < \"3.10.2\""} +packaging = ">=19.1" +pyproject_hooks = "*" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} + +[package.extras] +docs = ["furo (>=2023.08.17)", "sphinx (>=7.0,<8.0)", "sphinx-argparse-cli (>=1.5)", "sphinx-autodoc-typehints (>=1.10)", "sphinx-issues (>=3.0.0)"] +test = ["build[uv,virtualenv]", "filelock (>=3)", "pytest (>=6.2.4)", "pytest-cov (>=2.12)", "pytest-mock (>=2)", "pytest-rerunfailures (>=9.1)", "pytest-xdist (>=1.34)", "setuptools (>=42.0.0)", "setuptools (>=56.0.0)", "setuptools (>=56.0.0)", "setuptools (>=67.8.0)", "wheel (>=0.36.0)"] +typing = ["build[uv]", "importlib-metadata (>=5.1)", "mypy (>=1.9.0,<1.10.0)", "tomli", "typing-extensions (>=3.7.4.3)"] +uv = ["uv (>=0.1.18)"] +virtualenv = ["virtualenv (>=20.0.35)"] + [[package]] name = "certifi" version = "2023.11.17" @@ -249,6 +535,70 @@ files = [ {file = "certifi-2023.11.17.tar.gz", hash = "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1"}, ] +[[package]] +name = "cffi" +version = "1.16.0" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = ">=3.8" +files = [ + {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, + {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, + {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, + {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, + {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, + {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, + {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, + {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, + {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, + {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, + {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, + {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, + {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, + {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, +] + +[package.dependencies] +pycparser = "*" + [[package]] name = "chardet" version = "3.0.4" @@ -425,29 +775,84 @@ files = [ {file = "coverage-4.5.4.tar.gz", hash = "sha256:e07d9f1a23e9e93ab5c62902833bf3e4b1f65502927379148b6622686223125c"}, ] +[[package]] +name = "cryptography" +version = "42.0.5" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +optional = false +python-versions = ">=3.7" +files = [ + {file = "cryptography-42.0.5-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:a30596bae9403a342c978fb47d9b0ee277699fa53bbafad14706af51fe543d16"}, + {file = "cryptography-42.0.5-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:b7ffe927ee6531c78f81aa17e684e2ff617daeba7f189f911065b2ea2d526dec"}, + {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2424ff4c4ac7f6b8177b53c17ed5d8fa74ae5955656867f5a8affaca36a27abb"}, + {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:329906dcc7b20ff3cad13c069a78124ed8247adcac44b10bea1130e36caae0b4"}, + {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:b03c2ae5d2f0fc05f9a2c0c997e1bc18c8229f392234e8a0194f202169ccd278"}, + {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f8837fe1d6ac4a8052a9a8ddab256bc006242696f03368a4009be7ee3075cdb7"}, + {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:0270572b8bd2c833c3981724b8ee9747b3ec96f699a9665470018594301439ee"}, + {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:b8cac287fafc4ad485b8a9b67d0ee80c66bf3574f655d3b97ef2e1082360faf1"}, + {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:16a48c23a62a2f4a285699dba2e4ff2d1cff3115b9df052cdd976a18856d8e3d"}, + {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2bce03af1ce5a5567ab89bd90d11e7bbdff56b8af3acbbec1faded8f44cb06da"}, + {file = "cryptography-42.0.5-cp37-abi3-win32.whl", hash = "sha256:b6cd2203306b63e41acdf39aa93b86fb566049aeb6dc489b70e34bcd07adca74"}, + {file = "cryptography-42.0.5-cp37-abi3-win_amd64.whl", hash = "sha256:98d8dc6d012b82287f2c3d26ce1d2dd130ec200c8679b6213b3c73c08b2b7940"}, + {file = "cryptography-42.0.5-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:5e6275c09d2badf57aea3afa80d975444f4be8d3bc58f7f80d2a484c6f9485c8"}, + {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4985a790f921508f36f81831817cbc03b102d643b5fcb81cd33df3fa291a1a1"}, + {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7cde5f38e614f55e28d831754e8a3bacf9ace5d1566235e39d91b35502d6936e"}, + {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:7367d7b2eca6513681127ebad53b2582911d1736dc2ffc19f2c3ae49997496bc"}, + {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:cd2030f6650c089aeb304cf093f3244d34745ce0cfcc39f20c6fbfe030102e2a"}, + {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a2913c5375154b6ef2e91c10b5720ea6e21007412f6437504ffea2109b5a33d7"}, + {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:c41fb5e6a5fe9ebcd58ca3abfeb51dffb5d83d6775405305bfa8715b76521922"}, + {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3eaafe47ec0d0ffcc9349e1708be2aaea4c6dd4978d76bf6eb0cb2c13636c6fc"}, + {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1b95b98b0d2af784078fa69f637135e3c317091b615cd0905f8b8a087e86fa30"}, + {file = "cryptography-42.0.5-cp39-abi3-win32.whl", hash = "sha256:1f71c10d1e88467126f0efd484bd44bca5e14c664ec2ede64c32f20875c0d413"}, + {file = "cryptography-42.0.5-cp39-abi3-win_amd64.whl", hash = "sha256:a011a644f6d7d03736214d38832e030d8268bcff4a41f728e6030325fea3e400"}, + {file = "cryptography-42.0.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9481ffe3cf013b71b2428b905c4f7a9a4f76ec03065b05ff499bb5682a8d9ad8"}, + {file = "cryptography-42.0.5-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:ba334e6e4b1d92442b75ddacc615c5476d4ad55cc29b15d590cc6b86efa487e2"}, + {file = "cryptography-42.0.5-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:ba3e4a42397c25b7ff88cdec6e2a16c2be18720f317506ee25210f6d31925f9c"}, + {file = "cryptography-42.0.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:111a0d8553afcf8eb02a4fea6ca4f59d48ddb34497aa8706a6cf536f1a5ec576"}, + {file = "cryptography-42.0.5-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cd65d75953847815962c84a4654a84850b2bb4aed3f26fadcc1c13892e1e29f6"}, + {file = "cryptography-42.0.5-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:e807b3188f9eb0eaa7bbb579b462c5ace579f1cedb28107ce8b48a9f7ad3679e"}, + {file = "cryptography-42.0.5-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f12764b8fffc7a123f641d7d049d382b73f96a34117e0b637b80643169cec8ac"}, + {file = "cryptography-42.0.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:37dd623507659e08be98eec89323469e8c7b4c1407c85112634ae3dbdb926fdd"}, + {file = "cryptography-42.0.5.tar.gz", hash = "sha256:6fe07eec95dfd477eb9530aef5bead34fec819b3aaf6c5bd6d20565da607bfe1"}, +] + +[package.dependencies] +cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} + +[package.extras] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] +docstest = ["pyenchant (>=1.6.11)", "readme-renderer", "sphinxcontrib-spelling (>=4.0.1)"] +nox = ["nox"] +pep8test = ["check-sdist", "click", "mypy", "ruff"] +sdist = ["build"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["certifi", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test-randomorder = ["pytest-randomly"] + [[package]] name = "dill" -version = "0.3.7" +version = "0.3.8" description = "serialize all of Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "dill-0.3.7-py3-none-any.whl", hash = "sha256:76b122c08ef4ce2eedcd4d1abd8e641114bfc6c2867f49f3c41facf65bf19f5e"}, - {file = "dill-0.3.7.tar.gz", hash = "sha256:cc1c8b182eb3013e24bd475ff2e9295af86c1a38eb1aff128dac8962a9ce3c03"}, + {file = "dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7"}, + {file = "dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca"}, ] [package.extras] graph = ["objgraph (>=1.7.2)"] +profile = ["gprof2dot (>=2022.7.29)"] [[package]] name = "docutils" -version = "0.20.1" +version = "0.21.1" description = "Docutils -- Python Documentation Utilities" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" files = [ - {file = "docutils-0.20.1-py3-none-any.whl", hash = "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6"}, - {file = "docutils-0.20.1.tar.gz", hash = "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b"}, + {file = "docutils-0.21.1-py3-none-any.whl", hash = "sha256:14c8d34a55b46c88f9f714adb29cefbdd69fb82f3fef825e59c5faab935390d8"}, + {file = "docutils-0.21.1.tar.gz", hash = "sha256:65249d8a5345bc95e0f40f280ba63c98eb24de35c6c8f5b662e3e8948adea83f"}, ] [[package]] @@ -463,13 +868,13 @@ files = [ [[package]] name = "exceptiongroup" -version = "1.2.0" +version = "1.2.1" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"}, - {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"}, + {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, + {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, ] [package.extras] @@ -477,18 +882,60 @@ test = ["pytest (>=6)"] [[package]] name = "execnet" -version = "2.0.2" +version = "2.1.1" description = "execnet: rapid multi-Python deployment" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "execnet-2.0.2-py3-none-any.whl", hash = "sha256:88256416ae766bc9e8895c76a87928c0012183da3cc4fc18016e6f050e025f41"}, - {file = "execnet-2.0.2.tar.gz", hash = "sha256:cc59bc4423742fd71ad227122eb0dd44db51efb3dc4095b45ac9a08c770096af"}, + {file = "execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc"}, + {file = "execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3"}, ] [package.extras] testing = ["hatch", "pre-commit", "pytest", "tox"] +[[package]] +name = "filelock" +version = "3.13.4" +description = "A platform independent file lock." +optional = false +python-versions = ">=3.8" +files = [ + {file = "filelock-3.13.4-py3-none-any.whl", hash = "sha256:404e5e9253aa60ad457cae1be07c0f0ca90a63931200a47d9b6a6af84fd7b45f"}, + {file = "filelock-3.13.4.tar.gz", hash = "sha256:d13f466618bfde72bd2c18255e269f72542c6e70e7bac83a0232d6b1cc5c8cf4"}, +] + +[package.extras] +docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] +typing = ["typing-extensions (>=4.8)"] + +[[package]] +name = "flake8" +version = "7.0.0" +description = "the modular source code checker: pep8 pyflakes and co" +optional = false +python-versions = ">=3.8.1" +files = [ + {file = "flake8-7.0.0-py2.py3-none-any.whl", hash = "sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3"}, + {file = "flake8-7.0.0.tar.gz", hash = "sha256:33f96621059e65eec474169085dc92bf26e7b2d47366b70be2f67ab80dc25132"}, +] + +[package.dependencies] +mccabe = ">=0.7.0,<0.8.0" +pycodestyle = ">=2.11.0,<2.12.0" +pyflakes = ">=3.2.0,<3.3.0" + +[[package]] +name = "flatdict" +version = "4.0.1" +description = "Python module for interacting with nested dicts as a single level dict with delimited keys." +optional = false +python-versions = "*" +files = [ + {file = "flatdict-4.0.1.tar.gz", hash = "sha256:cd32f08fd31ed21eb09ebc76f06b6bd12046a24f77beb1fd0281917e47f26742"}, +] + [[package]] name = "frozenlist" version = "1.4.1" @@ -599,22 +1046,37 @@ files = [ [[package]] name = "importlib-metadata" -version = "7.0.1" +version = "7.1.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-7.0.1-py3-none-any.whl", hash = "sha256:4805911c3a4ec7c3966410053e9ec6a1fecd629117df5adee56dfc9432a1081e"}, - {file = "importlib_metadata-7.0.1.tar.gz", hash = "sha256:f238736bb06590ae52ac1fab06a3a9ef1d8dce2b7a35b5ab329371d6c8f5d2cc"}, + {file = "importlib_metadata-7.1.0-py3-none-any.whl", hash = "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570"}, + {file = "importlib_metadata-7.1.0.tar.gz", hash = "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2"}, ] [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] + +[[package]] +name = "importlib-resources" +version = "5.0.7" +description = "Read resources from Python packages" +optional = false +python-versions = ">=3.6" +files = [ + {file = "importlib_resources-5.0.7-py3-none-any.whl", hash = "sha256:2238159eb743bd85304a16e0536048b3e991c531d1cd51c4a834d1ccf2829057"}, + {file = "importlib_resources-5.0.7.tar.gz", hash = "sha256:4df460394562b4581bb4e4087ad9447bd433148fba44241754ec3152499f1d1b"}, +] + +[package.extras] +docs = ["jaraco.packaging (>=8.2)", "rst.linker (>=1.9)", "sphinx"] +testing = ["pytest (>=3.5,!=3.7.3)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=1.2.3)", "pytest-cov", "pytest-enabler", "pytest-flake8", "pytest-mypy"] [[package]] name = "iniconfig" @@ -658,6 +1120,41 @@ MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] +[[package]] +name = "jsonschema" +version = "4.21.1" +description = "An implementation of JSON Schema validation for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jsonschema-4.21.1-py3-none-any.whl", hash = "sha256:7996507afae316306f9e2290407761157c6f78002dcf7419acb99822143d1c6f"}, + {file = "jsonschema-4.21.1.tar.gz", hash = "sha256:85727c00279f5fa6bedbe6238d2aa6403bedd8b4864ab11207d07df3cc1b2ee5"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +jsonschema-specifications = ">=2023.03.6" +referencing = ">=0.28.4" +rpds-py = ">=0.7.1" + +[package.extras] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] + +[[package]] +name = "jsonschema-specifications" +version = "2023.12.1" +description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jsonschema_specifications-2023.12.1-py3-none-any.whl", hash = "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c"}, + {file = "jsonschema_specifications-2023.12.1.tar.gz", hash = "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc"}, +] + +[package.dependencies] +referencing = ">=0.31.0" + [[package]] name = "lazy-object-proxy" version = "1.10.0" @@ -730,71 +1227,71 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] name = "markupsafe" -version = "2.1.3" +version = "2.1.5" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.7" files = [ - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, - {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, ] [[package]] @@ -821,85 +1318,101 @@ files = [ [[package]] name = "multidict" -version = "6.0.4" +version = "6.0.5" description = "multidict implementation" optional = false python-versions = ">=3.7" files = [ - {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"}, - {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"}, - {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5"}, - {file = "multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8"}, - {file = "multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461"}, - {file = "multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636"}, - {file = "multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0"}, - {file = "multidict-6.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d"}, - {file = "multidict-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775"}, - {file = "multidict-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1"}, - {file = "multidict-6.0.4-cp38-cp38-win32.whl", hash = "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779"}, - {file = "multidict-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95"}, - {file = "multidict-6.0.4-cp39-cp39-win32.whl", hash = "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313"}, - {file = "multidict-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2"}, - {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc"}, + {file = "multidict-6.0.5-cp310-cp310-win32.whl", hash = "sha256:7afcdd1fc07befad18ec4523a782cde4e93e0a2bf71239894b8d61ee578c1319"}, + {file = "multidict-6.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:99f60d34c048c5c2fabc766108c103612344c46e35d4ed9ae0673d33c8fb26e8"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f285e862d2f153a70586579c15c44656f888806ed0e5b56b64489afe4a2dbfba"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de170c7b4fe6859beb8926e84f7d7d6c693dfe8e27372ce3b76f01c46e489fcf"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04bde7a7b3de05732a4eb39c94574db1ec99abb56162d6c520ad26f83267de29"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425bf820055005bfc8aa9a0b99ccb52cc2f4070153e34b701acc98d201693733"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d3eb1ceec286eba8220c26f3b0096cf189aea7057b6e7b7a2e60ed36b373b77f"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7901c05ead4b3fb75113fb1dd33eb1253c6d3ee37ce93305acd9d38e0b5f21a4"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e0e79d91e71b9867c73323a3444724d496c037e578a0e1755ae159ba14f4f3d1"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:29bfeb0dff5cb5fdab2023a7a9947b3b4af63e9c47cae2a10ad58394b517fddc"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e030047e85cbcedbfc073f71836d62dd5dadfbe7531cae27789ff66bc551bd5e"}, + {file = "multidict-6.0.5-cp311-cp311-win32.whl", hash = "sha256:2f4848aa3baa109e6ab81fe2006c77ed4d3cd1e0ac2c1fbddb7b1277c168788c"}, + {file = "multidict-6.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda"}, + {file = "multidict-6.0.5-cp312-cp312-win32.whl", hash = "sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5"}, + {file = "multidict-6.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556"}, + {file = "multidict-6.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:19fe01cea168585ba0f678cad6f58133db2aa14eccaf22f88e4a6dccadfad8b3"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bf7a982604375a8d49b6cc1b781c1747f243d91b81035a9b43a2126c04766f5"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:107c0cdefe028703fb5dafe640a409cb146d44a6ae201e55b35a4af8e95457dd"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:403c0911cd5d5791605808b942c88a8155c2592e05332d2bf78f18697a5fa15e"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aeaf541ddbad8311a87dd695ed9642401131ea39ad7bc8cf3ef3967fd093b626"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4972624066095e52b569e02b5ca97dbd7a7ddd4294bf4e7247d52635630dd83"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d946b0a9eb8aaa590df1fe082cee553ceab173e6cb5b03239716338629c50c7a"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b55358304d7a73d7bdf5de62494aaf70bd33015831ffd98bc498b433dfe5b10c"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:a3145cb08d8625b2d3fee1b2d596a8766352979c9bffe5d7833e0503d0f0b5e5"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d65f25da8e248202bd47445cec78e0025c0fe7582b23ec69c3b27a640dd7a8e3"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c9bf56195c6bbd293340ea82eafd0071cb3d450c703d2c93afb89f93b8386ccc"}, + {file = "multidict-6.0.5-cp37-cp37m-win32.whl", hash = "sha256:69db76c09796b313331bb7048229e3bee7928eb62bab5e071e9f7fcc4879caee"}, + {file = "multidict-6.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:fce28b3c8a81b6b36dfac9feb1de115bab619b3c13905b419ec71d03a3fc1423"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76f067f5121dcecf0d63a67f29080b26c43c71a98b10c701b0677e4a065fbd54"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b82cc8ace10ab5bd93235dfaab2021c70637005e1ac787031f4d1da63d493c1d"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5cb241881eefd96b46f89b1a056187ea8e9ba14ab88ba632e68d7a2ecb7aadf7"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8e94e6912639a02ce173341ff62cc1201232ab86b8a8fcc05572741a5dc7d93"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09a892e4a9fb47331da06948690ae38eaa2426de97b4ccbfafbdcbe5c8f37ff8"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55205d03e8a598cfc688c71ca8ea5f66447164efff8869517f175ea632c7cb7b"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37b15024f864916b4951adb95d3a80c9431299080341ab9544ed148091b53f50"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2a1dee728b52b33eebff5072817176c172050d44d67befd681609b4746e1c2e"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:edd08e6f2f1a390bf137080507e44ccc086353c8e98c657e666c017718561b89"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:60d698e8179a42ec85172d12f50b1668254628425a6bd611aba022257cac1386"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:3d25f19500588cbc47dc19081d78131c32637c25804df8414463ec908631e453"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4cc0ef8b962ac7a5e62b9e826bd0cd5040e7d401bc45a6835910ed699037a461"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:eca2e9d0cc5a889850e9bbd68e98314ada174ff6ccd1129500103df7a94a7a44"}, + {file = "multidict-6.0.5-cp38-cp38-win32.whl", hash = "sha256:4a6a4f196f08c58c59e0b8ef8ec441d12aee4125a7d4f4fef000ccb22f8d7241"}, + {file = "multidict-6.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:0275e35209c27a3f7951e1ce7aaf93ce0d163b28948444bec61dd7badc6d3f8c"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e7be68734bd8c9a513f2b0cfd508802d6609da068f40dc57d4e3494cefc92929"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1d9ea7a7e779d7a3561aade7d596649fbecfa5c08a7674b11b423783217933f9"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ea1456df2a27c73ce51120fa2f519f1bea2f4a03a917f4a43c8707cf4cbbae1a"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf590b134eb70629e350691ecca88eac3e3b8b3c86992042fb82e3cb1830d5e1"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5c0631926c4f58e9a5ccce555ad7747d9a9f8b10619621f22f9635f069f6233e"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dce1c6912ab9ff5f179eaf6efe7365c1f425ed690b03341911bf4939ef2f3046"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0868d64af83169e4d4152ec612637a543f7a336e4a307b119e98042e852ad9c"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:141b43360bfd3bdd75f15ed811850763555a251e38b2405967f8e25fb43f7d40"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7df704ca8cf4a073334e0427ae2345323613e4df18cc224f647f251e5e75a527"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6214c5a5571802c33f80e6c84713b2c79e024995b9c5897f794b43e714daeec9"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:cd6c8fca38178e12c00418de737aef1261576bd1b6e8c6134d3e729a4e858b38"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e02021f87a5b6932fa6ce916ca004c4d441509d33bbdbeca70d05dff5e9d2479"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ebd8d160f91a764652d3e51ce0d2956b38efe37c9231cd82cfc0bed2e40b581c"}, + {file = "multidict-6.0.5-cp39-cp39-win32.whl", hash = "sha256:04da1bb8c8dbadf2a18a452639771951c662c5ad03aefe4884775454be322c9b"}, + {file = "multidict-6.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:d6f6d4f185481c9669b9447bf9d9cf3b95a0e9df9d169bbc17e363b7d5487755"}, + {file = "multidict-6.0.5-py3-none-any.whl", hash = "sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7"}, + {file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"}, ] [[package]] @@ -915,24 +1428,27 @@ files = [ [[package]] name = "netaddr" -version = "0.9.0" +version = "1.2.1" description = "A network address manipulation library for Python" optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "netaddr-0.9.0-py3-none-any.whl", hash = "sha256:5148b1055679d2a1ec070c521b7db82137887fabd6d7e37f5199b44f775c3bb1"}, - {file = "netaddr-0.9.0.tar.gz", hash = "sha256:7b46fa9b1a2d71fd5de9e4a3784ef339700a53a08c8040f08baf5f1194da0128"}, + {file = "netaddr-1.2.1-py3-none-any.whl", hash = "sha256:bd9e9534b0d46af328cf64f0e5a23a5a43fca292df221c85580b27394793496e"}, + {file = "netaddr-1.2.1.tar.gz", hash = "sha256:6eb8fedf0412c6d294d06885c110de945cf4d22d2b510d0404f4e06950857987"}, ] +[package.extras] +nicer-shell = ["ipython"] + [[package]] name = "packaging" -version = "23.2" +version = "24.0" description = "Core utilities for Python packages" optional = false python-versions = ">=3.7" files = [ - {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, - {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, + {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, + {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, ] [[package]] @@ -946,30 +1462,41 @@ files = [ {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, ] +[[package]] +name = "perky" +version = "0.9.2" +description = "A simple, Pythonic file format. Same interface as the" +optional = false +python-versions = ">=3.6" +files = [ + {file = "perky-0.9.2-py3-none-any.whl", hash = "sha256:bd1a3e2ebeedc611dcba6e01d6bf3fab872782e606bee4acbdceae7b19877192"}, + {file = "perky-0.9.2.tar.gz", hash = "sha256:02e5ebe84c5beaff6c8254497c75793b7dbaca903941c82035958ddb1bb66178"}, +] + [[package]] name = "platformdirs" -version = "4.1.0" +version = "4.2.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." optional = false python-versions = ">=3.8" files = [ - {file = "platformdirs-4.1.0-py3-none-any.whl", hash = "sha256:11c8f37bcca40db96d8144522d925583bdb7a31f7b0e37e3ed4318400a8e2380"}, - {file = "platformdirs-4.1.0.tar.gz", hash = "sha256:906d548203468492d432bcb294d4bc2fff751bf84971fbb2c10918cc206ee420"}, + {file = "platformdirs-4.2.0-py3-none-any.whl", hash = "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068"}, + {file = "platformdirs-4.2.0.tar.gz", hash = "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768"}, ] [package.extras] -docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] +docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] [[package]] name = "pluggy" -version = "1.3.0" +version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" files = [ - {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, - {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, ] [package.extras] @@ -987,20 +1514,83 @@ files = [ {file = "pycodestyle-2.11.1.tar.gz", hash = "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f"}, ] +[[package]] +name = "pycountry" +version = "23.12.11" +description = "ISO country, subdivision, language, currency and script definitions and their translations" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pycountry-23.12.11-py3-none-any.whl", hash = "sha256:2ff91cff4f40ff61086e773d61e72005fe95de4a57bfc765509db05695dc50ab"}, + {file = "pycountry-23.12.11.tar.gz", hash = "sha256:00569d82eaefbc6a490a311bfa84a9c571cff9ddbf8b0a4f4e7b4f868b4ad925"}, +] + +[[package]] +name = "pycparser" +version = "2.22" +description = "C parser in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, +] + +[[package]] +name = "pycryptodomex" +version = "3.20.0" +description = "Cryptographic library for Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "pycryptodomex-3.20.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:645bd4ca6f543685d643dadf6a856cc382b654cc923460e3a10a49c1b3832aeb"}, + {file = "pycryptodomex-3.20.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ff5c9a67f8a4fba4aed887216e32cbc48f2a6fb2673bb10a99e43be463e15913"}, + {file = "pycryptodomex-3.20.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:8ee606964553c1a0bc74057dd8782a37d1c2bc0f01b83193b6f8bb14523b877b"}, + {file = "pycryptodomex-3.20.0-cp27-cp27m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7805830e0c56d88f4d491fa5ac640dfc894c5ec570d1ece6ed1546e9df2e98d6"}, + {file = "pycryptodomex-3.20.0-cp27-cp27m-musllinux_1_1_aarch64.whl", hash = "sha256:bc3ee1b4d97081260d92ae813a83de4d2653206967c4a0a017580f8b9548ddbc"}, + {file = "pycryptodomex-3.20.0-cp27-cp27m-win32.whl", hash = "sha256:8af1a451ff9e123d0d8bd5d5e60f8e3315c3a64f3cdd6bc853e26090e195cdc8"}, + {file = "pycryptodomex-3.20.0-cp27-cp27m-win_amd64.whl", hash = "sha256:cbe71b6712429650e3883dc81286edb94c328ffcd24849accac0a4dbcc76958a"}, + {file = "pycryptodomex-3.20.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:76bd15bb65c14900d98835fcd10f59e5e0435077431d3a394b60b15864fddd64"}, + {file = "pycryptodomex-3.20.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:653b29b0819605fe0898829c8ad6400a6ccde096146730c2da54eede9b7b8baa"}, + {file = "pycryptodomex-3.20.0-cp27-cp27mu-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62a5ec91388984909bb5398ea49ee61b68ecb579123694bffa172c3b0a107079"}, + {file = "pycryptodomex-3.20.0-cp27-cp27mu-musllinux_1_1_aarch64.whl", hash = "sha256:108e5f1c1cd70ffce0b68739c75734437c919d2eaec8e85bffc2c8b4d2794305"}, + {file = "pycryptodomex-3.20.0-cp35-abi3-macosx_10_9_universal2.whl", hash = "sha256:59af01efb011b0e8b686ba7758d59cf4a8263f9ad35911bfe3f416cee4f5c08c"}, + {file = "pycryptodomex-3.20.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:82ee7696ed8eb9a82c7037f32ba9b7c59e51dda6f105b39f043b6ef293989cb3"}, + {file = "pycryptodomex-3.20.0-cp35-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91852d4480a4537d169c29a9d104dda44094c78f1f5b67bca76c29a91042b623"}, + {file = "pycryptodomex-3.20.0-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bca649483d5ed251d06daf25957f802e44e6bb6df2e8f218ae71968ff8f8edc4"}, + {file = "pycryptodomex-3.20.0-cp35-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e186342cfcc3aafaad565cbd496060e5a614b441cacc3995ef0091115c1f6c5"}, + {file = "pycryptodomex-3.20.0-cp35-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:25cd61e846aaab76d5791d006497134602a9e451e954833018161befc3b5b9ed"}, + {file = "pycryptodomex-3.20.0-cp35-abi3-musllinux_1_1_i686.whl", hash = "sha256:9c682436c359b5ada67e882fec34689726a09c461efd75b6ea77b2403d5665b7"}, + {file = "pycryptodomex-3.20.0-cp35-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:7a7a8f33a1f1fb762ede6cc9cbab8f2a9ba13b196bfaf7bc6f0b39d2ba315a43"}, + {file = "pycryptodomex-3.20.0-cp35-abi3-win32.whl", hash = "sha256:c39778fd0548d78917b61f03c1fa8bfda6cfcf98c767decf360945fe6f97461e"}, + {file = "pycryptodomex-3.20.0-cp35-abi3-win_amd64.whl", hash = "sha256:2a47bcc478741b71273b917232f521fd5704ab4b25d301669879e7273d3586cc"}, + {file = "pycryptodomex-3.20.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:1be97461c439a6af4fe1cf8bf6ca5936d3db252737d2f379cc6b2e394e12a458"}, + {file = "pycryptodomex-3.20.0-pp27-pypy_73-win32.whl", hash = "sha256:19764605feea0df966445d46533729b645033f134baeb3ea26ad518c9fdf212c"}, + {file = "pycryptodomex-3.20.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f2e497413560e03421484189a6b65e33fe800d3bd75590e6d78d4dfdb7accf3b"}, + {file = "pycryptodomex-3.20.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e48217c7901edd95f9f097feaa0388da215ed14ce2ece803d3f300b4e694abea"}, + {file = "pycryptodomex-3.20.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d00fe8596e1cc46b44bf3907354e9377aa030ec4cd04afbbf6e899fc1e2a7781"}, + {file = "pycryptodomex-3.20.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:88afd7a3af7ddddd42c2deda43d53d3dfc016c11327d0915f90ca34ebda91499"}, + {file = "pycryptodomex-3.20.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d3584623e68a5064a04748fb6d76117a21a7cb5eaba20608a41c7d0c61721794"}, + {file = "pycryptodomex-3.20.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0daad007b685db36d977f9de73f61f8da2a7104e20aca3effd30752fd56f73e1"}, + {file = "pycryptodomex-3.20.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5dcac11031a71348faaed1f403a0debd56bf5404232284cf8c761ff918886ebc"}, + {file = "pycryptodomex-3.20.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:69138068268127cd605e03438312d8f271135a33140e2742b417d027a0539427"}, + {file = "pycryptodomex-3.20.0.tar.gz", hash = "sha256:7a710b79baddd65b806402e14766c721aee8fb83381769c27920f26476276c1e"}, +] + [[package]] name = "pydantic" -version = "2.5.3" +version = "2.7.0" description = "Data validation using Python type hints" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pydantic-2.5.3-py3-none-any.whl", hash = "sha256:d0caf5954bee831b6bfe7e338c32b9e30c85dfe080c843680783ac2b631673b4"}, - {file = "pydantic-2.5.3.tar.gz", hash = "sha256:b3ef57c62535b0941697cce638c08900d87fcb67e29cfa99e8a68f747f393f7a"}, + {file = "pydantic-2.7.0-py3-none-any.whl", hash = "sha256:9dee74a271705f14f9a1567671d144a851c675b072736f0a7b2608fd9e495352"}, + {file = "pydantic-2.7.0.tar.gz", hash = "sha256:b5ecdd42262ca2462e2624793551e80911a1e989f462910bb81aef974b4bb383"}, ] [package.dependencies] annotated-types = ">=0.4.0" -pydantic-core = "2.14.6" +pydantic-core = "2.18.1" typing-extensions = ">=4.6.1" [package.extras] @@ -1008,121 +1598,123 @@ email = ["email-validator (>=2.0.0)"] [[package]] name = "pydantic-core" -version = "2.14.6" -description = "" +version = "2.18.1" +description = "Core functionality for Pydantic validation and serialization" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.14.6-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:72f9a942d739f09cd42fffe5dc759928217649f070056f03c70df14f5770acf9"}, - {file = "pydantic_core-2.14.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6a31d98c0d69776c2576dda4b77b8e0c69ad08e8b539c25c7d0ca0dc19a50d6c"}, - {file = "pydantic_core-2.14.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5aa90562bc079c6c290f0512b21768967f9968e4cfea84ea4ff5af5d917016e4"}, - {file = "pydantic_core-2.14.6-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:370ffecb5316ed23b667d99ce4debe53ea664b99cc37bfa2af47bc769056d534"}, - {file = "pydantic_core-2.14.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f85f3843bdb1fe80e8c206fe6eed7a1caeae897e496542cee499c374a85c6e08"}, - {file = "pydantic_core-2.14.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9862bf828112e19685b76ca499b379338fd4c5c269d897e218b2ae8fcb80139d"}, - {file = "pydantic_core-2.14.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:036137b5ad0cb0004c75b579445a1efccd072387a36c7f217bb8efd1afbe5245"}, - {file = "pydantic_core-2.14.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:92879bce89f91f4b2416eba4429c7b5ca22c45ef4a499c39f0c5c69257522c7c"}, - {file = "pydantic_core-2.14.6-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0c08de15d50fa190d577e8591f0329a643eeaed696d7771760295998aca6bc66"}, - {file = "pydantic_core-2.14.6-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:36099c69f6b14fc2c49d7996cbf4f87ec4f0e66d1c74aa05228583225a07b590"}, - {file = "pydantic_core-2.14.6-cp310-none-win32.whl", hash = "sha256:7be719e4d2ae6c314f72844ba9d69e38dff342bc360379f7c8537c48e23034b7"}, - {file = "pydantic_core-2.14.6-cp310-none-win_amd64.whl", hash = "sha256:36fa402dcdc8ea7f1b0ddcf0df4254cc6b2e08f8cd80e7010d4c4ae6e86b2a87"}, - {file = "pydantic_core-2.14.6-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:dea7fcd62915fb150cdc373212141a30037e11b761fbced340e9db3379b892d4"}, - {file = "pydantic_core-2.14.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ffff855100bc066ff2cd3aa4a60bc9534661816b110f0243e59503ec2df38421"}, - {file = "pydantic_core-2.14.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b027c86c66b8627eb90e57aee1f526df77dc6d8b354ec498be9a757d513b92b"}, - {file = "pydantic_core-2.14.6-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:00b1087dabcee0b0ffd104f9f53d7d3eaddfaa314cdd6726143af6bc713aa27e"}, - {file = "pydantic_core-2.14.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:75ec284328b60a4e91010c1acade0c30584f28a1f345bc8f72fe8b9e46ec6a96"}, - {file = "pydantic_core-2.14.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7e1f4744eea1501404b20b0ac059ff7e3f96a97d3e3f48ce27a139e053bb370b"}, - {file = "pydantic_core-2.14.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2602177668f89b38b9f84b7b3435d0a72511ddef45dc14446811759b82235a1"}, - {file = "pydantic_core-2.14.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6c8edaea3089bf908dd27da8f5d9e395c5b4dc092dbcce9b65e7156099b4b937"}, - {file = "pydantic_core-2.14.6-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:478e9e7b360dfec451daafe286998d4a1eeaecf6d69c427b834ae771cad4b622"}, - {file = "pydantic_core-2.14.6-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b6ca36c12a5120bad343eef193cc0122928c5c7466121da7c20f41160ba00ba2"}, - {file = "pydantic_core-2.14.6-cp311-none-win32.whl", hash = "sha256:2b8719037e570639e6b665a4050add43134d80b687288ba3ade18b22bbb29dd2"}, - {file = "pydantic_core-2.14.6-cp311-none-win_amd64.whl", hash = "sha256:78ee52ecc088c61cce32b2d30a826f929e1708f7b9247dc3b921aec367dc1b23"}, - {file = "pydantic_core-2.14.6-cp311-none-win_arm64.whl", hash = "sha256:a19b794f8fe6569472ff77602437ec4430f9b2b9ec7a1105cfd2232f9ba355e6"}, - {file = "pydantic_core-2.14.6-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:667aa2eac9cd0700af1ddb38b7b1ef246d8cf94c85637cbb03d7757ca4c3fdec"}, - {file = "pydantic_core-2.14.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cdee837710ef6b56ebd20245b83799fce40b265b3b406e51e8ccc5b85b9099b7"}, - {file = "pydantic_core-2.14.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c5bcf3414367e29f83fd66f7de64509a8fd2368b1edf4351e862910727d3e51"}, - {file = "pydantic_core-2.14.6-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:26a92ae76f75d1915806b77cf459811e772d8f71fd1e4339c99750f0e7f6324f"}, - {file = "pydantic_core-2.14.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a983cca5ed1dd9a35e9e42ebf9f278d344603bfcb174ff99a5815f953925140a"}, - {file = "pydantic_core-2.14.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cb92f9061657287eded380d7dc455bbf115430b3aa4741bdc662d02977e7d0af"}, - {file = "pydantic_core-2.14.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4ace1e220b078c8e48e82c081e35002038657e4b37d403ce940fa679e57113b"}, - {file = "pydantic_core-2.14.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ef633add81832f4b56d3b4c9408b43d530dfca29e68fb1b797dcb861a2c734cd"}, - {file = "pydantic_core-2.14.6-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7e90d6cc4aad2cc1f5e16ed56e46cebf4877c62403a311af20459c15da76fd91"}, - {file = "pydantic_core-2.14.6-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e8a5ac97ea521d7bde7621d86c30e86b798cdecd985723c4ed737a2aa9e77d0c"}, - {file = "pydantic_core-2.14.6-cp312-none-win32.whl", hash = "sha256:f27207e8ca3e5e021e2402ba942e5b4c629718e665c81b8b306f3c8b1ddbb786"}, - {file = "pydantic_core-2.14.6-cp312-none-win_amd64.whl", hash = "sha256:b3e5fe4538001bb82e2295b8d2a39356a84694c97cb73a566dc36328b9f83b40"}, - {file = "pydantic_core-2.14.6-cp312-none-win_arm64.whl", hash = "sha256:64634ccf9d671c6be242a664a33c4acf12882670b09b3f163cd00a24cffbd74e"}, - {file = "pydantic_core-2.14.6-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:24368e31be2c88bd69340fbfe741b405302993242ccb476c5c3ff48aeee1afe0"}, - {file = "pydantic_core-2.14.6-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:e33b0834f1cf779aa839975f9d8755a7c2420510c0fa1e9fa0497de77cd35d2c"}, - {file = "pydantic_core-2.14.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6af4b3f52cc65f8a0bc8b1cd9676f8c21ef3e9132f21fed250f6958bd7223bed"}, - {file = "pydantic_core-2.14.6-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d15687d7d7f40333bd8266f3814c591c2e2cd263fa2116e314f60d82086e353a"}, - {file = "pydantic_core-2.14.6-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:095b707bb287bfd534044166ab767bec70a9bba3175dcdc3371782175c14e43c"}, - {file = "pydantic_core-2.14.6-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94fc0e6621e07d1e91c44e016cc0b189b48db053061cc22d6298a611de8071bb"}, - {file = "pydantic_core-2.14.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ce830e480f6774608dedfd4a90c42aac4a7af0a711f1b52f807130c2e434c06"}, - {file = "pydantic_core-2.14.6-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a306cdd2ad3a7d795d8e617a58c3a2ed0f76c8496fb7621b6cd514eb1532cae8"}, - {file = "pydantic_core-2.14.6-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:2f5fa187bde8524b1e37ba894db13aadd64faa884657473b03a019f625cee9a8"}, - {file = "pydantic_core-2.14.6-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:438027a975cc213a47c5d70672e0d29776082155cfae540c4e225716586be75e"}, - {file = "pydantic_core-2.14.6-cp37-none-win32.whl", hash = "sha256:f96ae96a060a8072ceff4cfde89d261837b4294a4f28b84a28765470d502ccc6"}, - {file = "pydantic_core-2.14.6-cp37-none-win_amd64.whl", hash = "sha256:e646c0e282e960345314f42f2cea5e0b5f56938c093541ea6dbf11aec2862391"}, - {file = "pydantic_core-2.14.6-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:db453f2da3f59a348f514cfbfeb042393b68720787bbef2b4c6068ea362c8149"}, - {file = "pydantic_core-2.14.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3860c62057acd95cc84044e758e47b18dcd8871a328ebc8ccdefd18b0d26a21b"}, - {file = "pydantic_core-2.14.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36026d8f99c58d7044413e1b819a67ca0e0b8ebe0f25e775e6c3d1fabb3c38fb"}, - {file = "pydantic_core-2.14.6-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8ed1af8692bd8d2a29d702f1a2e6065416d76897d726e45a1775b1444f5928a7"}, - {file = "pydantic_core-2.14.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:314ccc4264ce7d854941231cf71b592e30d8d368a71e50197c905874feacc8a8"}, - {file = "pydantic_core-2.14.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:982487f8931067a32e72d40ab6b47b1628a9c5d344be7f1a4e668fb462d2da42"}, - {file = "pydantic_core-2.14.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dbe357bc4ddda078f79d2a36fc1dd0494a7f2fad83a0a684465b6f24b46fe80"}, - {file = "pydantic_core-2.14.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2f6ffc6701a0eb28648c845f4945a194dc7ab3c651f535b81793251e1185ac3d"}, - {file = "pydantic_core-2.14.6-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7f5025db12fc6de7bc1104d826d5aee1d172f9ba6ca936bf6474c2148ac336c1"}, - {file = "pydantic_core-2.14.6-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:dab03ed811ed1c71d700ed08bde8431cf429bbe59e423394f0f4055f1ca0ea60"}, - {file = "pydantic_core-2.14.6-cp38-none-win32.whl", hash = "sha256:dfcbebdb3c4b6f739a91769aea5ed615023f3c88cb70df812849aef634c25fbe"}, - {file = "pydantic_core-2.14.6-cp38-none-win_amd64.whl", hash = "sha256:99b14dbea2fdb563d8b5a57c9badfcd72083f6006caf8e126b491519c7d64ca8"}, - {file = "pydantic_core-2.14.6-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:4ce8299b481bcb68e5c82002b96e411796b844d72b3e92a3fbedfe8e19813eab"}, - {file = "pydantic_core-2.14.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b9a9d92f10772d2a181b5ca339dee066ab7d1c9a34ae2421b2a52556e719756f"}, - {file = "pydantic_core-2.14.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd9e98b408384989ea4ab60206b8e100d8687da18b5c813c11e92fd8212a98e0"}, - {file = "pydantic_core-2.14.6-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4f86f1f318e56f5cbb282fe61eb84767aee743ebe32c7c0834690ebea50c0a6b"}, - {file = "pydantic_core-2.14.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86ce5fcfc3accf3a07a729779d0b86c5d0309a4764c897d86c11089be61da160"}, - {file = "pydantic_core-2.14.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dcf1978be02153c6a31692d4fbcc2a3f1db9da36039ead23173bc256ee3b91b"}, - {file = "pydantic_core-2.14.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eedf97be7bc3dbc8addcef4142f4b4164066df0c6f36397ae4aaed3eb187d8ab"}, - {file = "pydantic_core-2.14.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d5f916acf8afbcab6bacbb376ba7dc61f845367901ecd5e328fc4d4aef2fcab0"}, - {file = "pydantic_core-2.14.6-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:8a14c192c1d724c3acbfb3f10a958c55a2638391319ce8078cb36c02283959b9"}, - {file = "pydantic_core-2.14.6-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0348b1dc6b76041516e8a854ff95b21c55f5a411c3297d2ca52f5528e49d8411"}, - {file = "pydantic_core-2.14.6-cp39-none-win32.whl", hash = "sha256:de2a0645a923ba57c5527497daf8ec5df69c6eadf869e9cd46e86349146e5975"}, - {file = "pydantic_core-2.14.6-cp39-none-win_amd64.whl", hash = "sha256:aca48506a9c20f68ee61c87f2008f81f8ee99f8d7f0104bff3c47e2d148f89d9"}, - {file = "pydantic_core-2.14.6-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:d5c28525c19f5bb1e09511669bb57353d22b94cf8b65f3a8d141c389a55dec95"}, - {file = "pydantic_core-2.14.6-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:78d0768ee59baa3de0f4adac9e3748b4b1fffc52143caebddfd5ea2961595277"}, - {file = "pydantic_core-2.14.6-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b93785eadaef932e4fe9c6e12ba67beb1b3f1e5495631419c784ab87e975670"}, - {file = "pydantic_core-2.14.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a874f21f87c485310944b2b2734cd6d318765bcbb7515eead33af9641816506e"}, - {file = "pydantic_core-2.14.6-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b89f4477d915ea43b4ceea6756f63f0288941b6443a2b28c69004fe07fde0d0d"}, - {file = "pydantic_core-2.14.6-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:172de779e2a153d36ee690dbc49c6db568d7b33b18dc56b69a7514aecbcf380d"}, - {file = "pydantic_core-2.14.6-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:dfcebb950aa7e667ec226a442722134539e77c575f6cfaa423f24371bb8d2e94"}, - {file = "pydantic_core-2.14.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:55a23dcd98c858c0db44fc5c04fc7ed81c4b4d33c653a7c45ddaebf6563a2f66"}, - {file = "pydantic_core-2.14.6-pp37-pypy37_pp73-macosx_10_7_x86_64.whl", hash = "sha256:4241204e4b36ab5ae466ecec5c4c16527a054c69f99bba20f6f75232a6a534e2"}, - {file = "pydantic_core-2.14.6-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e574de99d735b3fc8364cba9912c2bec2da78775eba95cbb225ef7dda6acea24"}, - {file = "pydantic_core-2.14.6-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1302a54f87b5cd8528e4d6d1bf2133b6aa7c6122ff8e9dc5220fbc1e07bffebd"}, - {file = "pydantic_core-2.14.6-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f8e81e4b55930e5ffab4a68db1af431629cf2e4066dbdbfef65348b8ab804ea8"}, - {file = "pydantic_core-2.14.6-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:c99462ffc538717b3e60151dfaf91125f637e801f5ab008f81c402f1dff0cd0f"}, - {file = "pydantic_core-2.14.6-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e4cf2d5829f6963a5483ec01578ee76d329eb5caf330ecd05b3edd697e7d768a"}, - {file = "pydantic_core-2.14.6-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:cf10b7d58ae4a1f07fccbf4a0a956d705356fea05fb4c70608bb6fa81d103cda"}, - {file = "pydantic_core-2.14.6-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:399ac0891c284fa8eb998bcfa323f2234858f5d2efca3950ae58c8f88830f145"}, - {file = "pydantic_core-2.14.6-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c6a5c79b28003543db3ba67d1df336f253a87d3112dac3a51b94f7d48e4c0e1"}, - {file = "pydantic_core-2.14.6-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:599c87d79cab2a6a2a9df4aefe0455e61e7d2aeede2f8577c1b7c0aec643ee8e"}, - {file = "pydantic_core-2.14.6-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:43e166ad47ba900f2542a80d83f9fc65fe99eb63ceec4debec160ae729824052"}, - {file = "pydantic_core-2.14.6-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3a0b5db001b98e1c649dd55afa928e75aa4087e587b9524a4992316fa23c9fba"}, - {file = "pydantic_core-2.14.6-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:747265448cb57a9f37572a488a57d873fd96bf51e5bb7edb52cfb37124516da4"}, - {file = "pydantic_core-2.14.6-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:7ebe3416785f65c28f4f9441e916bfc8a54179c8dea73c23023f7086fa601c5d"}, - {file = "pydantic_core-2.14.6-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:86c963186ca5e50d5c8287b1d1c9d3f8f024cbe343d048c5bd282aec2d8641f2"}, - {file = "pydantic_core-2.14.6-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:e0641b506486f0b4cd1500a2a65740243e8670a2549bb02bc4556a83af84ae03"}, - {file = "pydantic_core-2.14.6-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71d72ca5eaaa8d38c8df16b7deb1a2da4f650c41b58bb142f3fb75d5ad4a611f"}, - {file = "pydantic_core-2.14.6-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:27e524624eace5c59af499cd97dc18bb201dc6a7a2da24bfc66ef151c69a5f2a"}, - {file = "pydantic_core-2.14.6-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a3dde6cac75e0b0902778978d3b1646ca9f438654395a362cb21d9ad34b24acf"}, - {file = "pydantic_core-2.14.6-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:00646784f6cd993b1e1c0e7b0fdcbccc375d539db95555477771c27555e3c556"}, - {file = "pydantic_core-2.14.6-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:23598acb8ccaa3d1d875ef3b35cb6376535095e9405d91a3d57a8c7db5d29341"}, - {file = "pydantic_core-2.14.6-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7f41533d7e3cf9520065f610b41ac1c76bc2161415955fbcead4981b22c7611e"}, - {file = "pydantic_core-2.14.6.tar.gz", hash = "sha256:1fd0c1d395372843fba13a51c28e3bb9d59bd7aebfeb17358ffaaa1e4dbbe948"}, + {file = "pydantic_core-2.18.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:ee9cf33e7fe14243f5ca6977658eb7d1042caaa66847daacbd2117adb258b226"}, + {file = "pydantic_core-2.18.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6b7bbb97d82659ac8b37450c60ff2e9f97e4eb0f8a8a3645a5568b9334b08b50"}, + {file = "pydantic_core-2.18.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df4249b579e75094f7e9bb4bd28231acf55e308bf686b952f43100a5a0be394c"}, + {file = "pydantic_core-2.18.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d0491006a6ad20507aec2be72e7831a42efc93193d2402018007ff827dc62926"}, + {file = "pydantic_core-2.18.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ae80f72bb7a3e397ab37b53a2b49c62cc5496412e71bc4f1277620a7ce3f52b"}, + {file = "pydantic_core-2.18.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:58aca931bef83217fca7a390e0486ae327c4af9c3e941adb75f8772f8eeb03a1"}, + {file = "pydantic_core-2.18.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1be91ad664fc9245404a789d60cba1e91c26b1454ba136d2a1bf0c2ac0c0505a"}, + {file = "pydantic_core-2.18.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:667880321e916a8920ef49f5d50e7983792cf59f3b6079f3c9dac2b88a311d17"}, + {file = "pydantic_core-2.18.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f7054fdc556f5421f01e39cbb767d5ec5c1139ea98c3e5b350e02e62201740c7"}, + {file = "pydantic_core-2.18.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:030e4f9516f9947f38179249778709a460a3adb516bf39b5eb9066fcfe43d0e6"}, + {file = "pydantic_core-2.18.1-cp310-none-win32.whl", hash = "sha256:2e91711e36e229978d92642bfc3546333a9127ecebb3f2761372e096395fc649"}, + {file = "pydantic_core-2.18.1-cp310-none-win_amd64.whl", hash = "sha256:9a29726f91c6cb390b3c2338f0df5cd3e216ad7a938762d11c994bb37552edb0"}, + {file = "pydantic_core-2.18.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:9ece8a49696669d483d206b4474c367852c44815fca23ac4e48b72b339807f80"}, + {file = "pydantic_core-2.18.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7a5d83efc109ceddb99abd2c1316298ced2adb4570410defe766851a804fcd5b"}, + {file = "pydantic_core-2.18.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f7973c381283783cd1043a8c8f61ea5ce7a3a58b0369f0ee0ee975eaf2f2a1b"}, + {file = "pydantic_core-2.18.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:54c7375c62190a7845091f521add19b0f026bcf6ae674bdb89f296972272e86d"}, + {file = "pydantic_core-2.18.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd63cec4e26e790b70544ae5cc48d11b515b09e05fdd5eff12e3195f54b8a586"}, + {file = "pydantic_core-2.18.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:561cf62c8a3498406495cfc49eee086ed2bb186d08bcc65812b75fda42c38294"}, + {file = "pydantic_core-2.18.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68717c38a68e37af87c4da20e08f3e27d7e4212e99e96c3d875fbf3f4812abfc"}, + {file = "pydantic_core-2.18.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2d5728e93d28a3c63ee513d9ffbac9c5989de8c76e049dbcb5bfe4b923a9739d"}, + {file = "pydantic_core-2.18.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f0f17814c505f07806e22b28856c59ac80cee7dd0fbb152aed273e116378f519"}, + {file = "pydantic_core-2.18.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d816f44a51ba5175394bc6c7879ca0bd2be560b2c9e9f3411ef3a4cbe644c2e9"}, + {file = "pydantic_core-2.18.1-cp311-none-win32.whl", hash = "sha256:09f03dfc0ef8c22622eaa8608caa4a1e189cfb83ce847045eca34f690895eccb"}, + {file = "pydantic_core-2.18.1-cp311-none-win_amd64.whl", hash = "sha256:27f1009dc292f3b7ca77feb3571c537276b9aad5dd4efb471ac88a8bd09024e9"}, + {file = "pydantic_core-2.18.1-cp311-none-win_arm64.whl", hash = "sha256:48dd883db92e92519201f2b01cafa881e5f7125666141a49ffba8b9facc072b0"}, + {file = "pydantic_core-2.18.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b6b0e4912030c6f28bcb72b9ebe4989d6dc2eebcd2a9cdc35fefc38052dd4fe8"}, + {file = "pydantic_core-2.18.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f3202a429fe825b699c57892d4371c74cc3456d8d71b7f35d6028c96dfecad31"}, + {file = "pydantic_core-2.18.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3982b0a32d0a88b3907e4b0dc36809fda477f0757c59a505d4e9b455f384b8b"}, + {file = "pydantic_core-2.18.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25595ac311f20e5324d1941909b0d12933f1fd2171075fcff763e90f43e92a0d"}, + {file = "pydantic_core-2.18.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:14fe73881cf8e4cbdaded8ca0aa671635b597e42447fec7060d0868b52d074e6"}, + {file = "pydantic_core-2.18.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca976884ce34070799e4dfc6fbd68cb1d181db1eefe4a3a94798ddfb34b8867f"}, + {file = "pydantic_core-2.18.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:684d840d2c9ec5de9cb397fcb3f36d5ebb6fa0d94734f9886032dd796c1ead06"}, + {file = "pydantic_core-2.18.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:54764c083bbe0264f0f746cefcded6cb08fbbaaf1ad1d78fb8a4c30cff999a90"}, + {file = "pydantic_core-2.18.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:201713f2f462e5c015b343e86e68bd8a530a4f76609b33d8f0ec65d2b921712a"}, + {file = "pydantic_core-2.18.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fd1a9edb9dd9d79fbeac1ea1f9a8dd527a6113b18d2e9bcc0d541d308dae639b"}, + {file = "pydantic_core-2.18.1-cp312-none-win32.whl", hash = "sha256:d5e6b7155b8197b329dc787356cfd2684c9d6a6b1a197f6bbf45f5555a98d411"}, + {file = "pydantic_core-2.18.1-cp312-none-win_amd64.whl", hash = "sha256:9376d83d686ec62e8b19c0ac3bf8d28d8a5981d0df290196fb6ef24d8a26f0d6"}, + {file = "pydantic_core-2.18.1-cp312-none-win_arm64.whl", hash = "sha256:c562b49c96906b4029b5685075fe1ebd3b5cc2601dfa0b9e16c2c09d6cbce048"}, + {file = "pydantic_core-2.18.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:3e352f0191d99fe617371096845070dee295444979efb8f27ad941227de6ad09"}, + {file = "pydantic_core-2.18.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c0295d52b012cbe0d3059b1dba99159c3be55e632aae1999ab74ae2bd86a33d7"}, + {file = "pydantic_core-2.18.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56823a92075780582d1ffd4489a2e61d56fd3ebb4b40b713d63f96dd92d28144"}, + {file = "pydantic_core-2.18.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:dd3f79e17b56741b5177bcc36307750d50ea0698df6aa82f69c7db32d968c1c2"}, + {file = "pydantic_core-2.18.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38a5024de321d672a132b1834a66eeb7931959c59964b777e8f32dbe9523f6b1"}, + {file = "pydantic_core-2.18.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d2ce426ee691319d4767748c8e0895cfc56593d725594e415f274059bcf3cb76"}, + {file = "pydantic_core-2.18.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2adaeea59849ec0939af5c5d476935f2bab4b7f0335b0110f0f069a41024278e"}, + {file = "pydantic_core-2.18.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9b6431559676a1079eac0f52d6d0721fb8e3c5ba43c37bc537c8c83724031feb"}, + {file = "pydantic_core-2.18.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:85233abb44bc18d16e72dc05bf13848a36f363f83757541f1a97db2f8d58cfd9"}, + {file = "pydantic_core-2.18.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:641a018af4fe48be57a2b3d7a1f0f5dbca07c1d00951d3d7463f0ac9dac66622"}, + {file = "pydantic_core-2.18.1-cp38-none-win32.whl", hash = "sha256:63d7523cd95d2fde0d28dc42968ac731b5bb1e516cc56b93a50ab293f4daeaad"}, + {file = "pydantic_core-2.18.1-cp38-none-win_amd64.whl", hash = "sha256:907a4d7720abfcb1c81619863efd47c8a85d26a257a2dbebdb87c3b847df0278"}, + {file = "pydantic_core-2.18.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:aad17e462f42ddbef5984d70c40bfc4146c322a2da79715932cd8976317054de"}, + {file = "pydantic_core-2.18.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:94b9769ba435b598b547c762184bcfc4783d0d4c7771b04a3b45775c3589ca44"}, + {file = "pydantic_core-2.18.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80e0e57cc704a52fb1b48f16d5b2c8818da087dbee6f98d9bf19546930dc64b5"}, + {file = "pydantic_core-2.18.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:76b86e24039c35280ceee6dce7e62945eb93a5175d43689ba98360ab31eebc4a"}, + {file = "pydantic_core-2.18.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12a05db5013ec0ca4a32cc6433f53faa2a014ec364031408540ba858c2172bb0"}, + {file = "pydantic_core-2.18.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:250ae39445cb5475e483a36b1061af1bc233de3e9ad0f4f76a71b66231b07f88"}, + {file = "pydantic_core-2.18.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a32204489259786a923e02990249c65b0f17235073149d0033efcebe80095570"}, + {file = "pydantic_core-2.18.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6395a4435fa26519fd96fdccb77e9d00ddae9dd6c742309bd0b5610609ad7fb2"}, + {file = "pydantic_core-2.18.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2533ad2883f001efa72f3d0e733fb846710c3af6dcdd544fe5bf14fa5fe2d7db"}, + {file = "pydantic_core-2.18.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b560b72ed4816aee52783c66854d96157fd8175631f01ef58e894cc57c84f0f6"}, + {file = "pydantic_core-2.18.1-cp39-none-win32.whl", hash = "sha256:582cf2cead97c9e382a7f4d3b744cf0ef1a6e815e44d3aa81af3ad98762f5a9b"}, + {file = "pydantic_core-2.18.1-cp39-none-win_amd64.whl", hash = "sha256:ca71d501629d1fa50ea7fa3b08ba884fe10cefc559f5c6c8dfe9036c16e8ae89"}, + {file = "pydantic_core-2.18.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e178e5b66a06ec5bf51668ec0d4ac8cfb2bdcb553b2c207d58148340efd00143"}, + {file = "pydantic_core-2.18.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:72722ce529a76a4637a60be18bd789d8fb871e84472490ed7ddff62d5fed620d"}, + {file = "pydantic_core-2.18.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fe0c1ce5b129455e43f941f7a46f61f3d3861e571f2905d55cdbb8b5c6f5e2c"}, + {file = "pydantic_core-2.18.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4284c621f06a72ce2cb55f74ea3150113d926a6eb78ab38340c08f770eb9b4d"}, + {file = "pydantic_core-2.18.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a0c3e718f4e064efde68092d9d974e39572c14e56726ecfaeebbe6544521f47"}, + {file = "pydantic_core-2.18.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:2027493cc44c23b598cfaf200936110433d9caa84e2c6cf487a83999638a96ac"}, + {file = "pydantic_core-2.18.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:76909849d1a6bffa5a07742294f3fa1d357dc917cb1fe7b470afbc3a7579d539"}, + {file = "pydantic_core-2.18.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ee7ccc7fb7e921d767f853b47814c3048c7de536663e82fbc37f5eb0d532224b"}, + {file = "pydantic_core-2.18.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ee2794111c188548a4547eccc73a6a8527fe2af6cf25e1a4ebda2fd01cdd2e60"}, + {file = "pydantic_core-2.18.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a139fe9f298dc097349fb4f28c8b81cc7a202dbfba66af0e14be5cfca4ef7ce5"}, + {file = "pydantic_core-2.18.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d074b07a10c391fc5bbdcb37b2f16f20fcd9e51e10d01652ab298c0d07908ee2"}, + {file = "pydantic_core-2.18.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c69567ddbac186e8c0aadc1f324a60a564cfe25e43ef2ce81bcc4b8c3abffbae"}, + {file = "pydantic_core-2.18.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:baf1c7b78cddb5af00971ad5294a4583188bda1495b13760d9f03c9483bb6203"}, + {file = "pydantic_core-2.18.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:2684a94fdfd1b146ff10689c6e4e815f6a01141781c493b97342cdc5b06f4d5d"}, + {file = "pydantic_core-2.18.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:73c1bc8a86a5c9e8721a088df234265317692d0b5cd9e86e975ce3bc3db62a59"}, + {file = "pydantic_core-2.18.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e60defc3c15defb70bb38dd605ff7e0fae5f6c9c7cbfe0ad7868582cb7e844a6"}, + {file = "pydantic_core-2.18.1.tar.gz", hash = "sha256:de9d3e8717560eb05e28739d1b35e4eac2e458553a52a301e51352a7ffc86a35"}, ] [package.dependencies] typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" +[[package]] +name = "pydash" +version = "8.0.0" +description = "The kitchen sink of Python utility libraries for doing \"stuff\" in a functional way. Based on the Lo-Dash Javascript library." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydash-8.0.0-py3-none-any.whl", hash = "sha256:be2c35df332473a5a939d485422c71a03b19b1a98d6559efb832eadb4a2cfc36"}, + {file = "pydash-8.0.0.tar.gz", hash = "sha256:5a90d98b5f370bb9620f786221579df8f83d54f1f58de6a66f52b1bdba7175d1"}, +] + +[package.dependencies] +typing-extensions = ">3.10,<4.6.0 || >4.6.0" + +[package.extras] +dev = ["build", "coverage", "furo", "invoke", "mypy", "pytest", "pytest-cov", "pytest-mypy-testing", "ruff", "sphinx", "sphinx-autodoc-typehints", "tox", "twine", "wheel"] + +[[package]] +name = "pyflakes" +version = "3.2.0" +description = "passive checker of Python programs" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyflakes-3.2.0-py2.py3-none-any.whl", hash = "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a"}, + {file = "pyflakes-3.2.0.tar.gz", hash = "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f"}, +] + [[package]] name = "pygments" version = "2.17.2" @@ -1162,15 +1754,29 @@ typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\"" [package.extras] testutil = ["gitpython (>3)"] +[[package]] +name = "pyproject-hooks" +version = "1.0.0" +description = "Wrappers to call pyproject.toml-based build backend hooks." +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyproject_hooks-1.0.0-py3-none-any.whl", hash = "sha256:283c11acd6b928d2f6a7c73fa0d01cb2bdc5f07c57a2eeb6e83d5e56b97976f8"}, + {file = "pyproject_hooks-1.0.0.tar.gz", hash = "sha256:f271b298b97f5955d53fb12b72c1fb1948c22c1a6b70b315c54cedaca0264ef5"}, +] + +[package.dependencies] +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} + [[package]] name = "pytest" -version = "7.4.3" +version = "8.1.1" description = "pytest: simple powerful testing with Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pytest-7.4.3-py3-none-any.whl", hash = "sha256:0d009c083ea859a71b76adf7c1d502e4bc170b80a8ef002da5806527b9591fac"}, - {file = "pytest-7.4.3.tar.gz", hash = "sha256:d989d136982de4e3b29dabcc838ad581c64e8ed52c11fbe86ddebd9da0818cd5"}, + {file = "pytest-8.1.1-py3-none-any.whl", hash = "sha256:2a8386cfc11fa9d2c50ee7b2a57e7d898ef90470a7a34c4b949ff59662bb78b7"}, + {file = "pytest-8.1.1.tar.gz", hash = "sha256:ac978141a75948948817d360297b7aae0fcb9d6ff6bc9ec6d514b85d5a65c044"}, ] [package.dependencies] @@ -1178,25 +1784,25 @@ colorama = {version = "*", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" packaging = "*" -pluggy = ">=0.12,<2.0" -tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} +pluggy = ">=1.4,<2.0" +tomli = {version = ">=1", markers = "python_version < \"3.11\""} [package.extras] -testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] +testing = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] [[package]] name = "pytest-mock" -version = "3.12.0" +version = "3.14.0" description = "Thin-wrapper around the mock package for easier use with pytest" optional = false python-versions = ">=3.8" files = [ - {file = "pytest-mock-3.12.0.tar.gz", hash = "sha256:31a40f038c22cad32287bb43932054451ff5583ff094bca6f675df2f8bc1a6e9"}, - {file = "pytest_mock-3.12.0-py3-none-any.whl", hash = "sha256:0972719a7263072da3a21c7f4773069bcc7486027d7e8e1f81d98a47e701bc4f"}, + {file = "pytest-mock-3.14.0.tar.gz", hash = "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0"}, + {file = "pytest_mock-3.14.0-py3-none-any.whl", hash = "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f"}, ] [package.dependencies] -pytest = ">=5.0" +pytest = ">=6.2.5" [package.extras] dev = ["pre-commit", "pytest-asyncio", "tox"] @@ -1221,15 +1827,61 @@ psutil = ["psutil (>=3.0)"] setproctitle = ["setproctitle"] testing = ["filelock"] +[[package]] +name = "python-box" +version = "7.1.1" +description = "Advanced Python dictionaries with dot notation access" +optional = false +python-versions = ">=3.8" +files = [ + {file = "python-box-7.1.1.tar.gz", hash = "sha256:2a3df244a5a79ac8f8447b5d11b5be0f2747d7b141cb2866060081ae9b53cc50"}, + {file = "python_box-7.1.1-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:81ed1ec0f0ff2370227fc07277c5baca46d190a4747631bad7eb6ab1630fb7d9"}, + {file = "python_box-7.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8891735b4148e84d348c6eadd2f127152f751c9603e35d43a1f496183a291ac4"}, + {file = "python_box-7.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:0036fd47d388deaca8ebd65aea905f88ee6ef91d1d8ce34898b66f1824afbe80"}, + {file = "python_box-7.1.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:aabf8b9ae5dbc8ba431d8cbe0d4cfe737a25d52d68b0f5f2ff34915c21a2c1db"}, + {file = "python_box-7.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c046608337e723ae4de3206db5d1e1202ed166da2dfdc70c1f9361e72ace5633"}, + {file = "python_box-7.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:f9266795e9c233874fb5b34fa994054b4fb0371881678e6ec45aec17fc95feac"}, + {file = "python_box-7.1.1-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:f76b5b7f0cdc07bfdd4200dc24e6e33189bb2ae322137a2b7110fd41891a3157"}, + {file = "python_box-7.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ea13c98e05a3ec0ff26f254986a17290b69b5ade209fad081fd628f8fcfaa08"}, + {file = "python_box-7.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:1b3f346e332dba16df0b0543d319d9e7ce07d93e5ae152175302894352aa2d28"}, + {file = "python_box-7.1.1-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:24c4ec0ee0278f66321100aaa9c615413da27a14ff43d376a2a3b4665e1d9494"}, + {file = "python_box-7.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d95e5eec4fc8f3fc5c9cc7347fc2eb4f9187c853d34c90b1658d1eff96cd4eac"}, + {file = "python_box-7.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:a0f1333c42e81529b6f68c192050df9d4505b803be7ac47f114036b98707f7cf"}, + {file = "python_box-7.1.1-py3-none-any.whl", hash = "sha256:63b609555554d7a9d4b6e725f8e78ef1717c67e7d386200e03422ad612338df8"}, +] + +[package.extras] +all = ["msgpack", "ruamel.yaml (>=0.17)", "toml"] +msgpack = ["msgpack"] +pyyaml = ["PyYAML"] +ruamel-yaml = ["ruamel.yaml (>=0.17)"] +toml = ["toml"] +tomli = ["tomli", "tomli-w"] +yaml = ["ruamel.yaml (>=0.17)"] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, +] + +[package.dependencies] +six = ">=1.5" + [[package]] name = "pytz" -version = "2023.3.post1" +version = "2024.1" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" files = [ - {file = "pytz-2023.3.post1-py2.py3-none-any.whl", hash = "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7"}, - {file = "pytz-2023.3.post1.tar.gz", hash = "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b"}, + {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, + {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, ] [[package]] @@ -1292,6 +1944,21 @@ files = [ {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, ] +[[package]] +name = "referencing" +version = "0.34.0" +description = "JSON Referencing + Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "referencing-0.34.0-py3-none-any.whl", hash = "sha256:d53ae300ceddd3169f1ffa9caf2cb7b769e92657e4fafb23d34b93679116dfd4"}, + {file = "referencing-0.34.0.tar.gz", hash = "sha256:5773bd84ef41799a5a8ca72dc34590c041eb01bf9aa02632b4a973fb0181a844"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +rpds-py = ">=0.7.0" + [[package]] name = "requests" version = "2.31.0" @@ -1313,15 +1980,67 @@ urllib3 = ">=1.21.1,<3" socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] +[[package]] +name = "resolvelib" +version = "1.0.1" +description = "Resolve abstract dependencies into concrete ones" +optional = false +python-versions = "*" +files = [ + {file = "resolvelib-1.0.1-py2.py3-none-any.whl", hash = "sha256:d2da45d1a8dfee81bdd591647783e340ef3bcb104b54c383f70d422ef5cc7dbf"}, + {file = "resolvelib-1.0.1.tar.gz", hash = "sha256:04ce76cbd63fded2078ce224785da6ecd42b9564b1390793f64ddecbe997b309"}, +] + +[package.extras] +examples = ["html5lib", "packaging", "pygraphviz", "requests"] +lint = ["black", "flake8", "isort", "mypy", "types-requests"] +release = ["build", "towncrier", "twine"] +test = ["commentjson", "packaging", "pytest"] + +[[package]] +name = "responses" +version = "0.25.0" +description = "A utility library for mocking out the `requests` Python library." +optional = false +python-versions = ">=3.8" +files = [ + {file = "responses-0.25.0-py3-none-any.whl", hash = "sha256:2f0b9c2b6437db4b528619a77e5d565e4ec2a9532162ac1a131a83529db7be1a"}, + {file = "responses-0.25.0.tar.gz", hash = "sha256:01ae6a02b4f34e39bffceb0fc6786b67a25eae919c6368d05eabc8d9576c2a66"}, +] + +[package.dependencies] +pyyaml = "*" +requests = ">=2.30.0,<3.0" +urllib3 = ">=1.25.10,<3.0" + +[package.extras] +tests = ["coverage (>=6.0.0)", "flake8", "mypy", "pytest (>=7.0.0)", "pytest-asyncio", "pytest-cov", "pytest-httpserver", "tomli", "tomli-w", "types-PyYAML", "types-requests"] + +[[package]] +name = "restfly" +version = "1.4.7" +description = "REST API library framework" +optional = false +python-versions = "*" +files = [ + {file = "restfly-1.4.7-py3-none-any.whl", hash = "sha256:b50cb15f49c6ae1afb41514e01e1f6d1cb45d621176ea2fb2fa1e7faa301f914"}, + {file = "restfly-1.4.7.tar.gz", hash = "sha256:0a8e07f45745b6a4dabdee29befadc3d9803662afd423ab5ad7c13d70b9ccee2"}, +] + +[package.dependencies] +arrow = ">=1.0.3" +python-box = ">=5.3.0" +requests = ">=2.26.0" + [[package]] name = "rich" -version = "13.7.0" +version = "13.7.1" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" optional = false python-versions = ">=3.7.0" files = [ - {file = "rich-13.7.0-py3-none-any.whl", hash = "sha256:6da14c108c4866ee9520bbffa71f6fe3962e193b7da68720583850cd4548e235"}, - {file = "rich-13.7.0.tar.gz", hash = "sha256:5cb5123b5cf9ee70584244246816e9114227e0b98ad9176eede6ad54bf5403fa"}, + {file = "rich-13.7.1-py3-none-any.whl", hash = "sha256:4edbae314f59eb482f54e9e30bf00d33350aaa94f4bfcd4e9e3110e64d0d7222"}, + {file = "rich-13.7.1.tar.gz", hash = "sha256:9be308cb1fe2f1f57d67ce99e95af38a1e2bc71ad9813b0e247cf7ffbcc3a432"}, ] [package.dependencies] @@ -1331,15 +2050,123 @@ pygments = ">=2.13.0,<3.0.0" [package.extras] jupyter = ["ipywidgets (>=7.5.1,<9)"] +[[package]] +name = "rpds-py" +version = "0.18.0" +description = "Python bindings to Rust's persistent data structures (rpds)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "rpds_py-0.18.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:5b4e7d8d6c9b2e8ee2d55c90b59c707ca59bc30058269b3db7b1f8df5763557e"}, + {file = "rpds_py-0.18.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c463ed05f9dfb9baebef68048aed8dcdc94411e4bf3d33a39ba97e271624f8f7"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01e36a39af54a30f28b73096dd39b6802eddd04c90dbe161c1b8dbe22353189f"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d62dec4976954a23d7f91f2f4530852b0c7608116c257833922a896101336c51"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd18772815d5f008fa03d2b9a681ae38d5ae9f0e599f7dda233c439fcaa00d40"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:923d39efa3cfb7279a0327e337a7958bff00cc447fd07a25cddb0a1cc9a6d2da"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39514da80f971362f9267c600b6d459bfbbc549cffc2cef8e47474fddc9b45b1"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a34d557a42aa28bd5c48a023c570219ba2593bcbbb8dc1b98d8cf5d529ab1434"}, + {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:93df1de2f7f7239dc9cc5a4a12408ee1598725036bd2dedadc14d94525192fc3"}, + {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:34b18ba135c687f4dac449aa5157d36e2cbb7c03cbea4ddbd88604e076aa836e"}, + {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c0b5dcf9193625afd8ecc92312d6ed78781c46ecbf39af9ad4681fc9f464af88"}, + {file = "rpds_py-0.18.0-cp310-none-win32.whl", hash = "sha256:c4325ff0442a12113a6379af66978c3fe562f846763287ef66bdc1d57925d337"}, + {file = "rpds_py-0.18.0-cp310-none-win_amd64.whl", hash = "sha256:7223a2a5fe0d217e60a60cdae28d6949140dde9c3bcc714063c5b463065e3d66"}, + {file = "rpds_py-0.18.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3a96e0c6a41dcdba3a0a581bbf6c44bb863f27c541547fb4b9711fd8cf0ffad4"}, + {file = "rpds_py-0.18.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30f43887bbae0d49113cbaab729a112251a940e9b274536613097ab8b4899cf6"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcb25daa9219b4cf3a0ab24b0eb9a5cc8949ed4dc72acb8fa16b7e1681aa3c58"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d68c93e381010662ab873fea609bf6c0f428b6d0bb00f2c6939782e0818d37bf"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b34b7aa8b261c1dbf7720b5d6f01f38243e9b9daf7e6b8bc1fd4657000062f2c"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e6d75ab12b0bbab7215e5d40f1e5b738aa539598db27ef83b2ec46747df90e1"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b8612cd233543a3781bc659c731b9d607de65890085098986dfd573fc2befe5"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aec493917dd45e3c69d00a8874e7cbed844efd935595ef78a0f25f14312e33c6"}, + {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:661d25cbffaf8cc42e971dd570d87cb29a665f49f4abe1f9e76be9a5182c4688"}, + {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1df3659d26f539ac74fb3b0c481cdf9d725386e3552c6fa2974f4d33d78e544b"}, + {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a1ce3ba137ed54f83e56fb983a5859a27d43a40188ba798993812fed73c70836"}, + {file = "rpds_py-0.18.0-cp311-none-win32.whl", hash = "sha256:69e64831e22a6b377772e7fb337533c365085b31619005802a79242fee620bc1"}, + {file = "rpds_py-0.18.0-cp311-none-win_amd64.whl", hash = "sha256:998e33ad22dc7ec7e030b3df701c43630b5bc0d8fbc2267653577e3fec279afa"}, + {file = "rpds_py-0.18.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:7f2facbd386dd60cbbf1a794181e6aa0bd429bd78bfdf775436020172e2a23f0"}, + {file = "rpds_py-0.18.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1d9a5be316c15ffb2b3c405c4ff14448c36b4435be062a7f578ccd8b01f0c4d8"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd5bf1af8efe569654bbef5a3e0a56eca45f87cfcffab31dd8dde70da5982475"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5417558f6887e9b6b65b4527232553c139b57ec42c64570569b155262ac0754f"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:56a737287efecafc16f6d067c2ea0117abadcd078d58721f967952db329a3e5c"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8f03bccbd8586e9dd37219bce4d4e0d3ab492e6b3b533e973fa08a112cb2ffc9"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4457a94da0d5c53dc4b3e4de1158bdab077db23c53232f37a3cb7afdb053a4e3"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0ab39c1ba9023914297dd88ec3b3b3c3f33671baeb6acf82ad7ce883f6e8e157"}, + {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9d54553c1136b50fd12cc17e5b11ad07374c316df307e4cfd6441bea5fb68496"}, + {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0af039631b6de0397ab2ba16eaf2872e9f8fca391b44d3d8cac317860a700a3f"}, + {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:84ffab12db93b5f6bad84c712c92060a2d321b35c3c9960b43d08d0f639d60d7"}, + {file = "rpds_py-0.18.0-cp312-none-win32.whl", hash = "sha256:685537e07897f173abcf67258bee3c05c374fa6fff89d4c7e42fb391b0605e98"}, + {file = "rpds_py-0.18.0-cp312-none-win_amd64.whl", hash = "sha256:e003b002ec72c8d5a3e3da2989c7d6065b47d9eaa70cd8808b5384fbb970f4ec"}, + {file = "rpds_py-0.18.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:08f9ad53c3f31dfb4baa00da22f1e862900f45908383c062c27628754af2e88e"}, + {file = "rpds_py-0.18.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c0013fe6b46aa496a6749c77e00a3eb07952832ad6166bd481c74bda0dcb6d58"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e32a92116d4f2a80b629778280103d2a510a5b3f6314ceccd6e38006b5e92dcb"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e541ec6f2ec456934fd279a3120f856cd0aedd209fc3852eca563f81738f6861"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bed88b9a458e354014d662d47e7a5baafd7ff81c780fd91584a10d6ec842cb73"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2644e47de560eb7bd55c20fc59f6daa04682655c58d08185a9b95c1970fa1e07"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e8916ae4c720529e18afa0b879473049e95949bf97042e938530e072fde061d"}, + {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:465a3eb5659338cf2a9243e50ad9b2296fa15061736d6e26240e713522b6235c"}, + {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ea7d4a99f3b38c37eac212dbd6ec42b7a5ec51e2c74b5d3223e43c811609e65f"}, + {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:67071a6171e92b6da534b8ae326505f7c18022c6f19072a81dcf40db2638767c"}, + {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:41ef53e7c58aa4ef281da975f62c258950f54b76ec8e45941e93a3d1d8580594"}, + {file = "rpds_py-0.18.0-cp38-none-win32.whl", hash = "sha256:fdea4952db2793c4ad0bdccd27c1d8fdd1423a92f04598bc39425bcc2b8ee46e"}, + {file = "rpds_py-0.18.0-cp38-none-win_amd64.whl", hash = "sha256:7cd863afe7336c62ec78d7d1349a2f34c007a3cc6c2369d667c65aeec412a5b1"}, + {file = "rpds_py-0.18.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:5307def11a35f5ae4581a0b658b0af8178c65c530e94893345bebf41cc139d33"}, + {file = "rpds_py-0.18.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:77f195baa60a54ef9d2de16fbbfd3ff8b04edc0c0140a761b56c267ac11aa467"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39f5441553f1c2aed4de4377178ad8ff8f9d733723d6c66d983d75341de265ab"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a00312dea9310d4cb7dbd7787e722d2e86a95c2db92fbd7d0155f97127bcb40"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f2fc11e8fe034ee3c34d316d0ad8808f45bc3b9ce5857ff29d513f3ff2923a1"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:586f8204935b9ec884500498ccc91aa869fc652c40c093bd9e1471fbcc25c022"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddc2f4dfd396c7bfa18e6ce371cba60e4cf9d2e5cdb71376aa2da264605b60b9"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5ddcba87675b6d509139d1b521e0c8250e967e63b5909a7e8f8944d0f90ff36f"}, + {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7bd339195d84439cbe5771546fe8a4e8a7a045417d8f9de9a368c434e42a721e"}, + {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:d7c36232a90d4755b720fbd76739d8891732b18cf240a9c645d75f00639a9024"}, + {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6b0817e34942b2ca527b0e9298373e7cc75f429e8da2055607f4931fded23e20"}, + {file = "rpds_py-0.18.0-cp39-none-win32.whl", hash = "sha256:99f70b740dc04d09e6b2699b675874367885217a2e9f782bdf5395632ac663b7"}, + {file = "rpds_py-0.18.0-cp39-none-win_amd64.whl", hash = "sha256:6ef687afab047554a2d366e112dd187b62d261d49eb79b77e386f94644363294"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ad36cfb355e24f1bd37cac88c112cd7730873f20fb0bdaf8ba59eedf8216079f"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:36b3ee798c58ace201289024b52788161e1ea133e4ac93fba7d49da5fec0ef9e"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8a2f084546cc59ea99fda8e070be2fd140c3092dc11524a71aa8f0f3d5a55ca"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e4461d0f003a0aa9be2bdd1b798a041f177189c1a0f7619fe8c95ad08d9a45d7"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8db715ebe3bb7d86d77ac1826f7d67ec11a70dbd2376b7cc214199360517b641"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:793968759cd0d96cac1e367afd70c235867831983f876a53389ad869b043c948"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66e6a3af5a75363d2c9a48b07cb27c4ea542938b1a2e93b15a503cdfa8490795"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6ef0befbb5d79cf32d0266f5cff01545602344eda89480e1dd88aca964260b18"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1d4acf42190d449d5e89654d5c1ed3a4f17925eec71f05e2a41414689cda02d1"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:a5f446dd5055667aabaee78487f2b5ab72e244f9bc0b2ffebfeec79051679984"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:9dbbeb27f4e70bfd9eec1be5477517365afe05a9b2c441a0b21929ee61048124"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:22806714311a69fd0af9b35b7be97c18a0fc2826e6827dbb3a8c94eac6cf7eeb"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:b34ae4636dfc4e76a438ab826a0d1eed2589ca7d9a1b2d5bb546978ac6485461"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c8370641f1a7f0e0669ddccca22f1da893cef7628396431eb445d46d893e5cd"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c8362467a0fdeccd47935f22c256bec5e6abe543bf0d66e3d3d57a8fb5731863"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11a8c85ef4a07a7638180bf04fe189d12757c696eb41f310d2426895356dcf05"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b316144e85316da2723f9d8dc75bada12fa58489a527091fa1d5a612643d1a0e"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf1ea2e34868f6fbf070e1af291c8180480310173de0b0c43fc38a02929fc0e3"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e546e768d08ad55b20b11dbb78a745151acbd938f8f00d0cfbabe8b0199b9880"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:4901165d170a5fde6f589acb90a6b33629ad1ec976d4529e769c6f3d885e3e80"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:618a3d6cae6ef8ec88bb76dd80b83cfe415ad4f1d942ca2a903bf6b6ff97a2da"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ed4eb745efbff0a8e9587d22a84be94a5eb7d2d99c02dacf7bd0911713ed14dd"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6c81e5f372cd0dc5dc4809553d34f832f60a46034a5f187756d9b90586c2c307"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:43fbac5f22e25bee1d482c97474f930a353542855f05c1161fd804c9dc74a09d"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d7faa6f14017c0b1e69f5e2c357b998731ea75a442ab3841c0dbbbfe902d2c4"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:08231ac30a842bd04daabc4d71fddd7e6d26189406d5a69535638e4dcb88fe76"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:044a3e61a7c2dafacae99d1e722cc2d4c05280790ec5a05031b3876809d89a5c"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3f26b5bd1079acdb0c7a5645e350fe54d16b17bfc5e71f371c449383d3342e17"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:482103aed1dfe2f3b71a58eff35ba105289b8d862551ea576bd15479aba01f66"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1374f4129f9bcca53a1bba0bb86bf78325a0374577cf7e9e4cd046b1e6f20e24"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:635dc434ff724b178cb192c70016cc0ad25a275228f749ee0daf0eddbc8183b1"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:bc362ee4e314870a70f4ae88772d72d877246537d9f8cb8f7eacf10884862432"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:4832d7d380477521a8c1644bbab6588dfedea5e30a7d967b5fb75977c45fd77f"}, + {file = "rpds_py-0.18.0.tar.gz", hash = "sha256:42821446ee7a76f5d9f71f9e33a4fb2ffd724bb3e7f93386150b61a43115788d"}, +] + [[package]] name = "rstcheck" -version = "6.2.0" +version = "6.2.1" description = "Checks syntax of reStructuredText and code blocks nested within it" optional = false python-versions = ">=3.8" files = [ - {file = "rstcheck-6.2.0-py3-none-any.whl", hash = "sha256:63262c8453489a6e3873113e16c1d234c86ca90a829e685263fd6c7aec0073fa"}, - {file = "rstcheck-6.2.0.tar.gz", hash = "sha256:4f47d1e136e8dc7e6fd54d9679dbc1ed7c4d87b12e17d00003fccf4734e9ffdf"}, + {file = "rstcheck-6.2.1-py3-none-any.whl", hash = "sha256:b450943707d8ca053f5c6b9f103ee595f4926a064203e5e579172aefb3fe2c12"}, + {file = "rstcheck-6.2.1.tar.gz", hash = "sha256:e4d173950b023eb12c2b9d2348a8c62bef46612bbc7b29e1e57d37320ed0a891"}, ] [package.dependencies] @@ -1348,21 +2175,21 @@ typer = {version = ">=0.4.1", extras = ["all"]} [package.extras] dev = ["rstcheck[docs,sphinx,testing,toml,type-check]", "tox (>=3.15)"] -docs = ["m2r2 (>=0.3.2)", "sphinx (>=4.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx-click (>=4.0.3)", "sphinx-rtd-theme (>=1.2)", "sphinxcontrib-spelling (>=7.3)"] -sphinx = ["sphinx (>=4.0)"] +docs = ["m2r2 (>=0.3.2)", "sphinx (>=5.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx-click (>=4.0.3)", "sphinx-rtd-theme (>=1.2)", "sphinxcontrib-spelling (>=7.3)"] +sphinx = ["sphinx (>=5.0)"] testing = ["coverage-conditional-plugin (>=0.5)", "coverage[toml] (>=6.0)", "pytest (>=7.2)", "pytest-cov (>=3.0)", "pytest-randomly (>=3.0)", "pytest-sugar (>=0.9.5)"] toml = ["tomli (>=2.0)"] type-check = ["mypy (>=1.0)"] [[package]] name = "rstcheck-core" -version = "1.2.0" +version = "1.2.1" description = "Checks syntax of reStructuredText and code blocks nested within it" optional = false python-versions = ">=3.8" files = [ - {file = "rstcheck-core-1.2.0.tar.gz", hash = "sha256:991678a86b604636d2461a97fb9339366d143eb799d22d51f49f84ed272121a9"}, - {file = "rstcheck_core-1.2.0-py3-none-any.whl", hash = "sha256:53478e4f9b1aca98dd9e892eff9f90fc8741b2be0e3213497585227c369db510"}, + {file = "rstcheck-core-1.2.1.tar.gz", hash = "sha256:9b330020d912e2864f23f332c1a0569463ca3b06b8fee7b7bdd201b055f7f831"}, + {file = "rstcheck_core-1.2.1-py3-none-any.whl", hash = "sha256:1c100de418b6c9e14d9cf6558644d0ab103fdc447f891313882d02df3a3c52ba"}, ] [package.dependencies] @@ -1371,28 +2198,120 @@ pydantic = ">=2" [package.extras] dev = ["rstcheck-core[docs,sphinx,testing,toml,type-check,yaml]", "tox (>=3.15)"] -docs = ["m2r2 (>=0.3.2)", "sphinx (>=4.0,!=7.2.5)", "sphinx-autobuild (>=2021.3.14)", "sphinx-autodoc-typehints (>=1.15)", "sphinx-rtd-theme (>=1.2)", "sphinxcontrib-apidoc (>=0.3)", "sphinxcontrib-spelling (>=7.3)"] -sphinx = ["sphinx (>=4.0)"] +docs = ["m2r2 (>=0.3.2)", "sphinx (>=5.0,!=7.2.5)", "sphinx-autobuild (>=2021.3.14)", "sphinx-autodoc-typehints (>=1.15)", "sphinx-rtd-theme (>=1.2)", "sphinxcontrib-apidoc (>=0.3)", "sphinxcontrib-spelling (>=7.3)"] +sphinx = ["sphinx (>=5.0)"] testing = ["coverage-conditional-plugin (>=0.5)", "coverage[toml] (>=6.0)", "pytest (>=7.2)", "pytest-cov (>=3.0)", "pytest-mock (>=3.7)", "pytest-randomly (>=3.0)", "pytest-sugar (>=0.9.5)"] toml = ["tomli (>=2.0)"] type-check = ["mypy (>=1.0)", "types-PyYAML (>=6.0.0)", "types-docutils (>=0.18)"] yaml = ["pyyaml (>=6.0.0)"] +[[package]] +name = "ruamel-yaml" +version = "0.17.40" +description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" +optional = false +python-versions = ">=3" +files = [ + {file = "ruamel.yaml-0.17.40-py3-none-any.whl", hash = "sha256:b16b6c3816dff0a93dca12acf5e70afd089fa5acb80604afd1ffa8b465b7722c"}, + {file = "ruamel.yaml-0.17.40.tar.gz", hash = "sha256:6024b986f06765d482b5b07e086cc4b4cd05dd22ddcbc758fa23d54873cf313d"}, +] + +[package.dependencies] +"ruamel.yaml.clib" = {version = ">=0.2.7", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.13\""} + +[package.extras] +docs = ["mercurial (>5.7)", "ryd"] +jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] + +[[package]] +name = "ruamel-yaml-clib" +version = "0.2.8" +description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" +optional = false +python-versions = ">=3.6" +files = [ + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b42169467c42b692c19cf539c38d4602069d8c1505e97b86387fcf7afb766e1d"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:07238db9cbdf8fc1e9de2489a4f68474e70dffcb32232db7c08fa61ca0c7c462"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:fff3573c2db359f091e1589c3d7c5fc2f86f5bdb6f24252c2d8e539d4e45f412"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:aa2267c6a303eb483de8d02db2871afb5c5fc15618d894300b88958f729ad74f"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:840f0c7f194986a63d2c2465ca63af8ccbbc90ab1c6001b1978f05119b5e7334"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:024cfe1fc7c7f4e1aff4a81e718109e13409767e4f871443cbff3dba3578203d"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-win32.whl", hash = "sha256:c69212f63169ec1cfc9bb44723bf2917cbbd8f6191a00ef3410f5a7fe300722d"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-win_amd64.whl", hash = "sha256:cabddb8d8ead485e255fe80429f833172b4cadf99274db39abc080e068cbcc31"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bef08cd86169d9eafb3ccb0a39edb11d8e25f3dae2b28f5c52fd997521133069"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:b16420e621d26fdfa949a8b4b47ade8810c56002f5389970db4ddda51dbff248"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:25c515e350e5b739842fc3228d662413ef28f295791af5e5110b543cf0b57d9b"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-manylinux_2_24_aarch64.whl", hash = "sha256:1707814f0d9791df063f8c19bb51b0d1278b8e9a2353abbb676c2f685dee6afe"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:46d378daaac94f454b3a0e3d8d78cafd78a026b1d71443f4966c696b48a6d899"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:09b055c05697b38ecacb7ac50bdab2240bfca1a0c4872b0fd309bb07dc9aa3a9"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-win32.whl", hash = "sha256:53a300ed9cea38cf5a2a9b069058137c2ca1ce658a874b79baceb8f892f915a7"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-win_amd64.whl", hash = "sha256:c2a72e9109ea74e511e29032f3b670835f8a59bbdc9ce692c5b4ed91ccf1eedb"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ebc06178e8821efc9692ea7544aa5644217358490145629914d8020042c24aa1"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_13_0_arm64.whl", hash = "sha256:edaef1c1200c4b4cb914583150dcaa3bc30e592e907c01117c08b13a07255ec2"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d176b57452ab5b7028ac47e7b3cf644bcfdc8cacfecf7e71759f7f51a59e5c92"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux_2_24_aarch64.whl", hash = "sha256:1dc67314e7e1086c9fdf2680b7b6c2be1c0d8e3a8279f2e993ca2a7545fecf62"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3213ece08ea033eb159ac52ae052a4899b56ecc124bb80020d9bbceeb50258e9"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aab7fd643f71d7946f2ee58cc88c9b7bfc97debd71dcc93e03e2d174628e7e2d"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-win32.whl", hash = "sha256:5c365d91c88390c8d0a8545df0b5857172824b1c604e867161e6b3d59a827eaa"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-win_amd64.whl", hash = "sha256:1758ce7d8e1a29d23de54a16ae867abd370f01b5a69e1a3ba75223eaa3ca1a1b"}, + {file = "ruamel.yaml.clib-0.2.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a5aa27bad2bb83670b71683aae140a1f52b0857a2deff56ad3f6c13a017a26ed"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c58ecd827313af6864893e7af0a3bb85fd529f862b6adbefe14643947cfe2942"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-macosx_12_0_arm64.whl", hash = "sha256:f481f16baec5290e45aebdc2a5168ebc6d35189ae6fea7a58787613a25f6e875"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:77159f5d5b5c14f7c34073862a6b7d34944075d9f93e681638f6d753606c6ce6"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7f67a1ee819dc4562d444bbafb135832b0b909f81cc90f7aa00260968c9ca1b3"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4ecbf9c3e19f9562c7fdd462e8d18dd902a47ca046a2e64dba80699f0b6c09b7"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:87ea5ff66d8064301a154b3933ae406b0863402a799b16e4a1d24d9fbbcbe0d3"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-win32.whl", hash = "sha256:75e1ed13e1f9de23c5607fe6bd1aeaae21e523b32d83bb33918245361e9cc51b"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-win_amd64.whl", hash = "sha256:3f215c5daf6a9d7bbed4a0a4f760f3113b10e82ff4c5c44bec20a68c8014f675"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1b617618914cb00bf5c34d4357c37aa15183fa229b24767259657746c9077615"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:a6a9ffd280b71ad062eae53ac1659ad86a17f59a0fdc7699fd9be40525153337"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:305889baa4043a09e5b76f8e2a51d4ffba44259f6b4c72dec8ca56207d9c6fe1"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:700e4ebb569e59e16a976857c8798aee258dceac7c7d6b50cab63e080058df91"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:e2b4c44b60eadec492926a7270abb100ef9f72798e18743939bdbf037aab8c28"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e79e5db08739731b0ce4850bed599235d601701d5694c36570a99a0c5ca41a9d"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-win32.whl", hash = "sha256:955eae71ac26c1ab35924203fda6220f84dce57d6d7884f189743e2abe3a9fbe"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-win_amd64.whl", hash = "sha256:56f4252222c067b4ce51ae12cbac231bce32aee1d33fbfc9d17e5b8d6966c312"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:03d1162b6d1df1caa3a4bd27aa51ce17c9afc2046c31b0ad60a0a96ec22f8001"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:bba64af9fa9cebe325a62fa398760f5c7206b215201b0ec825005f1b18b9bccf"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:a1a45e0bb052edf6a1d3a93baef85319733a888363938e1fc9924cb00c8df24c"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:da09ad1c359a728e112d60116f626cc9f29730ff3e0e7db72b9a2dbc2e4beed5"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:184565012b60405d93838167f425713180b949e9d8dd0bbc7b49f074407c5a8b"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a75879bacf2c987c003368cf14bed0ffe99e8e85acfa6c0bfffc21a090f16880"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-win32.whl", hash = "sha256:84b554931e932c46f94ab306913ad7e11bba988104c5cff26d90d03f68258cd5"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-win_amd64.whl", hash = "sha256:25ac8c08322002b06fa1d49d1646181f0b2c72f5cbc15a85e80b4c30a544bb15"}, + {file = "ruamel.yaml.clib-0.2.8.tar.gz", hash = "sha256:beb2e0404003de9a4cab9753a8805a8fe9320ee6673136ed7f04255fe60bb512"}, +] + +[[package]] +name = "semantic-version" +version = "2.10.0" +description = "A library implementing the 'SemVer' scheme." +optional = false +python-versions = ">=2.7" +files = [ + {file = "semantic_version-2.10.0-py2.py3-none-any.whl", hash = "sha256:de78a3b8e0feda74cabc54aab2da702113e33ac9d9eb9d2389bcf1f58b7d9177"}, + {file = "semantic_version-2.10.0.tar.gz", hash = "sha256:bdabb6d336998cbb378d4b9db3a4b56a1e3235701dc05ea2690d9a997ed5041c"}, +] + +[package.extras] +dev = ["Django (>=1.11)", "check-manifest", "colorama (<=0.4.1)", "coverage", "flake8", "nose2", "readme-renderer (<25.0)", "tox", "wheel", "zest.releaser[recommended]"] +doc = ["Sphinx", "sphinx-rtd-theme"] + [[package]] name = "setuptools" -version = "69.0.2" +version = "69.5.1" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-69.0.2-py3-none-any.whl", hash = "sha256:1e8fdff6797d3865f37397be788a4e3cba233608e9b509382a2777d25ebde7f2"}, - {file = "setuptools-69.0.2.tar.gz", hash = "sha256:735896e78a4742605974de002ac60562d286fa8051a7e2299445e8e8fbb01aa6"}, + {file = "setuptools-69.5.1-py3-none-any.whl", hash = "sha256:c636ac361bc47580504644275c9ad802c50415c7522212252c033bd15f301f32"}, + {file = "setuptools-69.5.1.tar.gz", hash = "sha256:6c1fccdac05a97e598fb0ae3bbed5904ccb317337a51139dcd51453611bbb987"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "shellingham" @@ -1429,20 +2348,20 @@ files = [ [[package]] name = "sphinx" -version = "7.2.6" +version = "7.3.7" description = "Python documentation generator" optional = false python-versions = ">=3.9" files = [ - {file = "sphinx-7.2.6-py3-none-any.whl", hash = "sha256:1e09160a40b956dc623c910118fa636da93bd3ca0b9876a7b3df90f07d691560"}, - {file = "sphinx-7.2.6.tar.gz", hash = "sha256:9a5160e1ea90688d5963ba09a2dcd8bdd526620edbb65c328728f1b2228d5ab5"}, + {file = "sphinx-7.3.7-py3-none-any.whl", hash = "sha256:413f75440be4cacf328f580b4274ada4565fb2187d696a84970c23f77b64d8c3"}, + {file = "sphinx-7.3.7.tar.gz", hash = "sha256:a4a7db75ed37531c05002d56ed6948d4c42f473a36f46e1382b0bd76ca9627bc"}, ] [package.dependencies] -alabaster = ">=0.7,<0.8" +alabaster = ">=0.7.14,<0.8.0" babel = ">=2.9" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} -docutils = ">=0.18.1,<0.21" +docutils = ">=0.18.1,<0.22" imagesize = ">=1.3" importlib-metadata = {version = ">=4.8", markers = "python_version < \"3.10\""} Jinja2 = ">=3.0" @@ -1456,99 +2375,94 @@ sphinxcontrib-htmlhelp = ">=2.0.0" sphinxcontrib-jsmath = "*" sphinxcontrib-qthelp = "*" sphinxcontrib-serializinghtml = ">=1.1.9" +tomli = {version = ">=2", markers = "python_version < \"3.11\""} [package.extras] docs = ["sphinxcontrib-websupport"] -lint = ["docutils-stubs", "flake8 (>=3.5.0)", "flake8-simplify", "isort", "mypy (>=0.990)", "ruff", "sphinx-lint", "types-requests"] -test = ["cython (>=3.0)", "filelock", "html5lib", "pytest (>=4.6)", "setuptools (>=67.0)"] +lint = ["flake8 (>=3.5.0)", "importlib_metadata", "mypy (==1.9.0)", "pytest (>=6.0)", "ruff (==0.3.7)", "sphinx-lint", "tomli", "types-docutils", "types-requests"] +test = ["cython (>=3.0)", "defusedxml (>=0.7.1)", "pytest (>=6.0)", "setuptools (>=67.0)"] + +[[package]] +name = "sphinx-ansible-theme" +version = "0.9.1" +description = "Ansible Sphinx Theme" +optional = false +python-versions = ">=3.6" +files = [ + {file = "sphinx-ansible-theme-0.9.1.tar.gz", hash = "sha256:242cdad5c5bcc12e910b2ad9dc7c12f8c5d96e640f8b5676a011148997a70395"}, + {file = "sphinx_ansible_theme-0.9.1-py3-none-any.whl", hash = "sha256:4a41345123ed739976cd310c8afa8c7799e311c2e4fc1ecd2739293ad5da89eb"}, +] + +[package.dependencies] +ansible-pygments = "*" +Sphinx = ">=1.6" +sphinx-rtd-theme = "*" [[package]] name = "sphinx-rtd-theme" -version = "2.0.0" +version = "0.5.1" description = "Read the Docs theme for Sphinx" optional = false -python-versions = ">=3.6" +python-versions = "*" files = [ - {file = "sphinx_rtd_theme-2.0.0-py2.py3-none-any.whl", hash = "sha256:ec93d0856dc280cf3aee9a4c9807c60e027c7f7b461b77aeffed682e68f0e586"}, - {file = "sphinx_rtd_theme-2.0.0.tar.gz", hash = "sha256:bd5d7b80622406762073a04ef8fadc5f9151261563d47027de09910ce03afe6b"}, + {file = "sphinx_rtd_theme-0.5.1-py2.py3-none-any.whl", hash = "sha256:fa6bebd5ab9a73da8e102509a86f3fcc36dec04a0b52ea80e5a033b2aba00113"}, + {file = "sphinx_rtd_theme-0.5.1.tar.gz", hash = "sha256:eda689eda0c7301a80cf122dad28b1861e5605cbf455558f3775e1e8200e83a5"}, ] [package.dependencies] -docutils = "<0.21" -sphinx = ">=5,<8" -sphinxcontrib-jquery = ">=4,<5" +sphinx = "*" [package.extras] -dev = ["bump2version", "sphinxcontrib-httpdomain", "transifex-client", "wheel"] +dev = ["bump2version", "sphinxcontrib-httpdomain", "transifex-client"] [[package]] name = "sphinxcontrib-applehelp" -version = "1.0.7" +version = "1.0.8" description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" optional = false python-versions = ">=3.9" files = [ - {file = "sphinxcontrib_applehelp-1.0.7-py3-none-any.whl", hash = "sha256:094c4d56209d1734e7d252f6e0b3ccc090bd52ee56807a5d9315b19c122ab15d"}, - {file = "sphinxcontrib_applehelp-1.0.7.tar.gz", hash = "sha256:39fdc8d762d33b01a7d8f026a3b7d71563ea3b72787d5f00ad8465bd9d6dfbfa"}, + {file = "sphinxcontrib_applehelp-1.0.8-py3-none-any.whl", hash = "sha256:cb61eb0ec1b61f349e5cc36b2028e9e7ca765be05e49641c97241274753067b4"}, + {file = "sphinxcontrib_applehelp-1.0.8.tar.gz", hash = "sha256:c40a4f96f3776c4393d933412053962fac2b84f4c99a7982ba42e09576a70619"}, ] -[package.dependencies] -Sphinx = ">=5" - [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] name = "sphinxcontrib-devhelp" -version = "1.0.5" +version = "1.0.6" description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents" optional = false python-versions = ">=3.9" files = [ - {file = "sphinxcontrib_devhelp-1.0.5-py3-none-any.whl", hash = "sha256:fe8009aed765188f08fcaadbb3ea0d90ce8ae2d76710b7e29ea7d047177dae2f"}, - {file = "sphinxcontrib_devhelp-1.0.5.tar.gz", hash = "sha256:63b41e0d38207ca40ebbeabcf4d8e51f76c03e78cd61abe118cf4435c73d4212"}, + {file = "sphinxcontrib_devhelp-1.0.6-py3-none-any.whl", hash = "sha256:6485d09629944511c893fa11355bda18b742b83a2b181f9a009f7e500595c90f"}, + {file = "sphinxcontrib_devhelp-1.0.6.tar.gz", hash = "sha256:9893fd3f90506bc4b97bdb977ceb8fbd823989f4316b28c3841ec128544372d3"}, ] -[package.dependencies] -Sphinx = ">=5" - [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] name = "sphinxcontrib-htmlhelp" -version = "2.0.4" +version = "2.0.5" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" optional = false python-versions = ">=3.9" files = [ - {file = "sphinxcontrib_htmlhelp-2.0.4-py3-none-any.whl", hash = "sha256:8001661c077a73c29beaf4a79968d0726103c5605e27db92b9ebed8bab1359e9"}, - {file = "sphinxcontrib_htmlhelp-2.0.4.tar.gz", hash = "sha256:6c26a118a05b76000738429b724a0568dbde5b72391a688577da08f11891092a"}, + {file = "sphinxcontrib_htmlhelp-2.0.5-py3-none-any.whl", hash = "sha256:393f04f112b4d2f53d93448d4bce35842f62b307ccdc549ec1585e950bc35e04"}, + {file = "sphinxcontrib_htmlhelp-2.0.5.tar.gz", hash = "sha256:0dc87637d5de53dd5eec3a6a01753b1ccf99494bd756aafecd74b4fa9e729015"}, ] -[package.dependencies] -Sphinx = ">=5" - [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] test = ["html5lib", "pytest"] -[[package]] -name = "sphinxcontrib-jquery" -version = "4.1" -description = "Extension to include jQuery on newer Sphinx releases" -optional = false -python-versions = ">=2.7" -files = [ - {file = "sphinxcontrib-jquery-4.1.tar.gz", hash = "sha256:1620739f04e36a2c779f1a131a2dfd49b2fd07351bf1968ced074365933abc7a"}, - {file = "sphinxcontrib_jquery-4.1-py2.py3-none-any.whl", hash = "sha256:f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae"}, -] - -[package.dependencies] -Sphinx = ">=1.8" - [[package]] name = "sphinxcontrib-jsmath" version = "1.0.1" @@ -1565,40 +2479,50 @@ test = ["flake8", "mypy", "pytest"] [[package]] name = "sphinxcontrib-qthelp" -version = "1.0.6" +version = "1.0.7" description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents" optional = false python-versions = ">=3.9" files = [ - {file = "sphinxcontrib_qthelp-1.0.6-py3-none-any.whl", hash = "sha256:bf76886ee7470b934e363da7a954ea2825650013d367728588732c7350f49ea4"}, - {file = "sphinxcontrib_qthelp-1.0.6.tar.gz", hash = "sha256:62b9d1a186ab7f5ee3356d906f648cacb7a6bdb94d201ee7adf26db55092982d"}, + {file = "sphinxcontrib_qthelp-1.0.7-py3-none-any.whl", hash = "sha256:e2ae3b5c492d58fcbd73281fbd27e34b8393ec34a073c792642cd8e529288182"}, + {file = "sphinxcontrib_qthelp-1.0.7.tar.gz", hash = "sha256:053dedc38823a80a7209a80860b16b722e9e0209e32fea98c90e4e6624588ed6"}, ] -[package.dependencies] -Sphinx = ">=5" - [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] name = "sphinxcontrib-serializinghtml" -version = "1.1.9" +version = "1.1.10" description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)" optional = false python-versions = ">=3.9" files = [ - {file = "sphinxcontrib_serializinghtml-1.1.9-py3-none-any.whl", hash = "sha256:9b36e503703ff04f20e9675771df105e58aa029cfcbc23b8ed716019b7416ae1"}, - {file = "sphinxcontrib_serializinghtml-1.1.9.tar.gz", hash = "sha256:0c64ff898339e1fac29abd2bf5f11078f3ec413cfe9c046d3120d7ca65530b54"}, + {file = "sphinxcontrib_serializinghtml-1.1.10-py3-none-any.whl", hash = "sha256:326369b8df80a7d2d8d7f99aa5ac577f51ea51556ed974e7716cfd4fca3f6cb7"}, + {file = "sphinxcontrib_serializinghtml-1.1.10.tar.gz", hash = "sha256:93f3f5dc458b91b192fe10c397e324f262cf163d79f3282c158e8436a2c4511f"}, ] -[package.dependencies] -Sphinx = ">=5" - [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] test = ["pytest"] +[[package]] +name = "subprocess-tee" +version = "0.4.1" +description = "subprocess-tee" +optional = false +python-versions = ">=3.8" +files = [ + {file = "subprocess-tee-0.4.1.tar.gz", hash = "sha256:b3c124993f8b88d1eb1c2fde0bc2069787eac720ba88771cba17e8c93324825d"}, + {file = "subprocess_tee-0.4.1-py3-none-any.whl", hash = "sha256:eca56973a1c1237093c2055b2731bcaab784683b83f22c76f26e4c5763402e28"}, +] + +[package.extras] +test = ["enrich (>=1.2.6)", "molecule (>=3.4.0)", "pytest (>=6.2.5)", "pytest-cov (>=2.12.1)", "pytest-plus (>=0.2)", "pytest-xdist (>=2.3.0)"] + [[package]] name = "tomli" version = "2.0.1" @@ -1610,68 +2534,101 @@ files = [ {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] +[[package]] +name = "twiggy" +version = "0.5.1" +description = "a Pythonic logger" +optional = false +python-versions = "*" +files = [ + {file = "Twiggy-0.5.1-py3-none-any.whl", hash = "sha256:014671fdff7538b7f2396ff01724937ef57e1ac0e08f688747afbbcdeec9f081"}, + {file = "Twiggy-0.5.1.tar.gz", hash = "sha256:7938840275972f6ce89994a5bdfb0b84f0386301a043a960af6364952e78ffe4"}, +] + +[package.dependencies] +six = "*" + [[package]] name = "typer" -version = "0.9.0" +version = "0.12.3" description = "Typer, build great CLIs. Easy to code. Based on Python type hints." optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "typer-0.9.0-py3-none-any.whl", hash = "sha256:5d96d986a21493606a358cae4461bd8cdf83cbf33a5aa950ae629ca3b51467ee"}, - {file = "typer-0.9.0.tar.gz", hash = "sha256:50922fd79aea2f4751a8e0408ff10d2662bd0c8bbfa84755a699f3bada2978b2"}, + {file = "typer-0.12.3-py3-none-any.whl", hash = "sha256:070d7ca53f785acbccba8e7d28b08dcd88f79f1fbda035ade0aecec71ca5c914"}, + {file = "typer-0.12.3.tar.gz", hash = "sha256:49e73131481d804288ef62598d97a1ceef3058905aa536a1134f90891ba35482"}, ] [package.dependencies] -click = ">=7.1.1,<9.0.0" -colorama = {version = ">=0.4.3,<0.5.0", optional = true, markers = "extra == \"all\""} -rich = {version = ">=10.11.0,<14.0.0", optional = true, markers = "extra == \"all\""} -shellingham = {version = ">=1.3.0,<2.0.0", optional = true, markers = "extra == \"all\""} +click = ">=8.0.0" +rich = ">=10.11.0" +shellingham = ">=1.3.0" typing-extensions = ">=3.7.4.3" -[package.extras] -all = ["colorama (>=0.4.3,<0.5.0)", "rich (>=10.11.0,<14.0.0)", "shellingham (>=1.3.0,<2.0.0)"] -dev = ["autoflake (>=1.3.1,<2.0.0)", "flake8 (>=3.8.3,<4.0.0)", "pre-commit (>=2.17.0,<3.0.0)"] -doc = ["cairosvg (>=2.5.2,<3.0.0)", "mdx-include (>=1.4.1,<2.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "pillow (>=9.3.0,<10.0.0)"] -test = ["black (>=22.3.0,<23.0.0)", "coverage (>=6.2,<7.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.910)", "pytest (>=4.4.0,<8.0.0)", "pytest-cov (>=2.10.0,<5.0.0)", "pytest-sugar (>=0.9.4,<0.10.0)", "pytest-xdist (>=1.32.0,<4.0.0)", "rich (>=10.11.0,<14.0.0)", "shellingham (>=1.3.0,<2.0.0)"] +[[package]] +name = "types-python-dateutil" +version = "2.9.0.20240316" +description = "Typing stubs for python-dateutil" +optional = false +python-versions = ">=3.8" +files = [ + {file = "types-python-dateutil-2.9.0.20240316.tar.gz", hash = "sha256:5d2f2e240b86905e40944dd787db6da9263f0deabef1076ddaed797351ec0202"}, + {file = "types_python_dateutil-2.9.0.20240316-py3-none-any.whl", hash = "sha256:6b8cb66d960771ce5ff974e9dd45e38facb81718cc1e208b10b1baccbfdbee3b"}, +] [[package]] name = "typing-extensions" -version = "4.9.0" +version = "4.11.0" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"}, - {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, + {file = "typing_extensions-4.11.0-py3-none-any.whl", hash = "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"}, + {file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"}, ] [[package]] name = "urllib3" -version = "2.1.0" +version = "2.2.1" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.1.0-py3-none-any.whl", hash = "sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3"}, - {file = "urllib3-2.1.0.tar.gz", hash = "sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54"}, + {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, + {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, ] [package.extras] brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] [[package]] name = "voluptuous" -version = "0.14.1" +version = "0.14.2" description = "Python data validation library" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "voluptuous-0.14.1-py3-none-any.whl", hash = "sha256:ab202b5164b4bbd2c9bf2d4f264efef6f0f30fc0f570be27f1332be4514eefe0"}, - {file = "voluptuous-0.14.1.tar.gz", hash = "sha256:7b6e5f7553ce02461cce17fedb0e3603195496eb260ece9aca86cc4cc6625218"}, + {file = "voluptuous-0.14.2-py3-none-any.whl", hash = "sha256:efc1dadc9ae32a30cc622602c1400a17b7bf8ee2770d64f70418144860739c3b"}, + {file = "voluptuous-0.14.2.tar.gz", hash = "sha256:533e36175967a310f1b73170d091232bf881403e4ebe52a9b4ade8404d151f5d"}, ] +[[package]] +name = "wcmatch" +version = "8.5.1" +description = "Wildcard/glob file name matcher." +optional = false +python-versions = ">=3.8" +files = [ + {file = "wcmatch-8.5.1-py3-none-any.whl", hash = "sha256:24c19cedc92bc9c9e27f39db4e1824d72f95bd2cea32b254a47a45b1a1b227ed"}, + {file = "wcmatch-8.5.1.tar.gz", hash = "sha256:c0088c7f6426cf6bf27e530e2b7b734031905f7e490475fd83c7c5008ab581b3"}, +] + +[package.dependencies] +bracex = ">=2.1.1" + [[package]] name = "wrapt" version = "1.16.0" @@ -1764,13 +2721,13 @@ files = [ [[package]] name = "yamllint" -version = "1.33.0" +version = "1.35.1" description = "A linter for YAML files." optional = false python-versions = ">=3.8" files = [ - {file = "yamllint-1.33.0-py3-none-any.whl", hash = "sha256:28a19f5d68d28d8fec538a1db21bb2d84c7dc2e2ea36266da8d4d1c5a683814d"}, - {file = "yamllint-1.33.0.tar.gz", hash = "sha256:2dceab9ef2d99518a2fcf4ffc964d44250ac4459be1ba3ca315118e4a1a81f7d"}, + {file = "yamllint-1.35.1-py3-none-any.whl", hash = "sha256:2e16e504bb129ff515b37823b472750b36b6de07963bd74b307341ef5ad8bdc3"}, + {file = "yamllint-1.35.1.tar.gz", hash = "sha256:7a003809f88324fd2c877734f2d575ee7881dd9043360657cc8049c809eba6cd"}, ] [package.dependencies] @@ -1885,20 +2842,56 @@ multidict = ">=4.0" [[package]] name = "zipp" -version = "3.17.0" +version = "3.18.1" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, - {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, + {file = "zipp-3.18.1-py3-none-any.whl", hash = "sha256:206f5a15f2af3dbaee80769fb7dc6f249695e940acca08dfb2a4769fe61e538b"}, + {file = "zipp-3.18.1.tar.gz", hash = "sha256:2884ed22e7d8961de1c9a05142eb69a247f120291bc0206a00a7642f09b5b715"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] + +[[package]] +name = "zscaler-sdk-python" +version = "0.1.2" +description = "Official Python SDK for the Zscaler Products (Beta)" +optional = false +python-versions = "<4.0,>=3.8" +files = [ + {file = "zscaler-sdk-python-0.1.2.tar.gz", hash = "sha256:62ade86b44155e719b6c288216bc5ef2ed8ad0fd89debfd95fced6cbb80b85e5"}, + {file = "zscaler_sdk_python-0.1.2-py2.py3-none-any.whl", hash = "sha256:17eb22891eb1b479fafe6d38544aeef9a92b78cadf42985dfb9c13c26a0d849a"}, ] +[package.dependencies] +aenum = "*" +arrow = "*" +certifi = "*" +charset-normalizer = "*" +flake8 = "*" +flatdict = "*" +idna = "*" +pycryptodomex = "*" +pydash = "*" +python-box = "*" +python-dateutil = "*" +pytz = "*" +pyyaml = "*" +requests = "*" +responses = "*" +restfly = "*" +six = "*" +urllib3 = "*" +xmltodict = "*" +yarl = "*" + [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] +dev = ["aenum", "black", "isort", "pydash", "pyfakefs", "pytest", "pytest-asyncio", "pytest-cov", "pytest-mock", "pytest-recording", "wheel"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "55d19da2bf98af995c3773b49e72d9246a185af94576da191caf6feb4fc81281" +content-hash = "50957dc4b063646bd0928af5753e4638c03c3824eb94bac7527555b37f2f641b" diff --git a/pyproject.toml b/pyproject.toml index 8d61d6f..0f27d84 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,8 +1,8 @@ [tool.poetry] name = "ziacloud-ansible" -version = "1.0.0" +version = "0.1.0" description = "Ansible collection for Zscaler Internet Access" -authors = ["Zscaler Technology Alliances "] +authors = ["Zscaler Technology Alliances "] license = "MIT" keywords = ["ziacloud", "ziacloud-ansible", "zia"] readme = "README.md" @@ -11,12 +11,13 @@ repository = "https://github.com/zscaler/ziacloud-ansible" [tool.poetry.dependencies] python = "^3.9" -# zscaler-sdk-python = "^1.0.0" +zscaler-sdk-python = "*" xmltodict = "^0.12.0" aiohttp = ">=3.9.0" dpath = "^2.1.5" pytz = "*" netaddr = "*" +pycountry = "*" [tool.poetry.dev-dependencies] black = "24.3.0" @@ -27,13 +28,18 @@ pytest-xdist = "*" pytest-mock = "*" voluptuous = "*" yamllint = "*" -sphinx = "*" +sphinx = "^7.0.1" sphinx-rtd-theme = "*" +sphinx_ansible_theme = "*" #ansible-doc-extractor = "*" +antsibull-docs = "^2.10.0" +antsibull-changelog = "^0.26.0" +ansible-core = "*" +ansible-lint = "*" rstcheck = "*" six = "*" pycodestyle = "*" -#ansible-core = "~2" + # from requirements.txt certifi = "^2023.11.17" chardet = "3.0.4" diff --git a/requirements.txt b/requirements.txt index 00dd516..f14744a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,92 +1,198 @@ -aiohttp==3.9.1 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:02ab6006ec3c3463b528374c4cdce86434e7b89ad355e7bf29e2f16b46c7dd6f \ - --hash=sha256:04fa38875e53eb7e354ece1607b1d2fdee2d175ea4e4d745f6ec9f751fe20c7c \ - --hash=sha256:0b0a6a36ed7e164c6df1e18ee47afbd1990ce47cb428739d6c99aaabfaf1b3af \ - --hash=sha256:0d406b01a9f5a7e232d1b0d161b40c05275ffbcbd772dc18c1d5a570961a1ca4 \ - --hash=sha256:0e49b08eafa4f5707ecfb321ab9592717a319e37938e301d462f79b4e860c32a \ - --hash=sha256:0e7ba7ff228c0d9a2cd66194e90f2bca6e0abca810b786901a569c0de082f489 \ - --hash=sha256:11cb254e397a82efb1805d12561e80124928e04e9c4483587ce7390b3866d213 \ - --hash=sha256:11ff168d752cb41e8492817e10fb4f85828f6a0142b9726a30c27c35a1835f01 \ - --hash=sha256:176df045597e674fa950bf5ae536be85699e04cea68fa3a616cf75e413737eb5 \ - --hash=sha256:219a16763dc0294842188ac8a12262b5671817042b35d45e44fd0a697d8c8361 \ - --hash=sha256:22698f01ff5653fe66d16ffb7658f582a0ac084d7da1323e39fd9eab326a1f26 \ - --hash=sha256:237533179d9747080bcaad4d02083ce295c0d2eab3e9e8ce103411a4312991a0 \ - --hash=sha256:289ba9ae8e88d0ba16062ecf02dd730b34186ea3b1e7489046fc338bdc3361c4 \ - --hash=sha256:2c59e0076ea31c08553e868cec02d22191c086f00b44610f8ab7363a11a5d9d8 \ - --hash=sha256:2c9376e2b09895c8ca8b95362283365eb5c03bdc8428ade80a864160605715f1 \ - --hash=sha256:3135713c5562731ee18f58d3ad1bf41e1d8883eb68b363f2ffde5b2ea4b84cc7 \ - --hash=sha256:3b9c7426923bb7bd66d409da46c41e3fb40f5caf679da624439b9eba92043fa6 \ - --hash=sha256:3c0266cd6f005e99f3f51e583012de2778e65af6b73860038b968a0a8888487a \ - --hash=sha256:41473de252e1797c2d2293804e389a6d6986ef37cbb4a25208de537ae32141dd \ - --hash=sha256:4831df72b053b1eed31eb00a2e1aff6896fb4485301d4ccb208cac264b648db4 \ - --hash=sha256:49f0c1b3c2842556e5de35f122fc0f0b721334ceb6e78c3719693364d4af8499 \ - --hash=sha256:4b4c452d0190c5a820d3f5c0f3cd8a28ace48c54053e24da9d6041bf81113183 \ - --hash=sha256:4ee8caa925aebc1e64e98432d78ea8de67b2272252b0a931d2ac3bd876ad5544 \ - --hash=sha256:500f1c59906cd142d452074f3811614be04819a38ae2b3239a48b82649c08821 \ - --hash=sha256:5216b6082c624b55cfe79af5d538e499cd5f5b976820eac31951fb4325974501 \ - --hash=sha256:54311eb54f3a0c45efb9ed0d0a8f43d1bc6060d773f6973efd90037a51cd0a3f \ - --hash=sha256:54631fb69a6e44b2ba522f7c22a6fb2667a02fd97d636048478db2fd8c4e98fe \ - --hash=sha256:565760d6812b8d78d416c3c7cfdf5362fbe0d0d25b82fed75d0d29e18d7fc30f \ - --hash=sha256:598db66eaf2e04aa0c8900a63b0101fdc5e6b8a7ddd805c56d86efb54eb66672 \ - --hash=sha256:5c4fa235d534b3547184831c624c0b7c1e262cd1de847d95085ec94c16fddcd5 \ - --hash=sha256:69985d50a2b6f709412d944ffb2e97d0be154ea90600b7a921f95a87d6f108a2 \ - --hash=sha256:69da0f3ed3496808e8cbc5123a866c41c12c15baaaead96d256477edf168eb57 \ - --hash=sha256:6c93b7c2e52061f0925c3382d5cb8980e40f91c989563d3d32ca280069fd6a87 \ - --hash=sha256:70907533db712f7aa791effb38efa96f044ce3d4e850e2d7691abd759f4f0ae0 \ - --hash=sha256:81b77f868814346662c96ab36b875d7814ebf82340d3284a31681085c051320f \ - --hash=sha256:82eefaf1a996060602f3cc1112d93ba8b201dbf5d8fd9611227de2003dddb3b7 \ - --hash=sha256:85c3e3c9cb1d480e0b9a64c658cd66b3cfb8e721636ab8b0e746e2d79a7a9eed \ - --hash=sha256:8a22a34bc594d9d24621091d1b91511001a7eea91d6652ea495ce06e27381f70 \ - --hash=sha256:8cef8710fb849d97c533f259103f09bac167a008d7131d7b2b0e3a33269185c0 \ - --hash=sha256:8d44e7bf06b0c0a70a20f9100af9fcfd7f6d9d3913e37754c12d424179b4e48f \ - --hash=sha256:8d7f98fde213f74561be1d6d3fa353656197f75d4edfbb3d94c9eb9b0fc47f5d \ - --hash=sha256:8d8e4450e7fe24d86e86b23cc209e0023177b6d59502e33807b732d2deb6975f \ - --hash=sha256:8fc49a87ac269d4529da45871e2ffb6874e87779c3d0e2ccd813c0899221239d \ - --hash=sha256:90ec72d231169b4b8d6085be13023ece8fa9b1bb495e4398d847e25218e0f431 \ - --hash=sha256:91c742ca59045dce7ba76cab6e223e41d2c70d79e82c284a96411f8645e2afff \ - --hash=sha256:9b05d33ff8e6b269e30a7957bd3244ffbce2a7a35a81b81c382629b80af1a8bf \ - --hash=sha256:9b05d5cbe9dafcdc733262c3a99ccf63d2f7ce02543620d2bd8db4d4f7a22f83 \ - --hash=sha256:9c5857612c9813796960c00767645cb5da815af16dafb32d70c72a8390bbf690 \ - --hash=sha256:a34086c5cc285be878622e0a6ab897a986a6e8bf5b67ecb377015f06ed316587 \ - --hash=sha256:ab221850108a4a063c5b8a70f00dd7a1975e5a1713f87f4ab26a46e5feac5a0e \ - --hash=sha256:b796b44111f0cab6bbf66214186e44734b5baab949cb5fb56154142a92989aeb \ - --hash=sha256:b8c3a67eb87394386847d188996920f33b01b32155f0a94f36ca0e0c635bf3e3 \ - --hash=sha256:bcb6532b9814ea7c5a6a3299747c49de30e84472fa72821b07f5a9818bce0f66 \ - --hash=sha256:bcc0ea8d5b74a41b621ad4a13d96c36079c81628ccc0b30cfb1603e3dfa3a014 \ - --hash=sha256:bea94403a21eb94c93386d559bce297381609153e418a3ffc7d6bf772f59cc35 \ - --hash=sha256:bff7e2811814fa2271be95ab6e84c9436d027a0e59665de60edf44e529a42c1f \ - --hash=sha256:c72444d17777865734aa1a4d167794c34b63e5883abb90356a0364a28904e6c0 \ - --hash=sha256:c7b5d5d64e2a14e35a9240b33b89389e0035e6de8dbb7ffa50d10d8b65c57449 \ - --hash=sha256:c7e939f1ae428a86e4abbb9a7c4732bf4706048818dfd979e5e2839ce0159f23 \ - --hash=sha256:c88a15f272a0ad3d7773cf3a37cc7b7d077cbfc8e331675cf1346e849d97a4e5 \ - --hash=sha256:c9110c06eaaac7e1f5562caf481f18ccf8f6fdf4c3323feab28a93d34cc646bd \ - --hash=sha256:ca7ca5abfbfe8d39e653870fbe8d7710be7a857f8a8386fc9de1aae2e02ce7e4 \ - --hash=sha256:cae4c0c2ca800c793cae07ef3d40794625471040a87e1ba392039639ad61ab5b \ - --hash=sha256:cdefe289681507187e375a5064c7599f52c40343a8701761c802c1853a504558 \ - --hash=sha256:cf2a0ac0615842b849f40c4d7f304986a242f1e68286dbf3bd7a835e4f83acfd \ - --hash=sha256:cfeadf42840c1e870dc2042a232a8748e75a36b52d78968cda6736de55582766 \ - --hash=sha256:d737e69d193dac7296365a6dcb73bbbf53bb760ab25a3727716bbd42022e8d7a \ - --hash=sha256:d7481f581251bb5558ba9f635db70908819caa221fc79ee52a7f58392778c636 \ - --hash=sha256:df9cf74b9bc03d586fc53ba470828d7b77ce51b0582d1d0b5b2fb673c0baa32d \ - --hash=sha256:e1f80197f8b0b846a8d5cf7b7ec6084493950d0882cc5537fb7b96a69e3c8590 \ - --hash=sha256:ecca113f19d5e74048c001934045a2b9368d77b0b17691d905af18bd1c21275e \ - --hash=sha256:ee2527134f95e106cc1653e9ac78846f3a2ec1004cf20ef4e02038035a74544d \ - --hash=sha256:f27fdaadce22f2ef950fc10dcdf8048407c3b42b73779e48a4e76b3c35bca26c \ - --hash=sha256:f694dc8a6a3112059258a725a4ebe9acac5fe62f11c77ac4dcf896edfa78ca28 \ - --hash=sha256:f800164276eec54e0af5c99feb9494c295118fc10a11b997bbb1348ba1a52065 \ - --hash=sha256:ffcd828e37dc219a72c9012ec44ad2e7e3066bec6ff3aaa19e7d435dbf4032ca +aenum==3.1.15 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:27b1710b9d084de6e2e695dab78fe9f269de924b51ae2850170ee7e1ca6288a5 \ + --hash=sha256:8cbd76cd18c4f870ff39b24284d3ea028fbe8731a58df3aa581e434c575b9559 \ + --hash=sha256:e0dfaeea4c2bd362144b87377e2c61d91958c5ed0b4daf89cb6f45ae23af6288 +aiohttp==3.9.5 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:0605cc2c0088fcaae79f01c913a38611ad09ba68ff482402d3410bf59039bfb8 \ + --hash=sha256:0a158704edf0abcac8ac371fbb54044f3270bdbc93e254a82b6c82be1ef08f3c \ + --hash=sha256:0cbf56238f4bbf49dab8c2dc2e6b1b68502b1e88d335bea59b3f5b9f4c001475 \ + --hash=sha256:1732102949ff6087589408d76cd6dea656b93c896b011ecafff418c9661dc4ed \ + --hash=sha256:18f634d540dd099c262e9f887c8bbacc959847cfe5da7a0e2e1cf3f14dbf2daf \ + --hash=sha256:239f975589a944eeb1bad26b8b140a59a3a320067fb3cd10b75c3092405a1372 \ + --hash=sha256:2faa61a904b83142747fc6a6d7ad8fccff898c849123030f8e75d5d967fd4a81 \ + --hash=sha256:320e8618eda64e19d11bdb3bd04ccc0a816c17eaecb7e4945d01deee2a22f95f \ + --hash=sha256:38d80498e2e169bc61418ff36170e0aad0cd268da8b38a17c4cf29d254a8b3f1 \ + --hash=sha256:3916c8692dbd9d55c523374a3b8213e628424d19116ac4308e434dbf6d95bbdd \ + --hash=sha256:393c7aba2b55559ef7ab791c94b44f7482a07bf7640d17b341b79081f5e5cd1a \ + --hash=sha256:3b7b30258348082826d274504fbc7c849959f1989d86c29bc355107accec6cfb \ + --hash=sha256:3fcb4046d2904378e3aeea1df51f697b0467f2aac55d232c87ba162709478c46 \ + --hash=sha256:4109adee842b90671f1b689901b948f347325045c15f46b39797ae1bf17019de \ + --hash=sha256:4558e5012ee03d2638c681e156461d37b7a113fe13970d438d95d10173d25f78 \ + --hash=sha256:45731330e754f5811c314901cebdf19dd776a44b31927fa4b4dbecab9e457b0c \ + --hash=sha256:4715a9b778f4293b9f8ae7a0a7cef9829f02ff8d6277a39d7f40565c737d3771 \ + --hash=sha256:471f0ef53ccedec9995287f02caf0c068732f026455f07db3f01a46e49d76bbb \ + --hash=sha256:4d3ebb9e1316ec74277d19c5f482f98cc65a73ccd5430540d6d11682cd857430 \ + --hash=sha256:4ff550491f5492ab5ed3533e76b8567f4b37bd2995e780a1f46bca2024223233 \ + --hash=sha256:52c27110f3862a1afbcb2af4281fc9fdc40327fa286c4625dfee247c3ba90156 \ + --hash=sha256:55b39c8684a46e56ef8c8d24faf02de4a2b2ac60d26cee93bc595651ff545de9 \ + --hash=sha256:5a7ee16aab26e76add4afc45e8f8206c95d1d75540f1039b84a03c3b3800dd59 \ + --hash=sha256:5ca51eadbd67045396bc92a4345d1790b7301c14d1848feaac1d6a6c9289e888 \ + --hash=sha256:5d6b3f1fabe465e819aed2c421a6743d8debbde79b6a8600739300630a01bf2c \ + --hash=sha256:60cdbd56f4cad9f69c35eaac0fbbdf1f77b0ff9456cebd4902f3dd1cf096464c \ + --hash=sha256:6380c039ec52866c06d69b5c7aad5478b24ed11696f0e72f6b807cfb261453da \ + --hash=sha256:639d0042b7670222f33b0028de6b4e2fad6451462ce7df2af8aee37dcac55424 \ + --hash=sha256:66331d00fb28dc90aa606d9a54304af76b335ae204d1836f65797d6fe27f1ca2 \ + --hash=sha256:67c3119f5ddc7261d47163ed86d760ddf0e625cd6246b4ed852e82159617b5fb \ + --hash=sha256:694d828b5c41255e54bc2dddb51a9f5150b4eefa9886e38b52605a05d96566e8 \ + --hash=sha256:6ae79c1bc12c34082d92bf9422764f799aee4746fd7a392db46b7fd357d4a17a \ + --hash=sha256:702e2c7c187c1a498a4e2b03155d52658fdd6fda882d3d7fbb891a5cf108bb10 \ + --hash=sha256:714d4e5231fed4ba2762ed489b4aec07b2b9953cf4ee31e9871caac895a839c0 \ + --hash=sha256:7b179eea70833c8dee51ec42f3b4097bd6370892fa93f510f76762105568cf09 \ + --hash=sha256:7f64cbd44443e80094309875d4f9c71d0401e966d191c3d469cde4642bc2e031 \ + --hash=sha256:82a6a97d9771cb48ae16979c3a3a9a18b600a8505b1115cfe354dfb2054468b4 \ + --hash=sha256:84dabd95154f43a2ea80deffec9cb44d2e301e38a0c9d331cc4aa0166fe28ae3 \ + --hash=sha256:8676e8fd73141ded15ea586de0b7cda1542960a7b9ad89b2b06428e97125d4fa \ + --hash=sha256:88e311d98cc0bf45b62fc46c66753a83445f5ab20038bcc1b8a1cc05666f428a \ + --hash=sha256:8b4f72fbb66279624bfe83fd5eb6aea0022dad8eec62b71e7bf63ee1caadeafe \ + --hash=sha256:8c64a6dc3fe5db7b1b4d2b5cb84c4f677768bdc340611eca673afb7cf416ef5a \ + --hash=sha256:8cf142aa6c1a751fcb364158fd710b8a9be874b81889c2bd13aa8893197455e2 \ + --hash=sha256:8d1964eb7617907c792ca00b341b5ec3e01ae8c280825deadbbd678447b127e1 \ + --hash=sha256:93e22add827447d2e26d67c9ac0161756007f152fdc5210277d00a85f6c92323 \ + --hash=sha256:9c69e77370cce2d6df5d12b4e12bdcca60c47ba13d1cbbc8645dd005a20b738b \ + --hash=sha256:9dbc053ac75ccc63dc3a3cc547b98c7258ec35a215a92bd9f983e0aac95d3d5b \ + --hash=sha256:9e3a1ae66e3d0c17cf65c08968a5ee3180c5a95920ec2731f53343fac9bad106 \ + --hash=sha256:a6ea1a5b409a85477fd8e5ee6ad8f0e40bf2844c270955e09360418cfd09abac \ + --hash=sha256:a81b1143d42b66ffc40a441379387076243ef7b51019204fd3ec36b9f69e77d6 \ + --hash=sha256:ad7f2919d7dac062f24d6f5fe95d401597fbb015a25771f85e692d043c9d7832 \ + --hash=sha256:afc52b8d969eff14e069a710057d15ab9ac17cd4b6753042c407dcea0e40bf75 \ + --hash=sha256:b3df71da99c98534be076196791adca8819761f0bf6e08e07fd7da25127150d6 \ + --hash=sha256:c088c4d70d21f8ca5c0b8b5403fe84a7bc8e024161febdd4ef04575ef35d474d \ + --hash=sha256:c26959ca7b75ff768e2776d8055bf9582a6267e24556bb7f7bd29e677932be72 \ + --hash=sha256:c413016880e03e69d166efb5a1a95d40f83d5a3a648d16486592c49ffb76d0db \ + --hash=sha256:c6021d296318cb6f9414b48e6a439a7f5d1f665464da507e8ff640848ee2a58a \ + --hash=sha256:c671dc117c2c21a1ca10c116cfcd6e3e44da7fcde37bf83b2be485ab377b25da \ + --hash=sha256:c7a4b7a6cf5b6eb11e109a9755fd4fda7d57395f8c575e166d363b9fc3ec4678 \ + --hash=sha256:c8a02fbeca6f63cb1f0475c799679057fc9268b77075ab7cf3f1c600e81dd46b \ + --hash=sha256:cd2adf5c87ff6d8b277814a28a535b59e20bfea40a101db6b3bdca7e9926bc24 \ + --hash=sha256:d1469f228cd9ffddd396d9948b8c9cd8022b6d1bf1e40c6f25b0fb90b4f893ed \ + --hash=sha256:d153f652a687a8e95ad367a86a61e8d53d528b0530ef382ec5aaf533140ed00f \ + --hash=sha256:d5ab8e1f6bee051a4bf6195e38a5c13e5e161cb7bad83d8854524798bd9fcd6e \ + --hash=sha256:da00da442a0e31f1c69d26d224e1efd3a1ca5bcbf210978a2ca7426dfcae9f58 \ + --hash=sha256:da22dab31d7180f8c3ac7c7635f3bcd53808f374f6aa333fe0b0b9e14b01f91a \ + --hash=sha256:e0ae53e33ee7476dd3d1132f932eeb39bf6125083820049d06edcdca4381f342 \ + --hash=sha256:e7a6a8354f1b62e15d48e04350f13e726fa08b62c3d7b8401c0a1314f02e3558 \ + --hash=sha256:e9a3d838441bebcf5cf442700e3963f58b5c33f015341f9ea86dcd7d503c07e2 \ + --hash=sha256:edea7d15772ceeb29db4aff55e482d4bcfb6ae160ce144f2682de02f6d693551 \ + --hash=sha256:f22eb3a6c1080d862befa0a89c380b4dafce29dc6cd56083f630073d102eb595 \ + --hash=sha256:f26383adb94da5e7fb388d441bf09c61e5e35f455a3217bfd790c6b6bc64b2ee \ + --hash=sha256:f3c2890ca8c59ee683fd09adf32321a40fe1cf164e3387799efb2acebf090c11 \ + --hash=sha256:f64fd07515dad67f24b6ea4a66ae2876c01031de91c93075b8093f07c0a2d93d \ + --hash=sha256:fcde4c397f673fdec23e6b05ebf8d4751314fa7c24f93334bf1f1364c1c69ac7 \ + --hash=sha256:ff84aeb864e0fac81f676be9f4685f0527b660f1efdc40dcede3c251ef1e867f aiosignal==1.3.1 ; python_version >= "3.9" and python_version < "4.0" \ --hash=sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc \ --hash=sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17 +arrow==1.3.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80 \ + --hash=sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85 async-timeout==4.0.3 ; python_version >= "3.9" and python_version < "3.11" \ --hash=sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f \ --hash=sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028 -attrs==23.1.0 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04 \ - --hash=sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015 +attrs==23.2.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30 \ + --hash=sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1 +certifi==2023.11.17 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1 \ + --hash=sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474 +charset-normalizer==3.3.2 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027 \ + --hash=sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087 \ + --hash=sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786 \ + --hash=sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8 \ + --hash=sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09 \ + --hash=sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185 \ + --hash=sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574 \ + --hash=sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e \ + --hash=sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519 \ + --hash=sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898 \ + --hash=sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269 \ + --hash=sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3 \ + --hash=sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f \ + --hash=sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6 \ + --hash=sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8 \ + --hash=sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a \ + --hash=sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73 \ + --hash=sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc \ + --hash=sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714 \ + --hash=sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2 \ + --hash=sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc \ + --hash=sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce \ + --hash=sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d \ + --hash=sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e \ + --hash=sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6 \ + --hash=sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269 \ + --hash=sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96 \ + --hash=sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d \ + --hash=sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a \ + --hash=sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4 \ + --hash=sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77 \ + --hash=sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d \ + --hash=sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0 \ + --hash=sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed \ + --hash=sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068 \ + --hash=sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac \ + --hash=sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25 \ + --hash=sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8 \ + --hash=sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab \ + --hash=sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26 \ + --hash=sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2 \ + --hash=sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db \ + --hash=sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f \ + --hash=sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5 \ + --hash=sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99 \ + --hash=sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c \ + --hash=sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d \ + --hash=sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811 \ + --hash=sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa \ + --hash=sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a \ + --hash=sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03 \ + --hash=sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b \ + --hash=sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04 \ + --hash=sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c \ + --hash=sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001 \ + --hash=sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458 \ + --hash=sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389 \ + --hash=sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99 \ + --hash=sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985 \ + --hash=sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537 \ + --hash=sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238 \ + --hash=sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f \ + --hash=sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d \ + --hash=sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796 \ + --hash=sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a \ + --hash=sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143 \ + --hash=sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8 \ + --hash=sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c \ + --hash=sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5 \ + --hash=sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5 \ + --hash=sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711 \ + --hash=sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4 \ + --hash=sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6 \ + --hash=sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c \ + --hash=sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7 \ + --hash=sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4 \ + --hash=sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b \ + --hash=sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae \ + --hash=sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12 \ + --hash=sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c \ + --hash=sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae \ + --hash=sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8 \ + --hash=sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887 \ + --hash=sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b \ + --hash=sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4 \ + --hash=sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f \ + --hash=sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5 \ + --hash=sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33 \ + --hash=sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519 \ + --hash=sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561 dpath==2.1.6 ; python_version >= "3.9" and python_version < "4.0" \ --hash=sha256:31407395b177ab63ef72e2f6ae268c15e938f2990a8ecf6510f5686c02b6db73 \ --hash=sha256:f1e07c72e8605c6a9e80b64bc8f42714de08a789c7de417e49c3f87a19692e47 +flake8==7.0.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:33f96621059e65eec474169085dc92bf26e7b2d47366b70be2f67ab80dc25132 \ + --hash=sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3 +flatdict==4.0.1 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:cd32f08fd31ed21eb09ebc76f06b6bd12046a24f77beb1fd0281917e47f26742 frozenlist==1.4.1 ; python_version >= "3.9" and python_version < "4.0" \ --hash=sha256:04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7 \ --hash=sha256:0633c8d5337cb5c77acbccc6357ac49a1770b8c487e5b3505c57b949b4b82e98 \ @@ -165,90 +271,245 @@ frozenlist==1.4.1 ; python_version >= "3.9" and python_version < "4.0" \ --hash=sha256:fbeb989b5cc29e8daf7f976b421c220f1b8c731cbf22b9130d8815418ea45887 \ --hash=sha256:fde5bd59ab5357e3853313127f4d3565fc7dad314a74d7b5d43c22c6a5ed2ced \ --hash=sha256:fe1a06da377e3a1062ae5fe0926e12b84eceb8a50b350ddca72dc85015873f74 -idna==2.8 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407 \ - --hash=sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c -multidict==6.0.4 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9 \ - --hash=sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8 \ - --hash=sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03 \ - --hash=sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710 \ - --hash=sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161 \ - --hash=sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664 \ - --hash=sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569 \ - --hash=sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067 \ - --hash=sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313 \ - --hash=sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706 \ - --hash=sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2 \ - --hash=sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636 \ - --hash=sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49 \ - --hash=sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93 \ - --hash=sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603 \ - --hash=sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0 \ - --hash=sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60 \ - --hash=sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4 \ - --hash=sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e \ - --hash=sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1 \ - --hash=sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60 \ - --hash=sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951 \ - --hash=sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc \ - --hash=sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe \ - --hash=sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95 \ - --hash=sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d \ - --hash=sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8 \ - --hash=sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed \ - --hash=sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2 \ - --hash=sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775 \ - --hash=sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87 \ - --hash=sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c \ - --hash=sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2 \ - --hash=sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98 \ - --hash=sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3 \ - --hash=sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe \ - --hash=sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78 \ - --hash=sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660 \ - --hash=sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176 \ - --hash=sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e \ - --hash=sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988 \ - --hash=sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c \ - --hash=sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c \ - --hash=sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0 \ - --hash=sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449 \ - --hash=sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f \ - --hash=sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde \ - --hash=sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5 \ - --hash=sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d \ - --hash=sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac \ - --hash=sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a \ - --hash=sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9 \ - --hash=sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca \ - --hash=sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11 \ - --hash=sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35 \ - --hash=sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063 \ - --hash=sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b \ - --hash=sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982 \ - --hash=sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258 \ - --hash=sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1 \ - --hash=sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52 \ - --hash=sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480 \ - --hash=sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7 \ - --hash=sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461 \ - --hash=sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d \ - --hash=sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc \ - --hash=sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779 \ - --hash=sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a \ - --hash=sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547 \ - --hash=sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0 \ - --hash=sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171 \ - --hash=sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf \ - --hash=sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d \ - --hash=sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba -netaddr==0.9.0 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:5148b1055679d2a1ec070c521b7db82137887fabd6d7e37f5199b44f775c3bb1 \ - --hash=sha256:7b46fa9b1a2d71fd5de9e4a3784ef339700a53a08c8040f08baf5f1194da0128 -pytz==2023.3.post1 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b \ - --hash=sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7 +idna==3.7 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc \ + --hash=sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0 +mccabe==0.7.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325 \ + --hash=sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e +multidict==6.0.5 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556 \ + --hash=sha256:0275e35209c27a3f7951e1ce7aaf93ce0d163b28948444bec61dd7badc6d3f8c \ + --hash=sha256:04bde7a7b3de05732a4eb39c94574db1ec99abb56162d6c520ad26f83267de29 \ + --hash=sha256:04da1bb8c8dbadf2a18a452639771951c662c5ad03aefe4884775454be322c9b \ + --hash=sha256:09a892e4a9fb47331da06948690ae38eaa2426de97b4ccbfafbdcbe5c8f37ff8 \ + --hash=sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7 \ + --hash=sha256:107c0cdefe028703fb5dafe640a409cb146d44a6ae201e55b35a4af8e95457dd \ + --hash=sha256:141b43360bfd3bdd75f15ed811850763555a251e38b2405967f8e25fb43f7d40 \ + --hash=sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6 \ + --hash=sha256:19fe01cea168585ba0f678cad6f58133db2aa14eccaf22f88e4a6dccadfad8b3 \ + --hash=sha256:1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c \ + --hash=sha256:1d9ea7a7e779d7a3561aade7d596649fbecfa5c08a7674b11b423783217933f9 \ + --hash=sha256:215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5 \ + --hash=sha256:21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae \ + --hash=sha256:220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442 \ + --hash=sha256:228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9 \ + --hash=sha256:29bfeb0dff5cb5fdab2023a7a9947b3b4af63e9c47cae2a10ad58394b517fddc \ + --hash=sha256:2f4848aa3baa109e6ab81fe2006c77ed4d3cd1e0ac2c1fbddb7b1277c168788c \ + --hash=sha256:2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea \ + --hash=sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5 \ + --hash=sha256:37b15024f864916b4951adb95d3a80c9431299080341ab9544ed148091b53f50 \ + --hash=sha256:3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182 \ + --hash=sha256:3d25f19500588cbc47dc19081d78131c32637c25804df8414463ec908631e453 \ + --hash=sha256:403c0911cd5d5791605808b942c88a8155c2592e05332d2bf78f18697a5fa15e \ + --hash=sha256:411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600 \ + --hash=sha256:425bf820055005bfc8aa9a0b99ccb52cc2f4070153e34b701acc98d201693733 \ + --hash=sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda \ + --hash=sha256:4a6a4f196f08c58c59e0b8ef8ec441d12aee4125a7d4f4fef000ccb22f8d7241 \ + --hash=sha256:4cc0ef8b962ac7a5e62b9e826bd0cd5040e7d401bc45a6835910ed699037a461 \ + --hash=sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e \ + --hash=sha256:53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e \ + --hash=sha256:55205d03e8a598cfc688c71ca8ea5f66447164efff8869517f175ea632c7cb7b \ + --hash=sha256:5c0631926c4f58e9a5ccce555ad7747d9a9f8b10619621f22f9635f069f6233e \ + --hash=sha256:5cb241881eefd96b46f89b1a056187ea8e9ba14ab88ba632e68d7a2ecb7aadf7 \ + --hash=sha256:60d698e8179a42ec85172d12f50b1668254628425a6bd611aba022257cac1386 \ + --hash=sha256:612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd \ + --hash=sha256:6214c5a5571802c33f80e6c84713b2c79e024995b9c5897f794b43e714daeec9 \ + --hash=sha256:6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf \ + --hash=sha256:69db76c09796b313331bb7048229e3bee7928eb62bab5e071e9f7fcc4879caee \ + --hash=sha256:6bf7a982604375a8d49b6cc1b781c1747f243d91b81035a9b43a2126c04766f5 \ + --hash=sha256:766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a \ + --hash=sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271 \ + --hash=sha256:76f067f5121dcecf0d63a67f29080b26c43c71a98b10c701b0677e4a065fbd54 \ + --hash=sha256:7901c05ead4b3fb75113fb1dd33eb1253c6d3ee37ce93305acd9d38e0b5f21a4 \ + --hash=sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496 \ + --hash=sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb \ + --hash=sha256:7afcdd1fc07befad18ec4523a782cde4e93e0a2bf71239894b8d61ee578c1319 \ + --hash=sha256:7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3 \ + --hash=sha256:7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f \ + --hash=sha256:7df704ca8cf4a073334e0427ae2345323613e4df18cc224f647f251e5e75a527 \ + --hash=sha256:85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed \ + --hash=sha256:896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604 \ + --hash=sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef \ + --hash=sha256:99f60d34c048c5c2fabc766108c103612344c46e35d4ed9ae0673d33c8fb26e8 \ + --hash=sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5 \ + --hash=sha256:a3145cb08d8625b2d3fee1b2d596a8766352979c9bffe5d7833e0503d0f0b5e5 \ + --hash=sha256:aeaf541ddbad8311a87dd695ed9642401131ea39ad7bc8cf3ef3967fd093b626 \ + --hash=sha256:b55358304d7a73d7bdf5de62494aaf70bd33015831ffd98bc498b433dfe5b10c \ + --hash=sha256:b82cc8ace10ab5bd93235dfaab2021c70637005e1ac787031f4d1da63d493c1d \ + --hash=sha256:c0868d64af83169e4d4152ec612637a543f7a336e4a307b119e98042e852ad9c \ + --hash=sha256:c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc \ + --hash=sha256:c9bf56195c6bbd293340ea82eafd0071cb3d450c703d2c93afb89f93b8386ccc \ + --hash=sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b \ + --hash=sha256:cd6c8fca38178e12c00418de737aef1261576bd1b6e8c6134d3e729a4e858b38 \ + --hash=sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450 \ + --hash=sha256:cf590b134eb70629e350691ecca88eac3e3b8b3c86992042fb82e3cb1830d5e1 \ + --hash=sha256:d3eb1ceec286eba8220c26f3b0096cf189aea7057b6e7b7a2e60ed36b373b77f \ + --hash=sha256:d65f25da8e248202bd47445cec78e0025c0fe7582b23ec69c3b27a640dd7a8e3 \ + --hash=sha256:d6f6d4f185481c9669b9447bf9d9cf3b95a0e9df9d169bbc17e363b7d5487755 \ + --hash=sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226 \ + --hash=sha256:d946b0a9eb8aaa590df1fe082cee553ceab173e6cb5b03239716338629c50c7a \ + --hash=sha256:dce1c6912ab9ff5f179eaf6efe7365c1f425ed690b03341911bf4939ef2f3046 \ + --hash=sha256:de170c7b4fe6859beb8926e84f7d7d6c693dfe8e27372ce3b76f01c46e489fcf \ + --hash=sha256:e02021f87a5b6932fa6ce916ca004c4d441509d33bbdbeca70d05dff5e9d2479 \ + --hash=sha256:e030047e85cbcedbfc073f71836d62dd5dadfbe7531cae27789ff66bc551bd5e \ + --hash=sha256:e0e79d91e71b9867c73323a3444724d496c037e578a0e1755ae159ba14f4f3d1 \ + --hash=sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a \ + --hash=sha256:e4972624066095e52b569e02b5ca97dbd7a7ddd4294bf4e7247d52635630dd83 \ + --hash=sha256:e7be68734bd8c9a513f2b0cfd508802d6609da068f40dc57d4e3494cefc92929 \ + --hash=sha256:e8e94e6912639a02ce173341ff62cc1201232ab86b8a8fcc05572741a5dc7d93 \ + --hash=sha256:ea1456df2a27c73ce51120fa2f519f1bea2f4a03a917f4a43c8707cf4cbbae1a \ + --hash=sha256:ebd8d160f91a764652d3e51ce0d2956b38efe37c9231cd82cfc0bed2e40b581c \ + --hash=sha256:eca2e9d0cc5a889850e9bbd68e98314ada174ff6ccd1129500103df7a94a7a44 \ + --hash=sha256:edd08e6f2f1a390bf137080507e44ccc086353c8e98c657e666c017718561b89 \ + --hash=sha256:f285e862d2f153a70586579c15c44656f888806ed0e5b56b64489afe4a2dbfba \ + --hash=sha256:f2a1dee728b52b33eebff5072817176c172050d44d67befd681609b4746e1c2e \ + --hash=sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da \ + --hash=sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24 \ + --hash=sha256:fce28b3c8a81b6b36dfac9feb1de115bab619b3c13905b419ec71d03a3fc1423 \ + --hash=sha256:fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef +netaddr==1.2.1 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:6eb8fedf0412c6d294d06885c110de945cf4d22d2b510d0404f4e06950857987 \ + --hash=sha256:bd9e9534b0d46af328cf64f0e5a23a5a43fca292df221c85580b27394793496e +pycodestyle==2.11.1 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f \ + --hash=sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67 +pycountry==23.12.11 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:00569d82eaefbc6a490a311bfa84a9c571cff9ddbf8b0a4f4e7b4f868b4ad925 \ + --hash=sha256:2ff91cff4f40ff61086e773d61e72005fe95de4a57bfc765509db05695dc50ab +pycryptodomex==3.20.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:0daad007b685db36d977f9de73f61f8da2a7104e20aca3effd30752fd56f73e1 \ + --hash=sha256:108e5f1c1cd70ffce0b68739c75734437c919d2eaec8e85bffc2c8b4d2794305 \ + --hash=sha256:19764605feea0df966445d46533729b645033f134baeb3ea26ad518c9fdf212c \ + --hash=sha256:1be97461c439a6af4fe1cf8bf6ca5936d3db252737d2f379cc6b2e394e12a458 \ + --hash=sha256:25cd61e846aaab76d5791d006497134602a9e451e954833018161befc3b5b9ed \ + --hash=sha256:2a47bcc478741b71273b917232f521fd5704ab4b25d301669879e7273d3586cc \ + --hash=sha256:59af01efb011b0e8b686ba7758d59cf4a8263f9ad35911bfe3f416cee4f5c08c \ + --hash=sha256:5dcac11031a71348faaed1f403a0debd56bf5404232284cf8c761ff918886ebc \ + --hash=sha256:62a5ec91388984909bb5398ea49ee61b68ecb579123694bffa172c3b0a107079 \ + --hash=sha256:645bd4ca6f543685d643dadf6a856cc382b654cc923460e3a10a49c1b3832aeb \ + --hash=sha256:653b29b0819605fe0898829c8ad6400a6ccde096146730c2da54eede9b7b8baa \ + --hash=sha256:69138068268127cd605e03438312d8f271135a33140e2742b417d027a0539427 \ + --hash=sha256:6e186342cfcc3aafaad565cbd496060e5a614b441cacc3995ef0091115c1f6c5 \ + --hash=sha256:76bd15bb65c14900d98835fcd10f59e5e0435077431d3a394b60b15864fddd64 \ + --hash=sha256:7805830e0c56d88f4d491fa5ac640dfc894c5ec570d1ece6ed1546e9df2e98d6 \ + --hash=sha256:7a710b79baddd65b806402e14766c721aee8fb83381769c27920f26476276c1e \ + --hash=sha256:7a7a8f33a1f1fb762ede6cc9cbab8f2a9ba13b196bfaf7bc6f0b39d2ba315a43 \ + --hash=sha256:82ee7696ed8eb9a82c7037f32ba9b7c59e51dda6f105b39f043b6ef293989cb3 \ + --hash=sha256:88afd7a3af7ddddd42c2deda43d53d3dfc016c11327d0915f90ca34ebda91499 \ + --hash=sha256:8af1a451ff9e123d0d8bd5d5e60f8e3315c3a64f3cdd6bc853e26090e195cdc8 \ + --hash=sha256:8ee606964553c1a0bc74057dd8782a37d1c2bc0f01b83193b6f8bb14523b877b \ + --hash=sha256:91852d4480a4537d169c29a9d104dda44094c78f1f5b67bca76c29a91042b623 \ + --hash=sha256:9c682436c359b5ada67e882fec34689726a09c461efd75b6ea77b2403d5665b7 \ + --hash=sha256:bc3ee1b4d97081260d92ae813a83de4d2653206967c4a0a017580f8b9548ddbc \ + --hash=sha256:bca649483d5ed251d06daf25957f802e44e6bb6df2e8f218ae71968ff8f8edc4 \ + --hash=sha256:c39778fd0548d78917b61f03c1fa8bfda6cfcf98c767decf360945fe6f97461e \ + --hash=sha256:cbe71b6712429650e3883dc81286edb94c328ffcd24849accac0a4dbcc76958a \ + --hash=sha256:d00fe8596e1cc46b44bf3907354e9377aa030ec4cd04afbbf6e899fc1e2a7781 \ + --hash=sha256:d3584623e68a5064a04748fb6d76117a21a7cb5eaba20608a41c7d0c61721794 \ + --hash=sha256:e48217c7901edd95f9f097feaa0388da215ed14ce2ece803d3f300b4e694abea \ + --hash=sha256:f2e497413560e03421484189a6b65e33fe800d3bd75590e6d78d4dfdb7accf3b \ + --hash=sha256:ff5c9a67f8a4fba4aed887216e32cbc48f2a6fb2673bb10a99e43be463e15913 +pydash==8.0.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:5a90d98b5f370bb9620f786221579df8f83d54f1f58de6a66f52b1bdba7175d1 \ + --hash=sha256:be2c35df332473a5a939d485422c71a03b19b1a98d6559efb832eadb4a2cfc36 +pyflakes==3.2.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f \ + --hash=sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a +python-box==7.1.1 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:0036fd47d388deaca8ebd65aea905f88ee6ef91d1d8ce34898b66f1824afbe80 \ + --hash=sha256:1b3f346e332dba16df0b0543d319d9e7ce07d93e5ae152175302894352aa2d28 \ + --hash=sha256:24c4ec0ee0278f66321100aaa9c615413da27a14ff43d376a2a3b4665e1d9494 \ + --hash=sha256:2a3df244a5a79ac8f8447b5d11b5be0f2747d7b141cb2866060081ae9b53cc50 \ + --hash=sha256:4ea13c98e05a3ec0ff26f254986a17290b69b5ade209fad081fd628f8fcfaa08 \ + --hash=sha256:63b609555554d7a9d4b6e725f8e78ef1717c67e7d386200e03422ad612338df8 \ + --hash=sha256:81ed1ec0f0ff2370227fc07277c5baca46d190a4747631bad7eb6ab1630fb7d9 \ + --hash=sha256:8891735b4148e84d348c6eadd2f127152f751c9603e35d43a1f496183a291ac4 \ + --hash=sha256:a0f1333c42e81529b6f68c192050df9d4505b803be7ac47f114036b98707f7cf \ + --hash=sha256:aabf8b9ae5dbc8ba431d8cbe0d4cfe737a25d52d68b0f5f2ff34915c21a2c1db \ + --hash=sha256:c046608337e723ae4de3206db5d1e1202ed166da2dfdc70c1f9361e72ace5633 \ + --hash=sha256:d95e5eec4fc8f3fc5c9cc7347fc2eb4f9187c853d34c90b1658d1eff96cd4eac \ + --hash=sha256:f76b5b7f0cdc07bfdd4200dc24e6e33189bb2ae322137a2b7110fd41891a3157 \ + --hash=sha256:f9266795e9c233874fb5b34fa994054b4fb0371881678e6ec45aec17fc95feac +python-dateutil==2.9.0.post0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3 \ + --hash=sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 +pytz==2024.1 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812 \ + --hash=sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319 +pyyaml==6.0.1 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5 \ + --hash=sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc \ + --hash=sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df \ + --hash=sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741 \ + --hash=sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206 \ + --hash=sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27 \ + --hash=sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595 \ + --hash=sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62 \ + --hash=sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98 \ + --hash=sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696 \ + --hash=sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290 \ + --hash=sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9 \ + --hash=sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d \ + --hash=sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6 \ + --hash=sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867 \ + --hash=sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47 \ + --hash=sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486 \ + --hash=sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6 \ + --hash=sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3 \ + --hash=sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007 \ + --hash=sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938 \ + --hash=sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0 \ + --hash=sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c \ + --hash=sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735 \ + --hash=sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d \ + --hash=sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28 \ + --hash=sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4 \ + --hash=sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba \ + --hash=sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8 \ + --hash=sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef \ + --hash=sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5 \ + --hash=sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd \ + --hash=sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3 \ + --hash=sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0 \ + --hash=sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515 \ + --hash=sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c \ + --hash=sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c \ + --hash=sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924 \ + --hash=sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34 \ + --hash=sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43 \ + --hash=sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859 \ + --hash=sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673 \ + --hash=sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54 \ + --hash=sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a \ + --hash=sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b \ + --hash=sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab \ + --hash=sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa \ + --hash=sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c \ + --hash=sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585 \ + --hash=sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d \ + --hash=sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f +requests==2.31.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f \ + --hash=sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1 +responses==0.25.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:01ae6a02b4f34e39bffceb0fc6786b67a25eae919c6368d05eabc8d9576c2a66 \ + --hash=sha256:2f0b9c2b6437db4b528619a77e5d565e4ec2a9532162ac1a131a83529db7be1a +restfly==1.4.7 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:0a8e07f45745b6a4dabdee29befadc3d9803662afd423ab5ad7c13d70b9ccee2 \ + --hash=sha256:b50cb15f49c6ae1afb41514e01e1f6d1cb45d621176ea2fb2fa1e7faa301f914 +six==1.16.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ + --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 +types-python-dateutil==2.9.0.20240316 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:5d2f2e240b86905e40944dd787db6da9263f0deabef1076ddaed797351ec0202 \ + --hash=sha256:6b8cb66d960771ce5ff974e9dd45e38facb81718cc1e208b10b1baccbfdbee3b +typing-extensions==4.11.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0 \ + --hash=sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a +urllib3==2.2.1 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d \ + --hash=sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19 xmltodict==0.12.0 ; python_version >= "3.9" and python_version < "4.0" \ --hash=sha256:50d8c638ed7ecb88d90561beedbf720c9b4e851a9fa6c47ebd64e99d166d8a21 \ --hash=sha256:8bbcb45cc982f48b2ca8fe7e7827c5d792f217ecf1792626f808bf41c3b86051 @@ -343,3 +604,6 @@ yarl==1.9.4 ; python_version >= "3.9" and python_version < "4.0" \ --hash=sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958 \ --hash=sha256:f3bc6af6e2b8f92eced34ef6a96ffb248e863af20ef4fde9448cc8c9b858b749 \ --hash=sha256:f7d6b36dd2e029b6bcb8a13cf19664c7b8e19ab3a58e0fefbb5b8461447ed5ec +zscaler-sdk-python==0.1.2 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:17eb22891eb1b479fafe6d38544aeef9a92b78cadf42985dfb9c13c26a0d849a \ + --hash=sha256:62ade86b44155e719b6c288216bc5ef2ed8ad0fd89debfd95fced6cbb80b85e5 diff --git a/tests/config.yml b/tests/config.yml new file mode 100644 index 0000000..564414f --- /dev/null +++ b/tests/config.yml @@ -0,0 +1,41 @@ +# Sample ansible-test configuration file for collections. +# Support for this feature was first added in ansible-core 2.12. +# Use of this file is optional. +# If used, this file must be placed in "tests/config.yml" relative to the base of the collection. + +modules: + # Configuration for modules/module_utils. + # These settings do not apply to other content in the collection. + + python_requires: ">=3.8" + # Python versions supported by modules/module_utils. + # This setting is required. + # + # Possible values: + # + # - 'default' - All Python versions supported by Ansible. + # This is the default value if no configuration is provided. + # - 'controller' - All Python versions supported by the Ansible controller. + # This indicates the modules/module_utils can only run on the controller. + # Intended for use only with modules/module_utils that depend on ansible-connection, which only runs on the controller. + # Unit tests for modules/module_utils will be permitted to import any Ansible code, instead of only module_utils. + # - SpecifierSet - A PEP 440 specifier set indicating the supported Python versions. + # This is only needed when modules/module_utils do not support all Python versions supported by Ansible. + # It is not necessary to exclude versions which Ansible does not support, as this will be done automatically. + # + # What does this affect? + # + # - Unit tests will be skipped on any unsupported Python version. + # - Sanity tests that are Python version specific will be skipped on any unsupported Python version that is not supported by the controller. + # + # Sanity tests that are Python version specific will always be executed for Python versions supported by the controller, regardless of this setting. + # Reasons for this restriction include, but are not limited to: + # + # - AnsiballZ must be able to AST parse modules/module_utils on the controller, even though they may execute on a managed node. + # - ansible-doc must be able to AST parse modules/module_utils on the controller to display documentation. + # - ansible-test must be able to AST parse modules/module_utils to perform static analysis on them. + # - ansible-test must be able to execute portions of modules/module_utils to validate their argument specs. + # + # These settings only apply to modules/module_utils. + # It is not possible to declare supported Python versions for controller-only code. + # All Python versions supported by the controller must be supported by controller-only code. diff --git a/tests/integration/generate_random_string.yml b/tests/integration/generate_random_string.yml index 596a3c4..ec70877 100644 --- a/tests/integration/generate_random_string.yml +++ b/tests/integration/generate_random_string.yml @@ -1,3 +1,9 @@ +--- - name: Generate a random string - set_fact: - random_string: "{{ lookup('password', '/dev/null length=6 chars=ascii_letters') }}" + ansible.builtin.set_fact: + random_string: "{{ lookup('password', '/dev/null length=5 chars=ascii_letters,digits') }}" + +- name: Generate a random password + ansible.builtin.set_fact: + random_password: "{{ lookup('password', '/dev/null length=16 chars=ascii_letters,digits,special') }}" + no_log: true diff --git a/tests/integration/helper_tasks/zia_cloud_firewall_network_services/zia_cloud_firewall_network_services_facts.yml b/tests/integration/helper_tasks/zia_cloud_firewall_network_services/zia_cloud_firewall_network_services_facts.yml index c106023..ec2903c 100644 --- a/tests/integration/helper_tasks/zia_cloud_firewall_network_services/zia_cloud_firewall_network_services_facts.yml +++ b/tests/integration/helper_tasks/zia_cloud_firewall_network_services/zia_cloud_firewall_network_services_facts.yml @@ -1,6 +1,6 @@ --- - name: Ensure required environment variables are set - fail: + ansible.builtin.fail: msg: "{{ env_var }} is not defined as environment variable" when: lookup('env', env_var) is none loop: @@ -11,15 +11,17 @@ loop_control: loop_var: env_var -- ansible.builtin.set_fact: +- name: Ensure ZIA Credential environment variables are set + ansible.builtin.set_fact: zia_cloud: username: "{{ lookup('env', 'ZIA_USERNAME') }}" password: "{{ lookup('env', 'ZIA_PASSWORD') }}" api_key: "{{ lookup('env', 'ZIA_API_KEY') }}" cloud: "{{ lookup('env', 'ZIA_CLOUD') | default(omit) }}" - no_log: True + no_log: true -- block: +- name: Main block to Test Cloud Firewall Network Services Configuration + block: - name: Fetch all network services zscaler.ziacloud.zia_cloud_firewall_network_services_facts: provider: "{{ zia_cloud }}" diff --git a/tests/integration/helper_tasks/zia_traffic_forwarding_static_ip/create_traffic_forwarding_static_ip.yml b/tests/integration/helper_tasks/zia_traffic_forwarding_static_ip/create_traffic_forwarding_static_ip.yml index 7a8a1ce..b43aa65 100644 --- a/tests/integration/helper_tasks/zia_traffic_forwarding_static_ip/create_traffic_forwarding_static_ip.yml +++ b/tests/integration/helper_tasks/zia_traffic_forwarding_static_ip/create_traffic_forwarding_static_ip.yml @@ -1,7 +1,7 @@ --- - name: Set initial variables ansible.builtin.set_fact: - ip_address: "121.234.54.72" + ip_address: 121.234.54.72 routable_ip: true comment: test_zia_ansible geo_override: true @@ -9,7 +9,7 @@ longitude: 114.0577 - name: Ensure required environment variables are set - fail: + ansible.builtin.fail: msg: "{{ env_var }} is not defined as environment variable" when: lookup('env', env_var) is none loop: @@ -20,21 +20,24 @@ loop_control: loop_var: env_var -- ansible.builtin.set_fact: +- name: Ensure ZIA Credential environment variables are set + ansible.builtin.set_fact: zia_cloud: username: "{{ lookup('env', 'ZIA_USERNAME') }}" password: "{{ lookup('env', 'ZIA_PASSWORD') }}" api_key: "{{ lookup('env', 'ZIA_API_KEY') }}" cloud: "{{ lookup('env', 'ZIA_CLOUD') | default(omit) }}" - no_log: True + no_log: true - name: Import Random String Generator Tasks - ansible.builtin.import_tasks: "../../generate_random_string.yml" + ansible.builtin.import_tasks: ../../generate_random_string.yml -- ansible.builtin.set_fact: +- name: Set dynamic name values with random string + ansible.builtin.set_fact: comment: "{{ comment }}_{{ random_string }}" -- block: +- name: Main block to Test Static IP Address Configuration + block: - name: Create Helper Static IP Address zscaler.ziacloud.zia_traffic_forwarding_static_ip: provider: "{{ zia_cloud }}" diff --git a/tests/integration/helper_tasks/zia_traffic_forwarding_static_ip/delete_traffic_forwarding_static_ip.yml b/tests/integration/helper_tasks/zia_traffic_forwarding_static_ip/delete_traffic_forwarding_static_ip.yml index 2f6ea93..79faa2b 100644 --- a/tests/integration/helper_tasks/zia_traffic_forwarding_static_ip/delete_traffic_forwarding_static_ip.yml +++ b/tests/integration/helper_tasks/zia_traffic_forwarding_static_ip/delete_traffic_forwarding_static_ip.yml @@ -1,6 +1,6 @@ --- - name: Ensure required environment variables are set - fail: + ansible.builtin.fail: msg: "{{ env_var }} is not defined as environment variable" when: lookup('env', env_var) is none loop: @@ -11,15 +11,17 @@ loop_control: loop_var: env_var -- ansible.builtin.set_fact: +- name: Ensure ZIA Credential environment variables are set + ansible.builtin.set_fact: zia_cloud: username: "{{ lookup('env', 'ZIA_USERNAME') }}" password: "{{ lookup('env', 'ZIA_PASSWORD') }}" api_key: "{{ lookup('env', 'ZIA_API_KEY') }}" cloud: "{{ lookup('env', 'ZIA_CLOUD') | default(omit) }}" - no_log: True + no_log: true -- block: +- name: Main block to List All Static IP Address Configuration + block: - name: List all Static IP Address zscaler.ziacloud.zia_traffic_forwarding_static_ip_facts: provider: "{{ zia_cloud }}" diff --git a/tests/integration/helper_tasks/zia_traffic_forwarding_static_ip/verify_traffic_forwarding_static_ip.yml b/tests/integration/helper_tasks/zia_traffic_forwarding_static_ip/verify_traffic_forwarding_static_ip.yml index 276a9da..7edf840 100644 --- a/tests/integration/helper_tasks/zia_traffic_forwarding_static_ip/verify_traffic_forwarding_static_ip.yml +++ b/tests/integration/helper_tasks/zia_traffic_forwarding_static_ip/verify_traffic_forwarding_static_ip.yml @@ -1,6 +1,6 @@ --- - name: Ensure required environment variables are set - fail: + ansible.builtin.fail: msg: "{{ env_var }} is not defined as environment variable" when: lookup('env', env_var) is none loop: @@ -11,15 +11,17 @@ loop_control: loop_var: env_var -- ansible.builtin.set_fact: +- name: Ensure ZIA Credential environment variables are set + ansible.builtin.set_fact: zia_cloud: username: "{{ lookup('env', 'ZIA_USERNAME') }}" password: "{{ lookup('env', 'ZIA_PASSWORD') }}" api_key: "{{ lookup('env', 'ZIA_API_KEY') }}" cloud: "{{ lookup('env', 'ZIA_CLOUD') | default(omit) }}" - no_log: True + no_log: true -- block: +- name: Main block to Fetch The Created Static IP Address Configuration + block: - name: Fetch the created Static IP Address zscaler.ziacloud.zia_traffic_forwarding_static_ip_facts: provider: "{{ zia_cloud }}" @@ -27,8 +29,8 @@ register: fetched_static_ip - name: Verify App Static IP Address attributes - assert: + ansible.builtin.assert: that: - - "fetched_static_ip.data[0].ip_address == ip_address" - fail_msg: "Verification failed for Static IP Address!" - success_msg: "Verification successful for Static IP Address!" + - fetched_static_ip.data[0].ip_address == ip_address + fail_msg: Verification failed for Static IP Address! + success_msg: Verification successful for Static IP Address! diff --git a/tests/integration/helper_tasks/zia_traffic_forwarding_vpn_credentials/create_ufqdn_vpn_credentials.yml b/tests/integration/helper_tasks/zia_traffic_forwarding_vpn_credentials/create_ufqdn_vpn_credentials.yml new file mode 100644 index 0000000..c3610b7 --- /dev/null +++ b/tests/integration/helper_tasks/zia_traffic_forwarding_vpn_credentials/create_ufqdn_vpn_credentials.yml @@ -0,0 +1,61 @@ +--- +- name: Import Random String Generator Tasks + ansible.builtin.import_tasks: ../../generate_random_string.yml + +- name: Set dynamic pre_shared_key values with random password + ansible.builtin.set_fact: + pre_shared_key: "{{ random_password }}" + no_log: true + +- name: Set initial variables + ansible.builtin.set_fact: + type: UFQDN + fqdn: usa_sjc37_{{ random_string }}@bd-redhat.com + comments: USA - San Jose IPSec Tunnel + pre_shared_key: "{{ pre_shared_key }}" + +- name: Ensure required environment variables are set + ansible.builtin.fail: + msg: "{{ env_var }} is not defined as environment variable" + when: lookup('env', env_var) is none + loop: + - ZIA_USERNAME + - ZIA_PASSWORD + - ZIA_API_KEY + - ZIA_CLOUD + loop_control: + loop_var: env_var + +- name: Ensure ZIA Credential environment variables are set + ansible.builtin.set_fact: + zia_cloud: + username: "{{ lookup('env', 'ZIA_USERNAME') }}" + password: "{{ lookup('env', 'ZIA_PASSWORD') }}" + api_key: "{{ lookup('env', 'ZIA_API_KEY') }}" + cloud: "{{ lookup('env', 'ZIA_CLOUD') | default(omit) }}" + no_log: true + +- name: Import Random String Generator Tasks + ansible.builtin.import_tasks: ../../generate_random_string.yml + +- name: Set dynamic name values with random string + ansible.builtin.set_fact: + comments: "{{ comments }}_{{ random_string }}" + +- name: Main block to Test VPN Credential Configuration + block: + - name: Create Helper UFQDN VPN Credential + zscaler.ziacloud.zia_traffic_forwarding_vpn_credentials: + provider: "{{ zia_cloud }}" + state: present + type: "{{ type }}" + fqdn: "{{ fqdn }}" + comments: "{{ comments }}" + pre_shared_key: "{{ pre_shared_key }}" + register: vpn_cred + + - name: Set VPN Credential ID and Type as fact + ansible.builtin.set_fact: + vpn_id: "{{ vpn_cred.data.id }}" + vpn_type: "{{ vpn_cred.data.type }}" + vpn_fqdn: "{{ vpn_cred.data.fqdn }}" diff --git a/tests/integration/helper_tasks/zia_traffic_forwarding_vpn_credentials/delete_ufqdn_vpn_credentials.yml b/tests/integration/helper_tasks/zia_traffic_forwarding_vpn_credentials/delete_ufqdn_vpn_credentials.yml new file mode 100644 index 0000000..0507ee4 --- /dev/null +++ b/tests/integration/helper_tasks/zia_traffic_forwarding_vpn_credentials/delete_ufqdn_vpn_credentials.yml @@ -0,0 +1,39 @@ +--- +- name: Ensure required environment variables are set + ansible.builtin.fail: + msg: "{{ env_var }} is not defined as environment variable" + when: lookup('env', env_var) is none + loop: + - ZIA_USERNAME + - ZIA_PASSWORD + - ZIA_API_KEY + - ZIA_CLOUD + loop_control: + loop_var: env_var + +- name: Ensure ZIA Credential environment variables are set + ansible.builtin.set_fact: + zia_cloud: + username: "{{ lookup('env', 'ZIA_USERNAME') }}" + password: "{{ lookup('env', 'ZIA_PASSWORD') }}" + api_key: "{{ lookup('env', 'ZIA_API_KEY') }}" + cloud: "{{ lookup('env', 'ZIA_CLOUD') | default(omit) }}" + no_log: true + +- name: Main block to List All VPN Credentials Configuration + block: + - name: List all UFQDN VPN Credentials + zscaler.ziacloud.zia_traffic_forwarding_vpn_credentials_facts: + provider: "{{ zia_cloud }}" + register: all_vpn_creds + + - name: Delete all VPN Credentials + zscaler.ziacloud.zia_traffic_forwarding_vpn_credentials: + provider: "{{ zia_cloud }}" + state: absent + id: "{{ vpn.id }}" + fqdn: "{{ vpn_fqdn }}" + loop: "{{ all_vpn_creds.data }}" + when: all_vpn_creds.data is defined + loop_control: + loop_var: vpn diff --git a/tests/integration/helper_tasks/zia_traffic_forwarding_vpn_credentials/verify_ufqdn_vpn_credentials.yml b/tests/integration/helper_tasks/zia_traffic_forwarding_vpn_credentials/verify_ufqdn_vpn_credentials.yml new file mode 100644 index 0000000..45fb735 --- /dev/null +++ b/tests/integration/helper_tasks/zia_traffic_forwarding_vpn_credentials/verify_ufqdn_vpn_credentials.yml @@ -0,0 +1,37 @@ +--- +- name: Ensure required environment variables are set + ansible.builtin.fail: + msg: "{{ env_var }} is not defined as environment variable" + when: lookup('env', env_var) is none + loop: + - ZIA_USERNAME + - ZIA_PASSWORD + - ZIA_API_KEY + - ZIA_CLOUD + loop_control: + loop_var: env_var + +- name: Ensure ZIA Credential environment variables are set + ansible.builtin.set_fact: + zia_cloud: + username: "{{ lookup('env', 'ZIA_USERNAME') }}" + password: "{{ lookup('env', 'ZIA_PASSWORD') }}" + api_key: "{{ lookup('env', 'ZIA_API_KEY') }}" + cloud: "{{ lookup('env', 'ZIA_CLOUD') | default(omit) }}" + no_log: true + +- name: Main block to Fetch The Created VPN Credential Configuration + block: + - name: Fetch the created UFQDN VPN Credential + zscaler.ziacloud.zia_traffic_forwarding_vpn_credentials: + provider: "{{ zia_cloud }}" + id: "{{ vpn_id }}" # assuming the ID stored in this variable + fqdn: "{{ vpn_fqdn }}" + register: fetched_vpn_id + + - name: Verify VPN Credential attributes + ansible.builtin.assert: + that: + - fetched_vpn_id.data.type == type + fail_msg: Verification failed for VPN Credential! + success_msg: Verification successful for VPN Credential! diff --git a/tests/integration/run_all_tests.yml b/tests/integration/run_all_tests.yml index b42a93a..35657bb 100644 --- a/tests/integration/run_all_tests.yml +++ b/tests/integration/run_all_tests.yml @@ -19,26 +19,27 @@ - name: Running ZIA Integration Tests ansible.builtin.include_tasks: "{{ item }}" loop: - - targets/zia_cloud_firewall_filtering_rule/tasks/main.yml + # - targets/zia_cloud_firewall_filtering_rule/tasks/main.yml - targets/zia_cloud_firewall_ip_destination_groups/tasks/main.yml - - targets/zia_cloud_firewall_ip_source_groups/tasks/main.yml - - targets/zia_cloud_firewall_network_services_groups/tasks/main.yml - - targets/zia_cloud_firewall_network_services/tasks/main.yml - - targets/zia_cloud_firewall_time_windows_facts/tasks/main.yml - - targets/zia_cloud_firewall_network_application_groups/tasks/main.yml - - targets/zia_forwarding_control_policy/tasks/main.yml - - targets/zia_rule_labels/tasks/main.yml - - targets/zia_authentication_settings/tasks/main.yml - - targets/zia_traffic_forwarding_static_ip/tasks/main.yml - - targets/zia_traffic_forwarding_vpn_credentials/tasks/main.yml - - targets/zia_traffic_forwarding_gre_tunnels/tasks/main.yml - - targets/zia_dlp_dictionaries/tasks/main.yml - - targets/zia_dlp_engines/tasks/main.yml - - targets/zia_dlp_icap_server_facts/tasks/main.yml - - targets/zia_dlp_incident_receiver_facts/tasks/main.yml - - targets/zia_dlp_web_rules/tasks/main.yml - - targets/zia_dlp_notification_template/tasks/main.yml - - targets/zia_sandbox_advanced_settings/tasks/main.yml + # - targets/zia_cloud_firewall_ip_source_groups/tasks/main.yml + # - targets/zia_cloud_firewall_network_services_groups/tasks/main.yml + # - targets/zia_cloud_firewall_network_services/tasks/main.yml + # - targets/zia_cloud_firewall_time_windows_facts/tasks/main.yml + # - targets/zia_cloud_firewall_network_application_groups/tasks/main.yml + # - targets/zia_forwarding_control_policy/tasks/main.yml + # - targets/zia_rule_labels/tasks/main.yml + # - targets/zia_authentication_settings/tasks/main.yml + # - targets/zia_traffic_forwarding_static_ip/tasks/main.yml + # - targets/zia_traffic_forwarding_vpn_credentials/tasks/main.yml + # - targets/zia_traffic_forwarding_gre_tunnels/tasks/main.yml + # - targets/zia_location_management/tasks/main.yml + # - targets/zia_dlp_dictionaries/tasks/main.yml + # - targets/zia_dlp_engines/tasks/main.yml + # - targets/zia_dlp_icap_server_facts/tasks/main.yml + # - targets/zia_dlp_incident_receiver_facts/tasks/main.yml + # - targets/zia_dlp_web_rules/tasks/main.yml + # - targets/zia_dlp_notification_template/tasks/main.yml + # - targets/zia_sandbox_advanced_settings/tasks/main.yml # - name: Run final sweep to clean tenant # ansible.builtin.include_tasks: ./sweep.yml diff --git a/tests/integration/targets/zia_authentication_settings/defaults/main.yml b/tests/integration/targets/zia_authentication_settings/defaults/main.yml index 5ecb282..29c58d2 100644 --- a/tests/integration/targets/zia_authentication_settings/defaults/main.yml +++ b/tests/integration/targets/zia_authentication_settings/defaults/main.yml @@ -1,3 +1,4 @@ +--- urls: - .okta.com - .oktacdn.com diff --git a/tests/integration/targets/zia_authentication_settings/tasks/main.yml b/tests/integration/targets/zia_authentication_settings/tasks/main.yml index 1fd62ba..7333f58 100644 --- a/tests/integration/targets/zia_authentication_settings/tasks/main.yml +++ b/tests/integration/targets/zia_authentication_settings/tasks/main.yml @@ -1,13 +1,13 @@ --- - name: Include default variables ansible.builtin.include_vars: - file: "../defaults/main.yml" + file: ../defaults/main.yml - name: Import Random String Generator Tasks - ansible.builtin.import_tasks: "../../../generate_random_string.yml" + ansible.builtin.import_tasks: ../../../generate_random_string.yml - name: Ensure required environment variables are set - fail: + ansible.builtin.fail: msg: "{{ env_var }} is not defined as environment variable" when: lookup('env', env_var) is none loop: @@ -18,15 +18,17 @@ loop_control: loop_var: env_var -- ansible.builtin.set_fact: +- name: Ensure ZIA Credential environment variables are set + ansible.builtin.set_fact: zia_cloud: username: "{{ lookup('env', 'ZIA_USERNAME') }}" password: "{{ lookup('env', 'ZIA_PASSWORD') }}" api_key: "{{ lookup('env', 'ZIA_API_KEY') }}" cloud: "{{ lookup('env', 'ZIA_CLOUD') | default(omit) }}" - no_log: True + no_log: true -- block: +- name: Main block to Test Cloud Firewall Rule Configuration + block: # Authentication Setting - name: Ensure Authentication Setting (leftover) zscaler.ziacloud.zia_authentication_settings: @@ -35,6 +37,16 @@ urls: "{{ urls }}" register: result + rescue: + - name: Handle errors + ansible.builtin.debug: + msg: An error occurred. + + always: + - name: Cleanup operations + ansible.builtin.debug: + msg: Cleanup complete. + - name: Ensure Authentication Setting is absent zscaler.ziacloud.zia_authentication_settings: provider: "{{ zia_cloud }}" diff --git a/tests/integration/targets/zia_cloud_firewall_filtering_rule/defaults/main.yml b/tests/integration/targets/zia_cloud_firewall_filtering_rule/defaults/main.yml index f19f194..5bde61f 100644 --- a/tests/integration/targets/zia_cloud_firewall_filtering_rule/defaults/main.yml +++ b/tests/integration/targets/zia_cloud_firewall_filtering_rule/defaults/main.yml @@ -1,8 +1,8 @@ --- -name: test_zia_ansible +rule_name: test_zia_ansible description: test_zia_ansible -action: "ALLOW" -order: 1 +rule_action: ALLOW +rule_order: 1 enabled: true enable_full_logging: true exclude_src_countries: true @@ -15,8 +15,8 @@ dest_countries: - CA - US src_ips: - - "192.168.100.0/24" - - "192.168.200.1" + - 192.168.100.0/24 + - 192.168.200.1 dest_addresses: - 3.217.228.0-3.217.231.255 - 3.235.112.0-3.235.119.255 @@ -24,20 +24,20 @@ dest_addresses: - server1.acme.com - "*.acme.com" dest_ip_categories: - - "BOTNET" - - "MALWARE_SITE" - - "PHISHING" - - "SUSPICIOUS_DESTINATION" + - BOTNET + - MALWARE_SITE + - PHISHING + - SUSPICIOUS_DESTINATION device_trust_levels: - - "UNKNOWN_DEVICETRUSTLEVEL" - - "LOW_TRUST" - - "MEDIUM_TRUST" - - "HIGH_TRUST" + - UNKNOWN_DEVICETRUSTLEVEL + - LOW_TRUST + - MEDIUM_TRUST + - HIGH_TRUST # Cloud Firewall Rule Update name_update: test_zia_ansible description_update: test_zia_ansible_update -action_update: "BLOCK_DROP" +action_update: BLOCK_DROP order_update: 2 enabled_update: false enable_full_logging_update: true @@ -49,16 +49,16 @@ dest_countries_update: - BR - CA src_ips_update: - - "192.168.100.0/24" + - 192.168.100.0/24 dest_addresses_update: - 3.217.228.0-3.217.231.255 - 3.235.112.0-3.235.119.255 - 35.80.88.0-35.80.95.255 dest_ip_categories_update: - - "BOTNET" - - "MALWARE_SITE" - - "PHISHING" + - BOTNET + - MALWARE_SITE + - PHISHING device_trust_levels_update: - - "UNKNOWN_DEVICETRUSTLEVEL" - - "MEDIUM_TRUST" - - "HIGH_TRUST" + - UNKNOWN_DEVICETRUSTLEVEL + - MEDIUM_TRUST + - HIGH_TRUST diff --git a/tests/integration/targets/zia_cloud_firewall_filtering_rule/tasks/main.yml b/tests/integration/targets/zia_cloud_firewall_filtering_rule/tasks/main.yml index c23034d..035f94c 100644 --- a/tests/integration/targets/zia_cloud_firewall_filtering_rule/tasks/main.yml +++ b/tests/integration/targets/zia_cloud_firewall_filtering_rule/tasks/main.yml @@ -1,20 +1,19 @@ --- - name: Include default variables ansible.builtin.include_vars: - file: "../defaults/main.yml" + file: ../defaults/main.yml - name: Import Random String Generator Tasks - ansible.builtin.import_tasks: "../../../generate_random_string.yml" + ansible.builtin.import_tasks: ../../../generate_random_string.yml -- ansible.builtin.set_fact: - name: "{{ name }}_{{ random_string }}" +- name: Set dynamic name values with random string + ansible.builtin.set_fact: + rule_name: "{{ rule_name }}_{{ random_string }}" description: "{{ description }}_{{ random_string }}" - -- ansible.builtin.set_fact: description_update: "{{ description_update }}_{{ random_string }}" - name: Ensure required environment variables are set - fail: + ansible.builtin.fail: msg: "{{ env_var }} is not defined as environment variable" when: lookup('env', env_var) is none loop: @@ -25,29 +24,41 @@ loop_control: loop_var: env_var -- ansible.builtin.set_fact: +- name: Ensure ZIA Credential environment variables are set + ansible.builtin.set_fact: zia_cloud: username: "{{ lookup('env', 'ZIA_USERNAME') }}" password: "{{ lookup('env', 'ZIA_PASSWORD') }}" api_key: "{{ lookup('env', 'ZIA_API_KEY') }}" cloud: "{{ lookup('env', 'ZIA_CLOUD') | default(omit) }}" - no_log: True + no_log: true -- block: +- name: Main block to Test Cloud Firewall Rule Configuration + block: - name: Ensure Cloud Firewall Rule (leftover) zscaler.ziacloud.zia_cloud_firewall_filtering_rule: provider: "{{ zia_cloud }}" state: absent - name: "{{ name }}" - order: "{{ order }}" + name: "{{ rule_name }}" + order: "{{ rule_order }}" register: result + rescue: + - name: Handle errors + ansible.builtin.debug: + msg: An error occurred. + + always: + - name: Cleanup operations + ansible.builtin.debug: + msg: Cleanup complete. + - name: Ensure Cloud Firewall Rule is absent zscaler.ziacloud.zia_cloud_firewall_filtering_rule: provider: "{{ zia_cloud }}" state: absent - name: "{{ name }}" - order: "{{ order }}" + name: "{{ rule_name }}" + order: "{{ rule_order }}" register: result - name: Verify Cloud Firewall Rule is absent @@ -60,10 +71,10 @@ zscaler.ziacloud.zia_cloud_firewall_filtering_rule: provider: "{{ zia_cloud }}" state: present - name: "{{ name }}" + name: "{{ rule_name }}" description: "{{ description }}" - action: "{{ action }}" - order: "{{ order }}" + action: "{{ rule_action }}" + order: "{{ rule_order }}" enabled: "{{ enabled }}" enable_full_logging: "{{ enable_full_logging }}" exclude_src_countries: "{{ exclude_src_countries }}" @@ -85,10 +96,10 @@ zscaler.ziacloud.zia_cloud_firewall_filtering_rule: provider: "{{ zia_cloud }}" state: present - name: "{{ name }}" + name: "{{ rule_name }}" description: "{{ description }}" - action: "{{ action }}" - order: "{{ order }}" + action: "{{ rule_action }}" + order: "{{ rule_order }}" enabled: "{{ enabled }}" enable_full_logging: "{{ enable_full_logging }}" exclude_src_countries: "{{ exclude_src_countries }}" @@ -108,10 +119,10 @@ zscaler.ziacloud.zia_cloud_firewall_filtering_rule: provider: "{{ zia_cloud }}" state: present - name: "{{ name }}" + name: "{{ rule_name }}" description: "{{ description_update }}" action: "{{ action_update }}" - order: "{{ order }}" + order: "{{ rule_order }}" enabled: "{{ enabled_update }}" enable_full_logging: "{{ enable_full_logging_update }}" exclude_src_countries: "{{ exclude_src_countries_update }}" @@ -127,7 +138,7 @@ that: - result.changed - result.data is defined - - result.data.name == name + - result.data.name == rule_name - result.data.description == description_update - result.data.action == action_update @@ -135,10 +146,10 @@ zscaler.ziacloud.zia_cloud_firewall_filtering_rule: provider: "{{ zia_cloud }}" state: present - name: "{{ name }}" + name: "{{ rule_name }}" description: "{{ description_update }}" action: "{{ action_update }}" - order: "{{ order }}" + order: "{{ rule_order }}" enabled: "{{ enabled_update }}" enable_full_logging: "{{ enable_full_logging_update }}" exclude_src_countries: "{{ exclude_src_countries_update }}" @@ -168,7 +179,7 @@ - name: Fetch this Cloud Firewall Rule zscaler.ziacloud.zia_cloud_firewall_filtering_rule_facts: provider: "{{ zia_cloud }}" - name: "{{ name }}" + name: "{{ rule_name }}" register: result - name: Ensure this Cloud Firewall Rule is found @@ -177,7 +188,7 @@ - not result.changed - result.data is defined - result.data[0].name is defined - - result.data[0].name == name + - result.data[0].name == rule_name - name: Give the ZIA Cloud a 5 seconds to settle ansible.builtin.pause: @@ -187,8 +198,8 @@ zscaler.ziacloud.zia_cloud_firewall_filtering_rule: provider: "{{ zia_cloud }}" state: absent - name: "{{ name }}" - order: "{{ order }}" + name: "{{ rule_name }}" + order: "{{ rule_order }}" register: result - name: Verify Cloud Firewall Rule is Deleted @@ -200,8 +211,8 @@ zscaler.ziacloud.zia_cloud_firewall_filtering_rule: provider: "{{ zia_cloud }}" state: absent - name: "{{ name }}" - order: "{{ order }}" + name: "{{ rule_name }}" + order: "{{ rule_order }}" register: result - name: Verify Cloud Firewall Rule is absent diff --git a/tests/integration/targets/zia_cloud_firewall_ip_destination_groups/defaults/main.yml b/tests/integration/targets/zia_cloud_firewall_ip_destination_groups/defaults/main.yml index a6d5df5..7ace1e1 100644 --- a/tests/integration/targets/zia_cloud_firewall_ip_destination_groups/defaults/main.yml +++ b/tests/integration/targets/zia_cloud_firewall_ip_destination_groups/defaults/main.yml @@ -1,10 +1,10 @@ --- # Common Variables -name: test_zia_ansible +group_name: test_zia_ansible description: test_zia_ansible # IP Destination Group of Type DSTN_IP -type_dst_ip: "DSTN_IP" +type_dst_ip: DSTN_IP addresses_dst_ip: - 3.217.228.0-3.217.231.255 - 3.235.112.0-3.235.119.255 @@ -12,21 +12,21 @@ addresses_dst_ip: - 35.80.88.0-35.80.95.255 # IP Destination Group of Type DSTN_FQDN -type_dst_fqdn: "DSTN_FQDN" +type_dst_fqdn: DSTN_FQDN addresses_dst_fqdn: - test1.acme.com - test2.acme.com - test3.acme.com # IP Destination Group of Type DSTN_OTHER -type_dst_other: "DSTN_OTHER" +type_dst_other: DSTN_OTHER countries_dst_other: - BR - CA - US # IP Destination Group of Type DSTN_DOMAIN -type_dst_domain: "DSTN_DOMAIN" +type_dst_domain: DSTN_DOMAIN addresses_dst_domain: - acme.com - acme1.com diff --git a/tests/integration/targets/zia_cloud_firewall_ip_destination_groups/tasks/main.yml b/tests/integration/targets/zia_cloud_firewall_ip_destination_groups/tasks/main.yml index 8fab593..394810d 100644 --- a/tests/integration/targets/zia_cloud_firewall_ip_destination_groups/tasks/main.yml +++ b/tests/integration/targets/zia_cloud_firewall_ip_destination_groups/tasks/main.yml @@ -1,17 +1,18 @@ --- - name: Include default variables ansible.builtin.include_vars: - file: "../defaults/main.yml" + file: ../defaults/main.yml - name: Import Random String Generator Tasks - ansible.builtin.import_tasks: "../../../generate_random_string.yml" + ansible.builtin.import_tasks: ../../../generate_random_string.yml -- ansible.builtin.set_fact: - name: "{{ name }}_{{ random_string }}" +- name: Set dynamic name values with random string + ansible.builtin.set_fact: + group_name: "{{ group_name }}_{{ random_string }}" description: "{{ description }}_{{ random_string }}" - name: Ensure required environment variables are set - fail: + ansible.builtin.fail: msg: "{{ env_var }} is not defined as environment variable" when: lookup('env', env_var) is none loop: @@ -22,28 +23,40 @@ loop_control: loop_var: env_var -- ansible.builtin.set_fact: +- name: Ensure ZIA Credential environment variables are set + ansible.builtin.set_fact: zia_cloud: username: "{{ lookup('env', 'ZIA_USERNAME') }}" password: "{{ lookup('env', 'ZIA_PASSWORD') }}" api_key: "{{ lookup('env', 'ZIA_API_KEY') }}" cloud: "{{ lookup('env', 'ZIA_CLOUD') | default(omit) }}" - no_log: True + no_log: true -- block: +- name: Main block to Test Cloud Firewall IP Destination Group Configuration + block: # IP Destination Group of Type DSTN_IP - name: Ensure Destination Group of Type DSTN_IP (leftover) zscaler.ziacloud.zia_cloud_firewall_ip_destination_groups: provider: "{{ zia_cloud }}" state: absent - name: "{{ name }}" + name: "{{ group_name }}" register: result + rescue: + - name: Handle errors + ansible.builtin.debug: + msg: An error occurred. + + always: + - name: Cleanup operations + ansible.builtin.debug: + msg: Cleanup complete. + - name: Ensure Destination Group of Type DSTN_IP is absent zscaler.ziacloud.zia_cloud_firewall_ip_destination_groups: provider: "{{ zia_cloud }}" state: absent - name: "{{ name }}" + name: "{{ group_name }}" register: result - name: Verify Destination Group of Type DSTN_IP is absent @@ -56,7 +69,7 @@ zscaler.ziacloud.zia_cloud_firewall_ip_destination_groups: provider: "{{ zia_cloud }}" state: present - name: "{{ name }}" + name: "{{ group_name }}" description: "{{ description }}" type: "{{ type_dst_ip }}" addresses: "{{ addresses_dst_ip }}" @@ -72,7 +85,7 @@ zscaler.ziacloud.zia_cloud_firewall_ip_destination_groups: provider: "{{ zia_cloud }}" state: present - name: "{{ name }}" + name: "{{ group_name }}" description: "{{ description }}" type: "{{ type_dst_ip }}" addresses: "{{ addresses_dst_ip }}" @@ -97,7 +110,7 @@ - name: Fetch this Destination Group of Type DSTN_IP zscaler.ziacloud.zia_cloud_firewall_ip_destination_groups_facts: provider: "{{ zia_cloud }}" - name: "{{ name }}" + name: "{{ group_name }}" register: result - name: Ensure this Destination Group of Type DSTN_IP is found @@ -106,7 +119,7 @@ - not result.changed - result.data is defined - result.data[0].name is defined - - result.data[0].name == name + - result.data[0].name == group_name - name: Give the ZIA Cloud a 5 seconds to settle ansible.builtin.pause: @@ -116,7 +129,7 @@ zscaler.ziacloud.zia_cloud_firewall_ip_destination_groups: provider: "{{ zia_cloud }}" state: absent - name: "{{ name }}" + name: "{{ group_name }}" register: result - name: Verify Destination Group of Type DSTN_IP is Deleted @@ -128,7 +141,7 @@ zscaler.ziacloud.zia_cloud_firewall_ip_destination_groups: provider: "{{ zia_cloud }}" state: absent - name: "{{ name }}" + name: "{{ group_name }}" register: result - name: Verify Destination Group of Type DSTN_IP is absent @@ -142,14 +155,14 @@ zscaler.ziacloud.zia_cloud_firewall_ip_destination_groups: provider: "{{ zia_cloud }}" state: absent - name: "{{ name }}" + name: "{{ group_name }}" register: result - name: Ensure Destination Group of Type DSTN_FQDN is absent zscaler.ziacloud.zia_cloud_firewall_ip_destination_groups: provider: "{{ zia_cloud }}" state: absent - name: "{{ name }}" + name: "{{ group_name }}" register: result - name: Verify Destination Group of Type DSTN_FQDN is absent @@ -162,7 +175,7 @@ zscaler.ziacloud.zia_cloud_firewall_ip_destination_groups: provider: "{{ zia_cloud }}" state: present - name: "{{ name }}" + name: "{{ group_name }}" description: "{{ description }}" type: "{{ type_dst_fqdn }}" addresses: "{{ addresses_dst_fqdn }}" @@ -178,7 +191,7 @@ zscaler.ziacloud.zia_cloud_firewall_ip_destination_groups: provider: "{{ zia_cloud }}" state: present - name: "{{ name }}" + name: "{{ group_name }}" description: "{{ description }}" type: "{{ type_dst_fqdn }}" addresses: "{{ addresses_dst_fqdn }}" @@ -203,7 +216,7 @@ - name: Fetch this Destination Group of Type DSTN_FQDN zscaler.ziacloud.zia_cloud_firewall_ip_destination_groups_facts: provider: "{{ zia_cloud }}" - name: "{{ name }}" + name: "{{ group_name }}" register: result - name: Ensure this Destination Group of Type DSTN_FQDN is found @@ -212,7 +225,7 @@ - not result.changed - result.data is defined - result.data[0].name is defined - - result.data[0].name == name + - result.data[0].name == group_name - name: Give the ZIA Cloud a 5 seconds to settle ansible.builtin.pause: @@ -222,7 +235,7 @@ zscaler.ziacloud.zia_cloud_firewall_ip_destination_groups: provider: "{{ zia_cloud }}" state: absent - name: "{{ name }}" + name: "{{ group_name }}" register: result - name: Verify Destination Group of Type DSTN_FQDN is Deleted @@ -234,7 +247,7 @@ zscaler.ziacloud.zia_cloud_firewall_ip_destination_groups: provider: "{{ zia_cloud }}" state: absent - name: "{{ name }}" + name: "{{ group_name }}" register: result - name: Verify Destination Group of Type DSTN_FQDN is absent @@ -248,14 +261,14 @@ zscaler.ziacloud.zia_cloud_firewall_ip_destination_groups: provider: "{{ zia_cloud }}" state: absent - name: "{{ name }}" + name: "{{ group_name }}" register: result - name: Ensure Destination Group of Type DSTN_OTHER is absent zscaler.ziacloud.zia_cloud_firewall_ip_destination_groups: provider: "{{ zia_cloud }}" state: absent - name: "{{ name }}" + name: "{{ group_name }}" register: result - name: Verify Destination Group of Type DSTN_OTHER is absent @@ -268,7 +281,7 @@ zscaler.ziacloud.zia_cloud_firewall_ip_destination_groups: provider: "{{ zia_cloud }}" state: present - name: "{{ name }}" + name: "{{ group_name }}" description: "{{ description }}" type: "{{ type_dst_other }}" countries: "{{ countries_dst_other }}" @@ -284,7 +297,7 @@ zscaler.ziacloud.zia_cloud_firewall_ip_destination_groups: provider: "{{ zia_cloud }}" state: present - name: "{{ name }}" + name: "{{ group_name }}" description: "{{ description }}" type: "{{ type_dst_other }}" countries: "{{ countries_dst_other }}" @@ -309,7 +322,7 @@ - name: Fetch this Destination Group of Type DSTN_OTHER zscaler.ziacloud.zia_cloud_firewall_ip_destination_groups_facts: provider: "{{ zia_cloud }}" - name: "{{ name }}" + name: "{{ group_name }}" register: result - name: Ensure this Destination Group of Type DSTN_OTHER is found @@ -318,7 +331,7 @@ - not result.changed - result.data is defined - result.data[0].name is defined - - result.data[0].name == name + - result.data[0].name == group_name - name: Give the ZIA Cloud a 5 seconds to settle ansible.builtin.pause: @@ -328,7 +341,7 @@ zscaler.ziacloud.zia_cloud_firewall_ip_destination_groups: provider: "{{ zia_cloud }}" state: absent - name: "{{ name }}" + name: "{{ group_name }}" register: result - name: Verify Destination Group of Type DSTN_OTHER is Deleted @@ -340,7 +353,7 @@ zscaler.ziacloud.zia_cloud_firewall_ip_destination_groups: provider: "{{ zia_cloud }}" state: absent - name: "{{ name }}" + name: "{{ group_name }}" register: result - name: Verify Destination Group of Type DSTN_OTHER is absent @@ -354,14 +367,14 @@ zscaler.ziacloud.zia_cloud_firewall_ip_destination_groups: provider: "{{ zia_cloud }}" state: absent - name: "{{ name }}" + name: "{{ group_name }}" register: result - name: Ensure Destination Group of Type DSTN_DOMAIN is absent zscaler.ziacloud.zia_cloud_firewall_ip_destination_groups: provider: "{{ zia_cloud }}" state: absent - name: "{{ name }}" + name: "{{ group_name }}" register: result - name: Verify Destination Group of Type DSTN_DOMAIN is absent @@ -374,7 +387,7 @@ zscaler.ziacloud.zia_cloud_firewall_ip_destination_groups: provider: "{{ zia_cloud }}" state: present - name: "{{ name }}" + name: "{{ group_name }}" description: "{{ description }}" type: "{{ type_dst_domain }}" addresses: "{{ addresses_dst_domain }}" @@ -390,7 +403,7 @@ zscaler.ziacloud.zia_cloud_firewall_ip_destination_groups: provider: "{{ zia_cloud }}" state: present - name: "{{ name }}" + name: "{{ group_name }}" description: "{{ description }}" type: "{{ type_dst_domain }}" addresses: "{{ addresses_dst_domain }}" @@ -415,7 +428,7 @@ - name: Fetch this Destination Group of Type DSTN_DOMAIN zscaler.ziacloud.zia_cloud_firewall_ip_destination_groups_facts: provider: "{{ zia_cloud }}" - name: "{{ name }}" + name: "{{ group_name }}" register: result - name: Ensure this Destination Group of Type DSTN_DOMAIN is found @@ -424,7 +437,7 @@ - not result.changed - result.data is defined - result.data[0].name is defined - - result.data[0].name == name + - result.data[0].name == group_name - name: Give the ZIA Cloud a 5 seconds to settle ansible.builtin.pause: @@ -434,7 +447,7 @@ zscaler.ziacloud.zia_cloud_firewall_ip_destination_groups: provider: "{{ zia_cloud }}" state: absent - name: "{{ name }}" + name: "{{ group_name }}" register: result - name: Verify Destination Group of Type DSTN_DOMAIN is Deleted @@ -446,7 +459,7 @@ zscaler.ziacloud.zia_cloud_firewall_ip_destination_groups: provider: "{{ zia_cloud }}" state: absent - name: "{{ name }}" + name: "{{ group_name }}" register: result - name: Verify Destination Group of Type DSTN_DOMAIN is absent diff --git a/tests/integration/targets/zia_cloud_firewall_ip_source_groups/defaults/main.yml b/tests/integration/targets/zia_cloud_firewall_ip_source_groups/defaults/main.yml index 47e409f..e58d2c8 100644 --- a/tests/integration/targets/zia_cloud_firewall_ip_source_groups/defaults/main.yml +++ b/tests/integration/targets/zia_cloud_firewall_ip_source_groups/defaults/main.yml @@ -1,9 +1,9 @@ --- # IP Source Group -name: test_zia_ansible +group_name: test_zia_ansible description: test_zia_ansible ip_addresses: - - "192.168.1.1" - - "192.168.1.2" - - "192.168.1.3" - - "192.168.1.4" + - 192.168.1.1 + - 192.168.1.2 + - 192.168.1.3 + - 192.168.1.4 diff --git a/tests/integration/targets/zia_cloud_firewall_ip_source_groups/tasks/main.yml b/tests/integration/targets/zia_cloud_firewall_ip_source_groups/tasks/main.yml index e1e2b09..80f2149 100644 --- a/tests/integration/targets/zia_cloud_firewall_ip_source_groups/tasks/main.yml +++ b/tests/integration/targets/zia_cloud_firewall_ip_source_groups/tasks/main.yml @@ -1,17 +1,18 @@ --- - name: Include default variables ansible.builtin.include_vars: - file: "../defaults/main.yml" + file: ../defaults/main.yml - name: Import Random String Generator Tasks - ansible.builtin.import_tasks: "../../../generate_random_string.yml" + ansible.builtin.import_tasks: ../../../generate_random_string.yml -- ansible.builtin.set_fact: - name: "{{ name }}_{{ random_string }}" +- name: Set dynamic name values with random string + ansible.builtin.set_fact: + group_name: "{{ group_name }}_{{ random_string }}" description: "{{ description }}_{{ random_string }}" - name: Ensure required environment variables are set - fail: + ansible.builtin.fail: msg: "{{ env_var }} is not defined as environment variable" when: lookup('env', env_var) is none loop: @@ -22,29 +23,41 @@ loop_control: loop_var: env_var -- ansible.builtin.set_fact: +- name: Ensure ZIA Credential environment variables are set + ansible.builtin.set_fact: zia_cloud: username: "{{ lookup('env', 'ZIA_USERNAME') }}" password: "{{ lookup('env', 'ZIA_PASSWORD') }}" api_key: "{{ lookup('env', 'ZIA_API_KEY') }}" cloud: "{{ lookup('env', 'ZIA_CLOUD') | default(omit) }}" - no_log: True + no_log: true -- block: +- name: Main block to Test Cloud Firewall IP Source Group Configuration + block: # IP Source Group - name: Ensure IP Source Group (leftover) zscaler.ziacloud.zia_cloud_firewall_ip_source_groups: provider: "{{ zia_cloud }}" state: absent - name: "{{ name }}" + name: "{{ group_name }}" ip_addresses: "{{ ip_addresses }}" register: result + rescue: + - name: Handle errors + ansible.builtin.debug: + msg: An error occurred. + + always: + - name: Cleanup operations + ansible.builtin.debug: + msg: Cleanup complete. + - name: Ensure IP Source Group is absent zscaler.ziacloud.zia_cloud_firewall_ip_source_groups: provider: "{{ zia_cloud }}" state: absent - name: "{{ name }}" + name: "{{ group_name }}" ip_addresses: "{{ ip_addresses }}" register: result @@ -58,7 +71,7 @@ zscaler.ziacloud.zia_cloud_firewall_ip_source_groups: provider: "{{ zia_cloud }}" state: present - name: "{{ name }}" + name: "{{ group_name }}" description: "{{ description }}" ip_addresses: "{{ ip_addresses }}" register: result @@ -73,7 +86,7 @@ zscaler.ziacloud.zia_cloud_firewall_ip_source_groups: provider: "{{ zia_cloud }}" state: present - name: "{{ name }}" + name: "{{ group_name }}" description: "{{ description }}" ip_addresses: "{{ ip_addresses }}" register: result @@ -97,7 +110,7 @@ - name: Fetch this IP Source Group zscaler.ziacloud.zia_cloud_firewall_ip_source_groups_facts: provider: "{{ zia_cloud }}" - name: "{{ name }}" + name: "{{ group_name }}" register: result - name: Ensure this IP Source Group is found @@ -116,7 +129,7 @@ zscaler.ziacloud.zia_cloud_firewall_ip_source_groups: provider: "{{ zia_cloud }}" state: absent - name: "{{ name }}" + name: "{{ group_name }}" ip_addresses: "{{ ip_addresses }}" register: result @@ -129,7 +142,7 @@ zscaler.ziacloud.zia_cloud_firewall_ip_source_groups: provider: "{{ zia_cloud }}" state: absent - name: "{{ name }}" + name: "{{ group_name }}" ip_addresses: "{{ ip_addresses }}" register: result diff --git a/tests/integration/targets/zia_cloud_firewall_network_application_groups/defaults/main.yml b/tests/integration/targets/zia_cloud_firewall_network_application_groups/defaults/main.yml index 5b8b9f0..7231cb7 100644 --- a/tests/integration/targets/zia_cloud_firewall_network_application_groups/defaults/main.yml +++ b/tests/integration/targets/zia_cloud_firewall_network_application_groups/defaults/main.yml @@ -1,6 +1,6 @@ --- # Network Application Group -name: test_zia_ansible +group_name: test_zia_ansible description: test_zia_ansible network_applications: - APNS diff --git a/tests/integration/targets/zia_cloud_firewall_network_application_groups/tasks/main.yml b/tests/integration/targets/zia_cloud_firewall_network_application_groups/tasks/main.yml index fecddb1..43b30ee 100644 --- a/tests/integration/targets/zia_cloud_firewall_network_application_groups/tasks/main.yml +++ b/tests/integration/targets/zia_cloud_firewall_network_application_groups/tasks/main.yml @@ -1,17 +1,18 @@ --- - name: Include default variables ansible.builtin.include_vars: - file: "../defaults/main.yml" + file: ../defaults/main.yml - name: Import Random String Generator Tasks - ansible.builtin.import_tasks: "../../../generate_random_string.yml" + ansible.builtin.import_tasks: ../../../generate_random_string.yml -- ansible.builtin.set_fact: - name: "{{ name }}_{{ random_string }}" +- name: Set dynamic name values with random string + ansible.builtin.set_fact: + group_name: "{{ group_name }}_{{ random_string }}" description: "{{ description }}_{{ random_string }}" - name: Ensure required environment variables are set - fail: + ansible.builtin.fail: msg: "{{ env_var }} is not defined as environment variable" when: lookup('env', env_var) is none loop: @@ -22,17 +23,19 @@ loop_control: loop_var: env_var -- ansible.builtin.set_fact: +- name: Ensure ZIA Credential environment variables are set + ansible.builtin.set_fact: zia_cloud: username: "{{ lookup('env', 'ZIA_USERNAME') }}" password: "{{ lookup('env', 'ZIA_PASSWORD') }}" api_key: "{{ lookup('env', 'ZIA_API_KEY') }}" cloud: "{{ lookup('env', 'ZIA_CLOUD') | default(omit) }}" - no_log: True + no_log: true -- block: +- name: Main block to Test Network Application Group Configuration + block: - name: Ensure Network Application Group (leftover) - zscaler.ziacloud.zia_cloud_firewall_network_application_groups: + zscaler.ziacloud.zia_cloud_firewall_network_application_group: provider: "{{ zia_cloud }}" state: absent name: "{{ name }}" @@ -40,8 +43,18 @@ network_applications: "{{ network_applications }}" register: result + rescue: + - name: Handle errors + ansible.builtin.debug: + msg: An error occurred. + + always: + - name: Cleanup operations + ansible.builtin.debug: + msg: Cleanup complete. + - name: Ensure Network Application Group is absent - zscaler.ziacloud.zia_cloud_firewall_network_application_groups: + zscaler.ziacloud.zia_cloud_firewall_network_application_group: provider: "{{ zia_cloud }}" state: absent name: "{{ name }}" @@ -56,7 +69,7 @@ - result.data is defined - name: Ensure Network Application Group is (Present) - zscaler.ziacloud.zia_cloud_firewall_network_application_groups: + zscaler.ziacloud.zia_cloud_firewall_network_application_group: provider: "{{ zia_cloud }}" state: present name: "{{ name }}" @@ -71,7 +84,7 @@ - result.data.name is defined - name: Ensure Network Application Group (again; idempotency check) - zscaler.ziacloud.zia_cloud_firewall_network_application_groups: + zscaler.ziacloud.zia_cloud_firewall_network_application_group: provider: "{{ zia_cloud }}" state: present name: "{{ name }}" @@ -85,7 +98,7 @@ - not result.changed - name: Fetch all Network Application Group - zscaler.ziacloud.zia_cloud_firewall_network_application_groups_facts: + zscaler.ziacloud.zia_cloud_firewall_network_application_group_facts: provider: "{{ zia_cloud }}" register: result @@ -96,7 +109,7 @@ - result.data[0] is defined - name: Fetch this Network Application Group - zscaler.ziacloud.zia_cloud_firewall_network_application_groups_facts: + zscaler.ziacloud.zia_cloud_firewall_network_application_group_facts: provider: "{{ zia_cloud }}" name: "{{ name }}" register: result @@ -114,7 +127,7 @@ seconds: 5 - name: Delete Network Application Group - zscaler.ziacloud.zia_cloud_firewall_network_application_groups: + zscaler.ziacloud.zia_cloud_firewall_network_application_group: provider: "{{ zia_cloud }}" state: absent name: "{{ name }}" @@ -128,7 +141,7 @@ - result.changed - name: Delete Network Application Group (again; idempotency check) - zscaler.ziacloud.zia_cloud_firewall_network_application_groups: + zscaler.ziacloud.zia_cloud_firewall_network_application_group: provider: "{{ zia_cloud }}" state: absent name: "{{ name }}" diff --git a/tests/integration/targets/zia_cloud_firewall_network_services/defaults/main.yml b/tests/integration/targets/zia_cloud_firewall_network_services/defaults/main.yml index 66d35fd..611d172 100644 --- a/tests/integration/targets/zia_cloud_firewall_network_services/defaults/main.yml +++ b/tests/integration/targets/zia_cloud_firewall_network_services/defaults/main.yml @@ -1,4 +1,5 @@ -name: test_zia_ansible +--- +service_name: test_zia_ansible description: test_zia_ansible src_tcp_ports: - start: 5002 @@ -6,4 +7,4 @@ src_tcp_ports: dest_tcp_ports: - start: 5003 end: 5005 -type: "CUSTOM" +type: CUSTOM diff --git a/tests/integration/targets/zia_cloud_firewall_network_services/tasks/main.yml b/tests/integration/targets/zia_cloud_firewall_network_services/tasks/main.yml index 1a91983..dd95375 100644 --- a/tests/integration/targets/zia_cloud_firewall_network_services/tasks/main.yml +++ b/tests/integration/targets/zia_cloud_firewall_network_services/tasks/main.yml @@ -1,17 +1,18 @@ --- - name: Include default variables ansible.builtin.include_vars: - file: "../defaults/main.yml" + file: ../defaults/main.yml - name: Import Random String Generator Tasks - ansible.builtin.import_tasks: "../../../generate_random_string.yml" + ansible.builtin.import_tasks: ../../../generate_random_string.yml -- ansible.builtin.set_fact: - name: "{{ name }}_{{ random_string }}" +- name: Set dynamic name values with random string + ansible.builtin.set_fact: + service_name: "{{ service_name }}_{{ random_string }}" description: "{{ description }}_{{ random_string }}" - name: Ensure required environment variables are set - fail: + ansible.builtin.fail: msg: "{{ env_var }} is not defined as environment variable" when: lookup('env', env_var) is none loop: @@ -22,31 +23,43 @@ loop_control: loop_var: env_var -- ansible.builtin.set_fact: +- name: Ensure ZIA Credential environment variables are set + ansible.builtin.set_fact: zia_cloud: username: "{{ lookup('env', 'ZIA_USERNAME') }}" password: "{{ lookup('env', 'ZIA_PASSWORD') }}" api_key: "{{ lookup('env', 'ZIA_API_KEY') }}" cloud: "{{ lookup('env', 'ZIA_CLOUD') | default(omit) }}" - no_log: True + no_log: true -- block: +- name: Main block to Test Cloud Firewall Network Services Configuration + block: - name: Ensure Network Services is absent (leftover) zscaler.ziacloud.zia_cloud_firewall_network_services: provider: "{{ zia_cloud }}" state: absent - name: "{{ name }}" + name: "{{ service_name }}" description: "{{ description }}" src_tcp_ports: "{{ src_tcp_ports }}" dest_tcp_ports: "{{ dest_tcp_ports }}" type: "{{ type }}" register: result + rescue: + - name: Handle errors + ansible.builtin.debug: + msg: An error occurred. + + always: + - name: Cleanup operations + ansible.builtin.debug: + msg: Cleanup complete. + - name: Ensure Network Services is absent zscaler.ziacloud.zia_cloud_firewall_network_services: provider: "{{ zia_cloud }}" state: absent - name: "{{ name }}" + name: "{{ service_name }}" description: "{{ description }}" src_tcp_ports: "{{ src_tcp_ports }}" dest_tcp_ports: "{{ dest_tcp_ports }}" @@ -62,7 +75,7 @@ zscaler.ziacloud.zia_cloud_firewall_network_services: provider: "{{ zia_cloud }}" state: present - name: "{{ name }}" + name: "{{ service_name }}" description: "{{ description }}" src_tcp_ports: "{{ src_tcp_ports }}" dest_tcp_ports: "{{ dest_tcp_ports }}" @@ -83,7 +96,7 @@ zscaler.ziacloud.zia_cloud_firewall_network_services: provider: "{{ zia_cloud }}" state: present - name: "{{ name }}" + name: "{{ service_name }}" description: "{{ description }}" src_tcp_ports: "{{ src_tcp_ports }}" dest_tcp_ports: "{{ dest_tcp_ports }}" @@ -109,7 +122,7 @@ - name: Fetch this Network Services zscaler.ziacloud.zia_cloud_firewall_network_services_facts: provider: "{{ zia_cloud }}" - name: "{{ name }}" + name: "{{ service_name }}" register: result - name: Ensure this Network Services is found @@ -126,7 +139,7 @@ zscaler.ziacloud.zia_cloud_firewall_network_services: state: absent provider: "{{ zia_cloud }}" - name: "{{ name }}" + name: "{{ service_name }}" register: result - name: Verify Network Services is Deleted @@ -138,7 +151,7 @@ zscaler.ziacloud.zia_cloud_firewall_network_services: state: absent provider: "{{ zia_cloud }}" - name: "{{ name }}" + name: "{{ service_name }}" register: result - name: Verify the Network Services is deleted diff --git a/tests/integration/targets/zia_cloud_firewall_network_services_groups/defaults/main.yml b/tests/integration/targets/zia_cloud_firewall_network_services_groups/defaults/main.yml index e568b67..8a7eed5 100644 --- a/tests/integration/targets/zia_cloud_firewall_network_services_groups/defaults/main.yml +++ b/tests/integration/targets/zia_cloud_firewall_network_services_groups/defaults/main.yml @@ -1,4 +1,4 @@ --- # Network Services Group -name: test_zia_ansible +group_name: test_zia_ansible description: test_zia_ansible diff --git a/tests/integration/targets/zia_cloud_firewall_network_services_groups/tasks/main.yml b/tests/integration/targets/zia_cloud_firewall_network_services_groups/tasks/main.yml index 6405922..2d2ea9a 100644 --- a/tests/integration/targets/zia_cloud_firewall_network_services_groups/tasks/main.yml +++ b/tests/integration/targets/zia_cloud_firewall_network_services_groups/tasks/main.yml @@ -1,20 +1,21 @@ --- - name: Include default variables ansible.builtin.include_vars: - file: "../defaults/main.yml" + file: ../defaults/main.yml - name: Import Random String Generator Tasks - ansible.builtin.import_tasks: "../../../generate_random_string.yml" + ansible.builtin.import_tasks: ../../../generate_random_string.yml - name: Import Network Services ID - ansible.builtin.include_tasks: "../../../helper_tasks/zia_cloud_firewall_network_services/zia_cloud_firewall_network_services_facts.yml" + ansible.builtin.include_tasks: ../../../helper_tasks/zia_cloud_firewall_network_services/zia_cloud_firewall_network_services_facts.yml -- ansible.builtin.set_fact: - name: "{{ name }}_{{ random_string }}" +- name: Set dynamic name values with random string + ansible.builtin.set_fact: + group_name: "{{ group_name }}_{{ random_string }}" description: "{{ description }}_{{ random_string }}" - name: Ensure required environment variables are set - fail: + ansible.builtin.fail: msg: "{{ env_var }} is not defined as environment variable" when: lookup('env', env_var) is none loop: @@ -25,32 +26,44 @@ loop_control: loop_var: env_var -- ansible.builtin.set_fact: +- name: Ensure ZIA Credential environment variables are set + ansible.builtin.set_fact: zia_cloud: username: "{{ lookup('env', 'ZIA_USERNAME') }}" password: "{{ lookup('env', 'ZIA_PASSWORD') }}" api_key: "{{ lookup('env', 'ZIA_API_KEY') }}" cloud: "{{ lookup('env', 'ZIA_CLOUD') | default(omit) }}" - no_log: True + no_log: true -- block: +- name: Main block to Test Cloud Firewall Network Services Groups Configuration + block: # Network Services Group - name: Ensure Network Services Group (leftover) zscaler.ziacloud.zia_cloud_firewall_network_services_groups: provider: "{{ zia_cloud }}" state: absent - name: "{{ name }}" + name: "{{ group_name }}" service_ids: - "{{ service_id0 }}" - "{{ service_id1 }}" - "{{ service_id2 }}" register: result + rescue: + - name: Handle errors + ansible.builtin.debug: + msg: An error occurred. + + always: + - name: Cleanup operations + ansible.builtin.debug: + msg: Cleanup complete. + - name: Ensure Network Services Group is absent zscaler.ziacloud.zia_cloud_firewall_network_services_groups: provider: "{{ zia_cloud }}" state: absent - name: "{{ name }}" + name: "{{ group_name }}" service_ids: - "{{ service_id0 }}" - "{{ service_id1 }}" @@ -67,7 +80,7 @@ zscaler.ziacloud.zia_cloud_firewall_network_services_groups: provider: "{{ zia_cloud }}" state: present - name: "{{ name }}" + name: "{{ group_name }}" description: "{{ description }}" service_ids: - "{{ service_id0 }}" @@ -85,7 +98,7 @@ zscaler.ziacloud.zia_cloud_firewall_network_services_groups: provider: "{{ zia_cloud }}" state: present - name: "{{ name }}" + name: "{{ group_name }}" description: "{{ description }}" service_ids: - "{{ service_id0 }}" @@ -112,7 +125,7 @@ - name: Fetch this Network Services Group zscaler.ziacloud.zia_cloud_firewall_network_services_groups_facts: provider: "{{ zia_cloud }}" - name: "{{ name }}" + name: "{{ group_name }}" register: result - name: Ensure this Network Services Group is found @@ -131,7 +144,7 @@ zscaler.ziacloud.zia_cloud_firewall_network_services_groups: provider: "{{ zia_cloud }}" state: absent - name: "{{ name }}" + name: "{{ group_name }}" service_ids: - "{{ service_id0 }}" - "{{ service_id1 }}" @@ -147,7 +160,7 @@ zscaler.ziacloud.zia_cloud_firewall_network_services_groups: provider: "{{ zia_cloud }}" state: absent - name: "{{ name }}" + name: "{{ group_name }}" service_ids: - "{{ service_id0 }}" - "{{ service_id1 }}" diff --git a/tests/integration/targets/zia_cloud_firewall_time_windows_facts/defaults/main.yml b/tests/integration/targets/zia_cloud_firewall_time_windows_facts/defaults/main.yml index d53f805..aea686b 100644 --- a/tests/integration/targets/zia_cloud_firewall_time_windows_facts/defaults/main.yml +++ b/tests/integration/targets/zia_cloud_firewall_time_windows_facts/defaults/main.yml @@ -1,3 +1,4 @@ +--- time01: Off hours time02: Weekends time03: Work hours diff --git a/tests/integration/targets/zia_cloud_firewall_time_windows_facts/tasks/main.yml b/tests/integration/targets/zia_cloud_firewall_time_windows_facts/tasks/main.yml index bb444fb..131b9f9 100644 --- a/tests/integration/targets/zia_cloud_firewall_time_windows_facts/tasks/main.yml +++ b/tests/integration/targets/zia_cloud_firewall_time_windows_facts/tasks/main.yml @@ -1,10 +1,10 @@ --- - name: Include default variables ansible.builtin.include_vars: - file: "../defaults/main.yml" + file: ../defaults/main.yml - name: Ensure required environment variables are set - fail: + ansible.builtin.fail: msg: "{{ env_var }} is not defined as environment variable" when: lookup('env', env_var) is none loop: @@ -15,15 +15,17 @@ loop_control: loop_var: env_var -- ansible.builtin.set_fact: +- name: Ensure ZIA Credential environment variables are set + ansible.builtin.set_fact: zia_cloud: username: "{{ lookup('env', 'ZIA_USERNAME') }}" password: "{{ lookup('env', 'ZIA_PASSWORD') }}" api_key: "{{ lookup('env', 'ZIA_API_KEY') }}" cloud: "{{ lookup('env', 'ZIA_CLOUD') | default(omit) }}" - no_log: True + no_log: true -- block: +- name: Main block to Test Cloud Firewall Time Windows Configuration + block: - name: Fetch All Time Intervals zscaler.ziacloud.zia_cloud_firewall_time_windows_facts: provider: "{{ zia_cloud }}" diff --git a/tests/integration/targets/zia_dlp_dictionaries/defaults/main.yml b/tests/integration/targets/zia_dlp_dictionaries/defaults/main.yml index 9462f2b..639ef7f 100644 --- a/tests/integration/targets/zia_dlp_dictionaries/defaults/main.yml +++ b/tests/integration/targets/zia_dlp_dictionaries/defaults/main.yml @@ -1,19 +1,19 @@ --- -name: "test_zia_ansible" -description: "test_zia_ansible" -custom_phrase_match_type: "MATCH_ALL_CUSTOM_PHRASE_PATTERN_DICTIONARY" -dictionary_type: "PATTERNS_AND_PHRASES" +dict_name: test_zia_ansible +description: test_zia_ansible +custom_phrase_match_type: MATCH_ALL_CUSTOM_PHRASE_PATTERN_DICTIONARY +dictionary_type: PATTERNS_AND_PHRASES phrases: - - action: "PHRASE_COUNT_TYPE_UNIQUE" - phrase: "YourPhrase1" - - action: "PHRASE_COUNT_TYPE_UNIQUE" - phrase: "YourPhrase2" - - action: "PHRASE_COUNT_TYPE_UNIQUE" - phrase: "YourPhrase3" + - action: PHRASE_COUNT_TYPE_UNIQUE + phrase: YourPhrase1 + - action: PHRASE_COUNT_TYPE_UNIQUE + phrase: YourPhrase2 + - action: PHRASE_COUNT_TYPE_UNIQUE + phrase: YourPhrase3 patterns: - - action: "PATTERN_COUNT_TYPE_ALL" - pattern: "YourPattern1" - - action: "PATTERN_COUNT_TYPE_ALL" - pattern: "YourPattern2" - - action: "PATTERN_COUNT_TYPE_ALL" - pattern: "YourPattern3" + - action: PATTERN_COUNT_TYPE_ALL + pattern: YourPattern1 + - action: PATTERN_COUNT_TYPE_ALL + pattern: YourPattern2 + - action: PATTERN_COUNT_TYPE_ALL + pattern: YourPattern3 diff --git a/tests/integration/targets/zia_dlp_dictionaries/tasks/main.yml b/tests/integration/targets/zia_dlp_dictionaries/tasks/main.yml index 42d0445..4e02878 100644 --- a/tests/integration/targets/zia_dlp_dictionaries/tasks/main.yml +++ b/tests/integration/targets/zia_dlp_dictionaries/tasks/main.yml @@ -1,17 +1,18 @@ --- - name: Include default variables ansible.builtin.include_vars: - file: "../defaults/main.yml" + file: ../defaults/main.yml - name: Import Random String Generator Tasks - ansible.builtin.import_tasks: "../../../generate_random_string.yml" + ansible.builtin.import_tasks: ../../../generate_random_string.yml -- ansible.builtin.set_fact: - name: "{{ name }}_{{ random_string }}" +- name: Set dynamic name values with random string + ansible.builtin.set_fact: + dict_name: "{{ dict_name }}_{{ random_string }}" description: "{{ description }}_{{ random_string }}" - name: Ensure required environment variables are set - fail: + ansible.builtin.fail: msg: "{{ env_var }} is not defined as environment variable" when: lookup('env', env_var) is none loop: @@ -22,27 +23,39 @@ loop_control: loop_var: env_var -- ansible.builtin.set_fact: +- name: Ensure ZIA Credential environment variables are set + ansible.builtin.set_fact: zia_cloud: username: "{{ lookup('env', 'ZIA_USERNAME') }}" password: "{{ lookup('env', 'ZIA_PASSWORD') }}" api_key: "{{ lookup('env', 'ZIA_API_KEY') }}" cloud: "{{ lookup('env', 'ZIA_CLOUD') | default(omit) }}" - no_log: True + no_log: true -- block: +- name: Main block to Test DLP Dictionaries Configuration + block: - name: Ensure DLP Dictionary (leftover) zscaler.ziacloud.zia_dlp_dictionaries: provider: "{{ zia_cloud }}" state: absent - name: "{{ name }}" + name: "{{ dict_name }}" register: result + rescue: + - name: Handle errors + ansible.builtin.debug: + msg: An error occurred. + + always: + - name: Cleanup operations + ansible.builtin.debug: + msg: Cleanup complete. + - name: Ensure DLP Dictionary is absent zscaler.ziacloud.zia_dlp_dictionaries: provider: "{{ zia_cloud }}" state: absent - name: "{{ name }}" + name: "{{ dict_name }}" register: result - name: Verify DLP Dictionary is absent @@ -55,7 +68,7 @@ zscaler.ziacloud.zia_dlp_dictionaries: provider: "{{ zia_cloud }}" state: present - name: "{{ name }}" + name: "{{ dict_name }}" description: "{{ description }}" custom_phrase_match_type: "{{ custom_phrase_match_type }}" dictionary_type: "{{ dictionary_type }}" @@ -73,7 +86,7 @@ zscaler.ziacloud.zia_dlp_dictionaries: provider: "{{ zia_cloud }}" state: present - name: "{{ name }}" + name: "{{ dict_name }}" description: "{{ description }}" custom_phrase_match_type: "{{ custom_phrase_match_type }}" dictionary_type: "{{ dictionary_type }}" @@ -100,7 +113,7 @@ - name: Fetch this DLP Dictionary zscaler.ziacloud.zia_dlp_dictionaries_facts: provider: "{{ zia_cloud }}" - name: "{{ name }}" + name: "{{ dict_name }}" register: result - name: Ensure this DLP Dictionary is found @@ -119,7 +132,7 @@ zscaler.ziacloud.zia_dlp_dictionaries: provider: "{{ zia_cloud }}" state: absent - name: "{{ name }}" + name: "{{ dict_name }}" description: "{{ description }}" custom_phrase_match_type: "{{ custom_phrase_match_type }}" dictionary_type: "{{ dictionary_type }}" @@ -136,7 +149,7 @@ zscaler.ziacloud.zia_dlp_dictionaries: provider: "{{ zia_cloud }}" state: absent - name: "{{ name }}" + name: "{{ dict_name }}" description: "{{ description }}" custom_phrase_match_type: "{{ custom_phrase_match_type }}" dictionary_type: "{{ dictionary_type }}" diff --git a/tests/integration/targets/zia_dlp_engines/defaults/main.yml b/tests/integration/targets/zia_dlp_engines/defaults/main.yml index 3d55ce6..dbf3c51 100644 --- a/tests/integration/targets/zia_dlp_engines/defaults/main.yml +++ b/tests/integration/targets/zia_dlp_engines/defaults/main.yml @@ -1,5 +1,5 @@ --- -name: "test_zia_ansible" -description: "test_zia_ansible" -engine_expression: "((D63.S > 1))" +engine_name: test_zia_ansible +description: test_zia_ansible +engine_expression: ((D63.S > 1)) custom_dlp_engine: true diff --git a/tests/integration/targets/zia_dlp_engines/tasks/main.yml b/tests/integration/targets/zia_dlp_engines/tasks/main.yml index e2b9900..cf0d8b5 100644 --- a/tests/integration/targets/zia_dlp_engines/tasks/main.yml +++ b/tests/integration/targets/zia_dlp_engines/tasks/main.yml @@ -1,17 +1,18 @@ --- - name: Include default variables ansible.builtin.include_vars: - file: "../defaults/main.yml" + file: ../defaults/main.yml - name: Import Random String Generator Tasks - ansible.builtin.import_tasks: "../../../generate_random_string.yml" + ansible.builtin.import_tasks: ../../../generate_random_string.yml -- ansible.builtin.set_fact: - name: "{{ name }}_{{ random_string }}" +- name: Set dynamic name values with random string + ansible.builtin.set_fact: + engine_name: "{{ engine_name }}_{{ random_string }}" description: "{{ description }}_{{ random_string }}" - name: Ensure required environment variables are set - fail: + ansible.builtin.fail: msg: "{{ env_var }} is not defined as environment variable" when: lookup('env', env_var) is none loop: @@ -22,27 +23,39 @@ loop_control: loop_var: env_var -- ansible.builtin.set_fact: +- name: Ensure ZIA Credential environment variables are set + ansible.builtin.set_fact: zia_cloud: username: "{{ lookup('env', 'ZIA_USERNAME') }}" password: "{{ lookup('env', 'ZIA_PASSWORD') }}" api_key: "{{ lookup('env', 'ZIA_API_KEY') }}" cloud: "{{ lookup('env', 'ZIA_CLOUD') | default(omit) }}" - no_log: True + no_log: true -- block: +- name: Main block to Test DLP Engines Configuration + block: - name: Ensure DLP Engine (leftover) zscaler.ziacloud.zia_dlp_engine: provider: "{{ zia_cloud }}" state: absent - name: "{{ name }}" + name: "{{ engine_name }}" register: result + rescue: + - name: Handle errors + ansible.builtin.debug: + msg: An error occurred. + + always: + - name: Cleanup operations + ansible.builtin.debug: + msg: Cleanup complete. + - name: Ensure DLP Engine is absent zscaler.ziacloud.zia_dlp_engine: provider: "{{ zia_cloud }}" state: absent - name: "{{ name }}" + name: "{{ engine_name }}" register: result - name: Verify DLP Engine is absent @@ -55,7 +68,7 @@ zscaler.ziacloud.zia_dlp_engine: provider: "{{ zia_cloud }}" state: present - name: "{{ name }}" + name: "{{ engine_name }}" description: "{{ description }}" engine_expression: "{{ engine_expression }}" custom_dlp_engine: "{{ custom_dlp_engine }}" @@ -71,7 +84,7 @@ zscaler.ziacloud.zia_dlp_engine: provider: "{{ zia_cloud }}" state: present - name: "{{ name }}" + name: "{{ engine_name }}" description: "{{ description }}" engine_expression: "{{ engine_expression }}" custom_dlp_engine: "{{ custom_dlp_engine }}" @@ -96,7 +109,7 @@ - name: Fetch this DLP Engine zscaler.ziacloud.zia_dlp_engine_facts: provider: "{{ zia_cloud }}" - name: "{{ name }}" + name: "{{ engine_name }}" register: result - name: Debug Authentication Setting result @@ -119,7 +132,7 @@ zscaler.ziacloud.zia_dlp_engine: provider: "{{ zia_cloud }}" state: absent - name: "{{ name }}" + name: "{{ engine_name }}" description: "{{ description }}" engine_expression: "{{ engine_expression }}" custom_dlp_engine: "{{ custom_dlp_engine }}" @@ -134,7 +147,7 @@ zscaler.ziacloud.zia_dlp_engine: provider: "{{ zia_cloud }}" state: absent - name: "{{ name }}" + name: "{{ engine_name }}" description: "{{ description }}" engine_expression: "{{ engine_expression }}" custom_dlp_engine: "{{ custom_dlp_engine }}" diff --git a/tests/integration/targets/zia_dlp_icap_server_facts/defaults/main.yml b/tests/integration/targets/zia_dlp_icap_server_facts/defaults/main.yml index 2615ff2..9122eb2 100644 --- a/tests/integration/targets/zia_dlp_icap_server_facts/defaults/main.yml +++ b/tests/integration/targets/zia_dlp_icap_server_facts/defaults/main.yml @@ -1 +1,2 @@ +--- bd_icap01: ZS_BD_ICAP_01 diff --git a/tests/integration/targets/zia_dlp_icap_server_facts/tasks/main.yml b/tests/integration/targets/zia_dlp_icap_server_facts/tasks/main.yml index a16cb02..81385f8 100644 --- a/tests/integration/targets/zia_dlp_icap_server_facts/tasks/main.yml +++ b/tests/integration/targets/zia_dlp_icap_server_facts/tasks/main.yml @@ -1,13 +1,13 @@ --- - name: Include default variables ansible.builtin.include_vars: - file: "../defaults/main.yml" + file: ../defaults/main.yml - name: Import Random String Generator Tasks - ansible.builtin.import_tasks: "../../../generate_random_string.yml" + ansible.builtin.import_tasks: ../../../generate_random_string.yml - name: Ensure required environment variables are set - fail: + ansible.builtin.fail: msg: "{{ env_var }} is not defined as environment variable" when: lookup('env', env_var) is none loop: @@ -18,15 +18,17 @@ loop_control: loop_var: env_var -- ansible.builtin.set_fact: +- name: Ensure ZIA Credential environment variables are set + ansible.builtin.set_fact: zia_cloud: username: "{{ lookup('env', 'ZIA_USERNAME') }}" password: "{{ lookup('env', 'ZIA_PASSWORD') }}" api_key: "{{ lookup('env', 'ZIA_API_KEY') }}" cloud: "{{ lookup('env', 'ZIA_CLOUD') | default(omit) }}" - no_log: True + no_log: true -- block: +- name: Main block to Test DLP ICAP Server + block: - name: Fetch All ICAP Servers zscaler.ziacloud.zia_dlp_icap_server_facts: provider: "{{ zia_cloud }}" diff --git a/tests/integration/targets/zia_dlp_idm_profile_facts/defaults/main.yml b/tests/integration/targets/zia_dlp_idm_profile_facts/defaults/main.yml index ad6e827..095487c 100644 --- a/tests/integration/targets/zia_dlp_idm_profile_facts/defaults/main.yml +++ b/tests/integration/targets/zia_dlp_idm_profile_facts/defaults/main.yml @@ -1,2 +1,3 @@ +--- bd_idm01: ZS_BD_IDM01 bd_idm02: ZS_BD_IDM02 diff --git a/tests/integration/targets/zia_dlp_idm_profile_facts/tasks/main.yml b/tests/integration/targets/zia_dlp_idm_profile_facts/tasks/main.yml index 2b13cff..8178a71 100644 --- a/tests/integration/targets/zia_dlp_idm_profile_facts/tasks/main.yml +++ b/tests/integration/targets/zia_dlp_idm_profile_facts/tasks/main.yml @@ -1,13 +1,13 @@ --- - name: Include default variables ansible.builtin.include_vars: - file: "../defaults/main.yml" + file: ../defaults/main.yml - name: Import Random String Generator Tasks - ansible.builtin.import_tasks: "../../../generate_random_string.yml" + ansible.builtin.import_tasks: ../../../generate_random_string.yml - name: Ensure required environment variables are set - fail: + ansible.builtin.fail: msg: "{{ env_var }} is not defined as environment variable" when: lookup('env', env_var) is none loop: @@ -18,15 +18,17 @@ loop_control: loop_var: env_var -- ansible.builtin.set_fact: +- name: Ensure ZIA Credential environment variables are set + ansible.builtin.set_fact: zia_cloud: username: "{{ lookup('env', 'ZIA_USERNAME') }}" password: "{{ lookup('env', 'ZIA_PASSWORD') }}" api_key: "{{ lookup('env', 'ZIA_API_KEY') }}" cloud: "{{ lookup('env', 'ZIA_CLOUD') | default(omit) }}" - no_log: True + no_log: true -- block: +- name: Main block to Test DLP IDM Profile + block: - name: Fetch All DLP IDM Profile zscaler.ziacloud.zia_dlp_idm_profile_facts: provider: "{{ zia_cloud }}" diff --git a/tests/integration/targets/zia_dlp_incident_receiver_facts/defaults/main.yml b/tests/integration/targets/zia_dlp_incident_receiver_facts/defaults/main.yml index 4edfc65..24be33e 100644 --- a/tests/integration/targets/zia_dlp_incident_receiver_facts/defaults/main.yml +++ b/tests/integration/targets/zia_dlp_incident_receiver_facts/defaults/main.yml @@ -1,2 +1,3 @@ +--- bd_incident_receiver01: ZS_BD_INC_RECEIVER_01 bd_incident_receiver02: ZS_BD_INC_RECEIVER_02 diff --git a/tests/integration/targets/zia_dlp_incident_receiver_facts/tasks/main.yml b/tests/integration/targets/zia_dlp_incident_receiver_facts/tasks/main.yml index 51ebeef..647dea0 100644 --- a/tests/integration/targets/zia_dlp_incident_receiver_facts/tasks/main.yml +++ b/tests/integration/targets/zia_dlp_incident_receiver_facts/tasks/main.yml @@ -1,13 +1,13 @@ --- - name: Include default variables ansible.builtin.include_vars: - file: "../defaults/main.yml" + file: ../defaults/main.yml - name: Import Random String Generator Tasks - ansible.builtin.import_tasks: "../../../generate_random_string.yml" + ansible.builtin.import_tasks: ../../../generate_random_string.yml - name: Ensure required environment variables are set - fail: + ansible.builtin.fail: msg: "{{ env_var }} is not defined as environment variable" when: lookup('env', env_var) is none loop: @@ -18,15 +18,17 @@ loop_control: loop_var: env_var -- ansible.builtin.set_fact: +- name: Ensure ZIA Credential environment variables are set + ansible.builtin.set_fact: zia_cloud: username: "{{ lookup('env', 'ZIA_USERNAME') }}" password: "{{ lookup('env', 'ZIA_PASSWORD') }}" api_key: "{{ lookup('env', 'ZIA_API_KEY') }}" cloud: "{{ lookup('env', 'ZIA_CLOUD') | default(omit) }}" - no_log: True + no_log: true -- block: +- name: Main block to Test DLP Incident Receiver Configuration + block: - name: Fetch All Zscaler Incident Receiver zscaler.ziacloud.zia_dlp_incident_receiver_facts: provider: "{{ zia_cloud }}" diff --git a/tests/integration/targets/zia_dlp_notification_template/defaults/main.yml b/tests/integration/targets/zia_dlp_notification_template/defaults/main.yml index 83fb37a..6eb333e 100644 --- a/tests/integration/targets/zia_dlp_notification_template/defaults/main.yml +++ b/tests/integration/targets/zia_dlp_notification_template/defaults/main.yml @@ -1,5 +1,5 @@ --- -name: "test_zia_ansible" +template_name: test_zia_ansible attach_content: true tls_enabled: true subject: "DLP Violation: $${TRANSACTION_ID} $${RULENAME}" diff --git a/tests/integration/targets/zia_dlp_notification_template/tasks/main.yml b/tests/integration/targets/zia_dlp_notification_template/tasks/main.yml index 496da63..b1d9508 100644 --- a/tests/integration/targets/zia_dlp_notification_template/tasks/main.yml +++ b/tests/integration/targets/zia_dlp_notification_template/tasks/main.yml @@ -1,19 +1,17 @@ --- - name: Include default variables ansible.builtin.include_vars: - file: "../defaults/main.yml" + file: ../defaults/main.yml - name: Import Random String Generator Tasks - ansible.builtin.import_tasks: "../../../generate_random_string.yml" + ansible.builtin.import_tasks: ../../../generate_random_string.yml -- ansible.builtin.set_fact: - name: "{{ name }}_{{ random_string }}" - -- ansible.builtin.set_fact: - name: "{{ name }}_{{ random_string }}" +- name: Set dynamic name values with random string + ansible.builtin.set_fact: + template_name: "{{ template_name }}_{{ random_string }}" - name: Ensure required environment variables are set - fail: + ansible.builtin.fail: msg: "{{ env_var }} is not defined as environment variable" when: lookup('env', env_var) is none loop: @@ -24,27 +22,39 @@ loop_control: loop_var: env_var -- ansible.builtin.set_fact: +- name: Ensure ZIA Credential environment variables are set + ansible.builtin.set_fact: zia_cloud: username: "{{ lookup('env', 'ZIA_USERNAME') }}" password: "{{ lookup('env', 'ZIA_PASSWORD') }}" api_key: "{{ lookup('env', 'ZIA_API_KEY') }}" cloud: "{{ lookup('env', 'ZIA_CLOUD') | default(omit) }}" - no_log: True + no_log: true -- block: +- name: Main block to Test DLP Notification Template Configuration + block: - name: Ensure DLP Notification Template (leftover) zscaler.ziacloud.zia_dlp_notification_template: provider: "{{ zia_cloud }}" state: absent - name: "{{ name }}" + name: "{{ template_name }}" register: result + rescue: + - name: Handle errors + ansible.builtin.debug: + msg: An error occurred. + + always: + - name: Cleanup operations + ansible.builtin.debug: + msg: Cleanup complete. + - name: Ensure DLP Notification Template is absent zscaler.ziacloud.zia_dlp_notification_template: provider: "{{ zia_cloud }}" state: absent - name: "{{ name }}" + name: "{{ template_name }}" register: result - name: Verify DLP Notification Template is absent @@ -57,7 +67,7 @@ zscaler.ziacloud.zia_dlp_notification_template: provider: "{{ zia_cloud }}" state: present - name: "{{ name }}" + name: "{{ template_name }}" attach_content: "{{ attach_content }}" tls_enabled: "{{ tls_enabled }}" subject: "{{ subject }}" @@ -76,7 +86,7 @@ zscaler.ziacloud.zia_dlp_notification_template: provider: "{{ zia_cloud }}" state: present - name: "{{ name }}" + name: "{{ template_name }}" attach_content: "{{ attach_content }}" tls_enabled: "{{ tls_enabled }}" subject: "{{ subject }}" @@ -93,7 +103,7 @@ zscaler.ziacloud.zia_dlp_notification_template: provider: "{{ zia_cloud }}" state: present - name: "{{ name }}" + name: "{{ template_name }}" subject: "{{ subject }}" attach_content: "{{ attach_content_update }}" tls_enabled: "{{ tls_enabled_update }}" @@ -114,7 +124,7 @@ zscaler.ziacloud.zia_dlp_notification_template: provider: "{{ zia_cloud }}" state: present - name: "{{ name }}" + name: "{{ template_name }}" subject: "{{ subject }}" attach_content: "{{ attach_content_update }}" tls_enabled: "{{ tls_enabled_update }}" @@ -141,7 +151,7 @@ - name: Fetch this DLP Notification Template zscaler.ziacloud.zia_dlp_notification_template_facts: provider: "{{ zia_cloud }}" - name: "{{ name }}" + name: "{{ template_name }}" register: result - name: Ensure this DLP Notification Template is found @@ -160,7 +170,7 @@ zscaler.ziacloud.zia_dlp_notification_template: provider: "{{ zia_cloud }}" state: absent - name: "{{ name }}" + name: "{{ template_name }}" register: result - name: Verify DLP Notification Template is Deleted @@ -172,7 +182,7 @@ zscaler.ziacloud.zia_dlp_notification_template: provider: "{{ zia_cloud }}" state: absent - name: "{{ name }}" + name: "{{ template_name }}" register: result - name: Verify DLP Notification Template is absent diff --git a/tests/integration/targets/zia_dlp_web_rules/defaults/main.yml b/tests/integration/targets/zia_dlp_web_rules/defaults/main.yml index 46c5ada..8373070 100644 --- a/tests/integration/targets/zia_dlp_web_rules/defaults/main.yml +++ b/tests/integration/targets/zia_dlp_web_rules/defaults/main.yml @@ -1,8 +1,8 @@ --- -name: test_zia_ansible +rule_name: test_zia_ansible description: test_zia_ansible -action: "BLOCK" -order: 1 +rule_action: BLOCK +rule_order: 1 rank: 7 enabled: true without_content_inspection: false @@ -17,15 +17,15 @@ protocols: - HTTPS_RULE - HTTP_RULE file_types: - - "ASM" - - "MATLAB_FILES" - - "SAS" - - "SCALA" + - ASM + - MATLAB_FILES + - SAS + - SCALA # Web DLP Rule Update name_update: test_zia_ansible description_update: test_zia_ansible -action_update: "BLOCK" +action_update: BLOCK order_update: 1 rank_update: 7 enabled_update: false @@ -39,6 +39,6 @@ protocols_update: - HTTPS_RULE - HTTP_RULE file_types_update: - - "ASM" - - "MATLAB_FILES" - - "SAS" + - ASM + - MATLAB_FILES + - SAS diff --git a/tests/integration/targets/zia_dlp_web_rules/tasks/main.yml b/tests/integration/targets/zia_dlp_web_rules/tasks/main.yml index bc66950..5e5bd1b 100644 --- a/tests/integration/targets/zia_dlp_web_rules/tasks/main.yml +++ b/tests/integration/targets/zia_dlp_web_rules/tasks/main.yml @@ -1,17 +1,18 @@ --- - name: Include default variables ansible.builtin.include_vars: - file: "../defaults/main.yml" + file: ../defaults/main.yml - name: Import Random String Generator Tasks - ansible.builtin.import_tasks: "../../../generate_random_string.yml" + ansible.builtin.import_tasks: ../../../generate_random_string.yml -- ansible.builtin.set_fact: - name: "{{ name }}_{{ random_string }}" +- name: Set dynamic name values with random string + ansible.builtin.set_fact: + rule_name: "{{ rule_name }}_{{ random_string }}" description: "{{ description }}_{{ random_string }}" - name: Ensure required environment variables are set - fail: + ansible.builtin.fail: msg: "{{ env_var }} is not defined as environment variable" when: lookup('env', env_var) is none loop: @@ -22,27 +23,39 @@ loop_control: loop_var: env_var -- ansible.builtin.set_fact: +- name: Ensure ZIA Credential environment variables are set + ansible.builtin.set_fact: zia_cloud: username: "{{ lookup('env', 'ZIA_USERNAME') }}" password: "{{ lookup('env', 'ZIA_PASSWORD') }}" api_key: "{{ lookup('env', 'ZIA_API_KEY') }}" cloud: "{{ lookup('env', 'ZIA_CLOUD') | default(omit) }}" - no_log: True + no_log: true -- block: +- name: Main block for DLP Web Rule Configuration + block: - name: Ensure Cloud Web DLP Rule (leftover) zscaler.ziacloud.zia_dlp_web_rules: provider: "{{ zia_cloud }}" state: absent - name: "{{ name }}" + name: "{{ rule_name }}" register: result + rescue: + - name: Handle errors + ansible.builtin.debug: + msg: An error occurred. + + always: + - name: Cleanup operations + ansible.builtin.debug: + msg: Cleanup complete. + - name: Ensure Cloud Web DLP Rule is absent zscaler.ziacloud.zia_dlp_web_rules: provider: "{{ zia_cloud }}" state: absent - name: "{{ name }}" + name: "{{ rule_name }}" register: result - name: Verify Cloud Web DLP Rule is absent @@ -55,10 +68,10 @@ zscaler.ziacloud.zia_dlp_web_rules: provider: "{{ zia_cloud }}" state: present - name: "{{ name }}" + name: "{{ rule_name }}" description: "{{ description }}" - action: "{{ action }}" - order: "{{ order }}" + action: "{{ rule_action }}" + order: "{{ rule_order }}" rank: "{{ rank }}" enabled: "{{ enabled }}" without_content_inspection: "{{ without_content_inspection }}" @@ -79,10 +92,10 @@ zscaler.ziacloud.zia_dlp_web_rules: provider: "{{ zia_cloud }}" state: present - name: "{{ name }}" + name: "{{ rule_name }}" description: "{{ description }}" - action: "{{ action }}" - order: "{{ order }}" + action: "{{ rule_action }}" + order: "{{ rule_order }}" rank: "{{ rank }}" enabled: "{{ enabled }}" without_content_inspection: "{{ without_content_inspection }}" @@ -112,7 +125,7 @@ zscaler.ziacloud.zia_dlp_web_rules: provider: "{{ zia_cloud }}" state: present - name: "{{ name }}" + name: "{{ rule_name }}" description: "{{ description }}" action: "{{ action_update }}" order: "{{ order_update }}" @@ -138,7 +151,7 @@ zscaler.ziacloud.zia_dlp_web_rules: provider: "{{ zia_cloud }}" state: present - name: "{{ name }}" + name: "{{ rule_name }}" description: "{{ description }}" action: "{{ action_update }}" order: "{{ order_update }}" @@ -170,7 +183,7 @@ - name: Fetch this Cloud Web DLP Rule zscaler.ziacloud.zia_dlp_web_rules_facts: provider: "{{ zia_cloud }}" - name: "{{ name }}" + name: "{{ rule_name }}" register: result - name: Ensure this Cloud Web DLP Rule is found @@ -189,8 +202,8 @@ zscaler.ziacloud.zia_dlp_web_rules: provider: "{{ zia_cloud }}" state: absent - name: "{{ name }}" - order: "{{ order }}" + name: "{{ rule_name }}" + order: "{{ rule_order }}" register: result - name: Verify Cloud Web DLP Rule is Deleted @@ -202,8 +215,8 @@ zscaler.ziacloud.zia_dlp_web_rules: provider: "{{ zia_cloud }}" state: absent - name: "{{ name }}" - order: "{{ order }}" + name: "{{ rule_name }}" + order: "{{ rule_order }}" register: result - name: Verify Cloud Web DLP Rule is absent diff --git a/tests/integration/targets/zia_forwarding_control_policy/defaults/main.yml b/tests/integration/targets/zia_forwarding_control_policy/defaults/main.yml index 8066c2c..b3ca49c 100644 --- a/tests/integration/targets/zia_forwarding_control_policy/defaults/main.yml +++ b/tests/integration/targets/zia_forwarding_control_policy/defaults/main.yml @@ -1,17 +1,17 @@ --- -name: test_zia_ansible +rule_name: test_zia_ansible description: test_zia_ansible -type: "FORWARDING" -forward_method: "DIRECT" -order: 1 +type: FORWARDING +forward_method: DIRECT +rule_order: 1 enabled: true dest_countries: - BR - CA - US src_ips: - - "192.168.100.0/24" - - "192.168.200.1" + - 192.168.100.0/24 + - 192.168.200.1 dest_addresses: - 3.217.228.0-3.217.231.255 - 3.235.112.0-3.235.119.255 @@ -19,10 +19,10 @@ dest_addresses: - server1.acme.com - "*.acme.com" dest_ip_categories: - - "BOTNET" - - "MALWARE_SITE" - - "PHISHING" - - "SUSPICIOUS_DESTINATION" + - BOTNET + - MALWARE_SITE + - PHISHING + - SUSPICIOUS_DESTINATION # Cloud Firewall Rule Update name_update: test_zia_ansible @@ -32,16 +32,16 @@ dest_countries_update: - BR - CA src_ips_update: - - "192.168.100.0/24" + - 192.168.100.0/24 dest_addresses_update: - 3.217.228.0-3.217.231.255 - 3.235.112.0-3.235.119.255 - 35.80.88.0-35.80.95.255 dest_ip_categories_update: - - "BOTNET" - - "MALWARE_SITE" - - "PHISHING" + - BOTNET + - MALWARE_SITE + - PHISHING device_trust_levels_update: - - "UNKNOWN_DEVICETRUSTLEVEL" - - "MEDIUM_TRUST" - - "HIGH_TRUST" + - UNKNOWN_DEVICETRUSTLEVEL + - MEDIUM_TRUST + - HIGH_TRUST diff --git a/tests/integration/targets/zia_forwarding_control_policy/tasks/main.yml b/tests/integration/targets/zia_forwarding_control_policy/tasks/main.yml index 4a20d2d..6b18a70 100644 --- a/tests/integration/targets/zia_forwarding_control_policy/tasks/main.yml +++ b/tests/integration/targets/zia_forwarding_control_policy/tasks/main.yml @@ -1,20 +1,19 @@ --- - name: Include default variables ansible.builtin.include_vars: - file: "../defaults/main.yml" + file: ../defaults/main.yml - name: Import Random String Generator Tasks - ansible.builtin.import_tasks: "../../../generate_random_string.yml" + ansible.builtin.import_tasks: ../../../generate_random_string.yml -- ansible.builtin.set_fact: - name: "{{ name }}_{{ random_string }}" +- name: Set dynamic name values with random string + ansible.builtin.set_fact: + rule_name: "{{ rule_name }}_{{ random_string }}" description: "{{ description }}_{{ random_string }}" - -- ansible.builtin.set_fact: description_update: "{{ description_update }}_{{ random_string }}" - name: Ensure required environment variables are set - fail: + ansible.builtin.fail: msg: "{{ env_var }} is not defined as environment variable" when: lookup('env', env_var) is none loop: @@ -25,29 +24,41 @@ loop_control: loop_var: env_var -- ansible.builtin.set_fact: +- name: Ensure ZIA Credential environment variables are set + ansible.builtin.set_fact: zia_cloud: username: "{{ lookup('env', 'ZIA_USERNAME') }}" password: "{{ lookup('env', 'ZIA_PASSWORD') }}" api_key: "{{ lookup('env', 'ZIA_API_KEY') }}" cloud: "{{ lookup('env', 'ZIA_CLOUD') | default(omit) }}" - no_log: True + no_log: true -- block: +- name: Main block for Forwarding Control Rule Configuration + block: - name: Ensure Forwarding Control Rule (leftover) zscaler.ziacloud.zia_forwarding_control_policy: provider: "{{ zia_cloud }}" state: absent - name: "{{ name }}" - order: "{{ order }}" + name: "{{ rule_name }}" + order: "{{ rule_order }}" register: result + rescue: + - name: Handle errors + ansible.builtin.debug: + msg: An error occurred. + + always: + - name: Cleanup operations + ansible.builtin.debug: + msg: Cleanup complete. + - name: Ensure Forwarding Control Rule is absent zscaler.ziacloud.zia_forwarding_control_policy: provider: "{{ zia_cloud }}" state: absent - name: "{{ name }}" - order: "{{ order }}" + name: "{{ rule_name }}" + order: "{{ rule_order }}" register: result - name: Verify Forwarding Control Rule is absent @@ -60,11 +71,11 @@ zscaler.ziacloud.zia_forwarding_control_policy: provider: "{{ zia_cloud }}" state: present - name: "{{ name }}" + name: "{{ rule_name }}" description: "{{ description }}" type: "{{ type }}" forward_method: "{{ forward_method }}" - order: "{{ order }}" + order: "{{ rule_order }}" enabled: "{{ enabled }}" src_ips: "{{ src_ips }}" dest_countries: "{{ dest_countries }}" @@ -82,11 +93,11 @@ zscaler.ziacloud.zia_forwarding_control_policy: provider: "{{ zia_cloud }}" state: present - name: "{{ name }}" + name: "{{ rule_name }}" description: "{{ description }}" type: "{{ type }}" forward_method: "{{ forward_method }}" - order: "{{ order }}" + order: "{{ rule_order }}" enabled: "{{ enabled }}" src_ips: "{{ src_ips }}" dest_countries: "{{ dest_countries }}" @@ -102,11 +113,11 @@ zscaler.ziacloud.zia_forwarding_control_policy: provider: "{{ zia_cloud }}" state: present - name: "{{ name }}" + name: "{{ rule_name }}" description: "{{ description_update }}" type: "{{ type }}" forward_method: "{{ forward_method }}" - order: "{{ order }}" + order: "{{ rule_order }}" enabled: "{{ enabled }}" src_ips: "{{ src_ips }}" dest_countries: "{{ dest_countries }}" @@ -125,11 +136,11 @@ zscaler.ziacloud.zia_forwarding_control_policy: provider: "{{ zia_cloud }}" state: present - name: "{{ name }}" + name: "{{ rule_name }}" description: "{{ description_update }}" type: "{{ type }}" forward_method: "{{ forward_method }}" - order: "{{ order }}" + order: "{{ rule_order }}" enabled: "{{ enabled }}" src_ips: "{{ src_ips }}" dest_countries: "{{ dest_countries }}" @@ -155,7 +166,7 @@ - name: Fetch this Forwarding Control Rule zscaler.ziacloud.zia_forwarding_control_policy_facts: provider: "{{ zia_cloud }}" - name: "{{ name }}" + name: "{{ rule_name }}" register: result - name: Ensure this Forwarding Control Rule is found @@ -174,8 +185,8 @@ zscaler.ziacloud.zia_forwarding_control_policy: provider: "{{ zia_cloud }}" state: absent - name: "{{ name }}" - order: "{{ order }}" + name: "{{ rule_name }}" + order: "{{ rule_order }}" register: result - name: Verify Forwarding Control Rule is Deleted @@ -187,8 +198,8 @@ zscaler.ziacloud.zia_forwarding_control_policy: provider: "{{ zia_cloud }}" state: absent - name: "{{ name }}" - order: "{{ order }}" + name: "{{ rule_name }}" + order: "{{ rule_order }}" register: result - name: Verify Forwarding Control Rule is absent diff --git a/tests/integration/targets/zia_location_management/defaults/main.yml b/tests/integration/targets/zia_location_management/defaults/main.yml index a7e8ac9..d9f5347 100644 --- a/tests/integration/targets/zia_location_management/defaults/main.yml +++ b/tests/integration/targets/zia_location_management/defaults/main.yml @@ -1,15 +1,12 @@ -name: "USA_SJC_37" -description: "Created with Ansible" -country: "UNITED_STATES" -tz: "UNITED_STATES_AMERICA_LOS_ANGELES" +--- +location_name: USA_SJC_37 +description: Created with Ansible +country: UNITED_STATES +tz: UNITED_STATES_AMERICA_LOS_ANGELES auth_required: true idle_time_in_minutes: 720 -display_time_unit: "HOUR" +display_time_unit: HOUR surrogate_ip: true xff_forward_enabled: true ofw_enabled: true ips_control: true -ip_addresses: "1.1.1.1" -vpn_credentials: - - id: "{{ vpn_credential_ufqdn.data.id }}" - type: "{{ vpn_credential_ufqdn.data.type }}" diff --git a/tests/integration/targets/zia_location_management/tasks/main.yml b/tests/integration/targets/zia_location_management/tasks/main.yml index 08627ae..a087944 100644 --- a/tests/integration/targets/zia_location_management/tasks/main.yml +++ b/tests/integration/targets/zia_location_management/tasks/main.yml @@ -1,59 +1,66 @@ --- -- block: - - name: Ensure ZIA API Credential is Set - ansible.builtin.fail: - msg: username, password and api_key should be defined in tests/integration/integration_config.yml - when: - - username is not defined - - username | length == 0 - - password is not defined - - password | length == 0 - - api_key is not defined - - api_key | length == 0 - - base_url | is not defined - - base_url | length == 0 +- name: Include default variables + ansible.builtin.include_vars: + file: ../defaults/main.yml +- name: Import Random String Generator Tasks + ansible.builtin.import_tasks: ../../../generate_random_string.yml + +- name: Set dynamic name values with random string + ansible.builtin.set_fact: + location_name: "{{ location_name }}_{{ random_string }}" + +- name: Create UFQDN VPN Credential + ansible.builtin.include_tasks: ../../../helper_tasks/zia_traffic_forwarding_vpn_credentials/create_ufqdn_vpn_credentials.yml + +- name: Verify UFQDN VPN Credential + ansible.builtin.include_tasks: ../../../helper_tasks/zia_traffic_forwarding_vpn_credentials/verify_ufqdn_vpn_credentials.yml + +- name: Ensure required environment variables are set + ansible.builtin.fail: + msg: "{{ env_var }} is not defined as environment variable" + when: lookup('env', env_var) is none + loop: + - ZIA_USERNAME + - ZIA_PASSWORD + - ZIA_API_KEY + - ZIA_CLOUD + loop_control: + loop_var: env_var + +- name: Ensure ZIA Credential environment variables are set + ansible.builtin.set_fact: + zia_cloud: + username: "{{ lookup('env', 'ZIA_USERNAME') }}" + password: "{{ lookup('env', 'ZIA_PASSWORD') }}" + api_key: "{{ lookup('env', 'ZIA_API_KEY') }}" + cloud: "{{ lookup('env', 'ZIA_CLOUD') | default(omit) }}" + no_log: true + +- name: Main block to Test Location Management Configuration + block: - name: Ensure Location is absent (leftover) zscaler.ziacloud.zia_location_management: + provider: "{{ zia_cloud }}" state: absent - username: "{{ username }}" - password: "{{ password }}" - api_key: "{{ api_key }}" - base_url: "{{ base_url }}" - name: "{{ name }}" - description: "{{ description }}" - country: "{{ country }}" - tz: "{{ tz }}" - auth_required: "{{ auth_required }}" - idle_time_in_minutes: "{{ idle_time_in_minutes }}" - display_time_unit: "{{ display_time_unit }}" - surrogate_ip: "{{ surrogate_ip }}" - xff_forward_enabled: "{{ xff_forward_enabled }}" - ofw_enabled: "{{ ofw_enabled }}" - ips_control: "{{ ips_control }}" - ip_addresses: "{{ ip_addresses }}" - ignore_errors: true # In case one was left from previous run + name: "{{ location_name }}" register: result + rescue: + - name: Handle errors + ansible.builtin.debug: + msg: An error occurred. + + always: + - name: Cleanup operations + ansible.builtin.debug: + msg: Cleanup complete. + - name: Ensure Location is absent zscaler.ziacloud.zia_location_management: + provider: "{{ zia_cloud }}" state: absent - username: "{{ username }}" - password: "{{ password }}" - api_key: "{{ api_key }}" - base_url: "{{ base_url }}" - name: "{{ name }}" - description: "{{ description }}" - country: "{{ country }}" - tz: "{{ tz }}" - auth_required: "{{ auth_required }}" - idle_time_in_minutes: "{{ idle_time_in_minutes }}" - display_time_unit: "{{ display_time_unit }}" - surrogate_ip: "{{ surrogate_ip }}" - xff_forward_enabled: "{{ xff_forward_enabled }}" - ofw_enabled: "{{ ofw_enabled }}" - ips_control: "{{ ips_control }}" - ip_addresses: "{{ ip_addresses }}" + name: "{{ location_name }}" register: result - name: Verify Location is absent @@ -63,12 +70,9 @@ - name: Ensure Location is (Present) zscaler.ziacloud.zia_location_management: + provider: "{{ zia_cloud }}" state: present - username: "{{ username }}" - password: "{{ password }}" - api_key: "{{ api_key }}" - base_url: "{{ base_url }}" - name: "{{ name }}" + name: "{{ location_name }}" description: "{{ description }}" country: "{{ country }}" tz: "{{ tz }}" @@ -79,27 +83,30 @@ xff_forward_enabled: "{{ xff_forward_enabled }}" ofw_enabled: "{{ ofw_enabled }}" ips_control: "{{ ips_control }}" - ip_addresses: "{{ ip_addresses }}" + vpn_credentials: + - id: "{{ vpn_id }}" + type: "{{ vpn_type }}" register: result + - name: Set fact for expected change + ansible.builtin.set_fact: + is_location_creation: "{{ result.changed }}" + - name: Verify Location is Present ansible.builtin.assert: that: - - not result.changed + - (is_location_creation or not result.changed) - result.data is defined - result.data.name is defined - - result.data.name == name + - result.data.name == location_name - result.data.description is defined - result.data.description == description - name: Ensure Location is (again; idempotency check) zscaler.ziacloud.zia_location_management: + provider: "{{ zia_cloud }}" state: present - username: "{{ username }}" - password: "{{ password }}" - api_key: "{{ api_key }}" - base_url: "{{ base_url }}" - name: "{{ name }}" + name: "{{ location_name }}" description: "{{ description }}" country: "{{ country }}" tz: "{{ tz }}" @@ -110,20 +117,28 @@ xff_forward_enabled: "{{ xff_forward_enabled }}" ofw_enabled: "{{ ofw_enabled }}" ips_control: "{{ ips_control }}" - ip_addresses: "{{ ip_addresses }}" + vpn_credentials: + - id: "{{ vpn_id }}" + type: "{{ vpn_type }}" register: result - - name: Verify Location is absent + - name: Set fact for expected change + ansible.builtin.set_fact: + is_location_creation: "{{ result.changed }}" + + - name: Verify Location is Present ansible.builtin.assert: that: - - not result.changed + - (is_location_creation or not result.changed) + - result.data is defined + - result.data.name is defined + - result.data.name == location_name + - result.data.description is defined + - result.data.description == description - name: Fetch All Locations zscaler.ziacloud.zia_location_management_facts: - username: "{{ username }}" - password: "{{ password }}" - api_key: "{{ api_key }}" - base_url: "{{ base_url }}" + provider: "{{ zia_cloud }}" register: result - name: Ensure all Locations found @@ -134,11 +149,8 @@ - name: Fetch this Location zscaler.ziacloud.zia_location_management_facts: - username: "{{ username }}" - password: "{{ password }}" - api_key: "{{ api_key }}" - base_url: "{{ base_url }}" - name: "{{ name }}" + provider: "{{ zia_cloud }}" + name: "{{ location_name }}" register: result - name: Ensure this Location is found @@ -146,35 +158,43 @@ that: - not result.changed - result.data is defined - - result.data.name is defined - - result.data.name == name + - result.data[0].name is defined + - result.data[0].name == location_name + + - name: Give the ZIA Cloud a 5 seconds to settle + ansible.builtin.pause: + seconds: 5 + + - name: Check if Location Exists + zscaler.ziacloud.zia_location_management_facts: + provider: "{{ zia_cloud }}" + name: "{{ location_name }}" + register: location_check - - name: Delete Location + - name: Delete Location if Exists zscaler.ziacloud.zia_location_management: + provider: "{{ zia_cloud }}" state: absent - username: "{{ username }}" - password: "{{ password }}" - api_key: "{{ api_key }}" - base_url: "{{ base_url }}" - name: "{{ name }}" - register: result + name: "{{ location_name }}" + when: location_check.data | length > 0 + register: deletion_result - - name: Verify Location is Deleted + - name: Verify Location was Deleted ansible.builtin.assert: that: - - not result.changed + - deletion_result.changed - - name: Delete Location (again; idempotency check) + - name: Verify Idempotency zscaler.ziacloud.zia_location_management: + provider: "{{ zia_cloud }}" state: absent - username: "{{ username }}" - password: "{{ password }}" - api_key: "{{ api_key }}" - base_url: "{{ base_url }}" - name: "{{ name }}" - register: result + name: "{{ location_name }}" + register: idempotent_check - - name: Verify the Location is deleted + - name: Assert No Change on Second Deletion Attempt ansible.builtin.assert: that: - - not result.changed + - not idempotent_check.changed + +- name: Clean up VPN Credentials + ansible.builtin.include_tasks: ../../../helper_tasks/zia_traffic_forwarding_vpn_credentials/delete_ufqdn_vpn_credentials.yml diff --git a/tests/integration/targets/zia_rule_labels/defaults/main.yml b/tests/integration/targets/zia_rule_labels/defaults/main.yml index c667aed..45083f9 100644 --- a/tests/integration/targets/zia_rule_labels/defaults/main.yml +++ b/tests/integration/targets/zia_rule_labels/defaults/main.yml @@ -1,3 +1,3 @@ --- -name: test_zia_rule_label +label_name: test_zia_rule_label description: test_zia_rule_label diff --git a/tests/integration/targets/zia_rule_labels/tasks/main.yml b/tests/integration/targets/zia_rule_labels/tasks/main.yml index 3673bbd..71de980 100644 --- a/tests/integration/targets/zia_rule_labels/tasks/main.yml +++ b/tests/integration/targets/zia_rule_labels/tasks/main.yml @@ -1,17 +1,18 @@ --- - name: Include default variables ansible.builtin.include_vars: - file: "../defaults/main.yml" + file: ../defaults/main.yml - name: Import Random String Generator Tasks - ansible.builtin.import_tasks: "../../../generate_random_string.yml" + ansible.builtin.import_tasks: ../../../generate_random_string.yml -- ansible.builtin.set_fact: - appended_name: "{{ name }}_{{ random_string }}" +- name: Set dynamic name values with random string + ansible.builtin.set_fact: + appended_name: "{{ label_name }}_{{ random_string }}" appended_description: "{{ description }}_{{ random_string }}" - name: Ensure required environment variables are set - fail: + ansible.builtin.fail: msg: "{{ env_var }} is not defined as environment variable" when: lookup('env', env_var) is none loop: @@ -22,15 +23,17 @@ loop_control: loop_var: env_var -- ansible.builtin.set_fact: +- name: Ensure ZIA Credential environment variables are set + ansible.builtin.set_fact: zia_cloud: username: "{{ lookup('env', 'ZIA_USERNAME') }}" password: "{{ lookup('env', 'ZIA_PASSWORD') }}" api_key: "{{ lookup('env', 'ZIA_API_KEY') }}" cloud: "{{ lookup('env', 'ZIA_CLOUD') | default(omit) }}" - no_log: True + no_log: true -- block: +- name: Main block for Static IP Address Configuration + block: - name: Ensure Rule Label is absent (leftover) zscaler.ziacloud.zia_rule_labels: provider: "{{ zia_cloud }}" @@ -38,6 +41,16 @@ name: "{{ appended_name }}" register: result + rescue: + - name: Handle errors + ansible.builtin.debug: + msg: An error occurred. + + always: + - name: Cleanup operations + ansible.builtin.debug: + msg: Cleanup complete. + - name: Ensure Rule Label is absent zscaler.ziacloud.zia_rule_labels: provider: "{{ zia_cloud }}" diff --git a/tests/integration/targets/zia_sandbox_advanced_settings/tasks/main.yml b/tests/integration/targets/zia_sandbox_advanced_settings/tasks/main.yml index 8ef19ef..bc8302a 100644 --- a/tests/integration/targets/zia_sandbox_advanced_settings/tasks/main.yml +++ b/tests/integration/targets/zia_sandbox_advanced_settings/tasks/main.yml @@ -1,10 +1,10 @@ --- - name: Read MD5 Hashes from file - set_fact: + ansible.builtin.set_fact: md5_hashes: "{{ lookup('file', '../defaults/md5_hashes.txt').splitlines() }}" - name: Ensure required environment variables are set - fail: + ansible.builtin.fail: msg: "{{ env_var }} is not defined as environment variable" when: lookup('env', env_var) is none loop: @@ -15,15 +15,17 @@ loop_control: loop_var: env_var -- ansible.builtin.set_fact: +- name: Ensure ZIA Credential environment variables are set + ansible.builtin.set_fact: zia_cloud: username: "{{ lookup('env', 'ZIA_USERNAME') }}" password: "{{ lookup('env', 'ZIA_PASSWORD') }}" api_key: "{{ lookup('env', 'ZIA_API_KEY') }}" cloud: "{{ lookup('env', 'ZIA_CLOUD') | default(omit) }}" - no_log: True + no_log: true -- block: +- name: Main block to Test Sandbox Advanced Settings Configuration + block: # Sandbox Advanced Settings - name: Clear Sandbox Advanced Setting (if any exists) zscaler.ziacloud.zia_sandbox_advanced_settings: @@ -37,7 +39,8 @@ provider: "{{ zia_cloud }}" register: initial_fetch_result - - set_fact: + - name: Set Facts for Initial and Remaining File Hash Counts + ansible.builtin.set_fact: initial_blocked_count: "{{ initial_fetch_result.data.file_hash_count.blocked_file_hashes_count | int }}" initial_remaining_count: "{{ initial_fetch_result.data.file_hash_count.remaining_file_hashes | int }}" @@ -52,8 +55,8 @@ ansible.builtin.assert: that: - add_result.changed # Should reflect a change - - "add_result.file_hash_count.blocked_file_hashes_count | int == initial_blocked_count | int + (md5_hashes | length)" - - "add_result.file_hash_count.remaining_file_hashes | int == initial_remaining_count | int - (md5_hashes | length)" + - add_result.file_hash_count.blocked_file_hashes_count | int == initial_blocked_count | int + (md5_hashes | length) + - add_result.file_hash_count.remaining_file_hashes | int == initial_remaining_count | int - (md5_hashes | length) msg: | Failed to verify the addition of MD5 hashes. Expected blocked hashes: {{ initial_blocked_count | int + (md5_hashes | length) }} @@ -104,7 +107,7 @@ register: final_fetch_result - name: Debug initial and final counts - debug: + ansible.builtin.debug: msg: initial_blocked_count: "{{ initial_blocked_count }}" initial_remaining_count: "{{ initial_remaining_count }}" @@ -112,7 +115,7 @@ final_remaining_count: "{{ final_fetch_result.data.file_hash_count.remaining_file_hashes }}" - name: Debug initial and final blocked file hashes count - debug: + ansible.builtin.debug: msg: | Initial blocked file hashes count: "{{ initial_blocked_count }}" Final blocked file hashes count: "{{ final_fetch_result.data.file_hash_count.blocked_file_hashes_count }}" diff --git a/tests/integration/targets/zia_traffic_forwarding_gre_tunnels/defaults/main.yml b/tests/integration/targets/zia_traffic_forwarding_gre_tunnels/defaults/main.yml index 959b2d4..2ec9b70 100644 --- a/tests/integration/targets/zia_traffic_forwarding_gre_tunnels/defaults/main.yml +++ b/tests/integration/targets/zia_traffic_forwarding_gre_tunnels/defaults/main.yml @@ -1,4 +1,5 @@ -source_ip: "121.234.54.72" +--- +source_ip: 121.234.54.72 comment: test_zia_ansible ip_unnumbered: true within_country: true diff --git a/tests/integration/targets/zia_traffic_forwarding_gre_tunnels/tasks/main.yml b/tests/integration/targets/zia_traffic_forwarding_gre_tunnels/tasks/main.yml index 20b84c5..a019b5b 100644 --- a/tests/integration/targets/zia_traffic_forwarding_gre_tunnels/tasks/main.yml +++ b/tests/integration/targets/zia_traffic_forwarding_gre_tunnels/tasks/main.yml @@ -1,22 +1,23 @@ --- - name: Include default variables ansible.builtin.include_vars: - file: "../defaults/main.yml" + file: ../defaults/main.yml - name: Import Random String Generator Tasks - ansible.builtin.import_tasks: "../../../generate_random_string.yml" + ansible.builtin.import_tasks: ../../../generate_random_string.yml - name: Create Static IP Address - ansible.builtin.include_tasks: "../../../helper_tasks/zia_traffic_forwarding_static_ip/create_traffic_forwarding_static_ip.yml" + ansible.builtin.include_tasks: ../../../helper_tasks/zia_traffic_forwarding_static_ip/create_traffic_forwarding_static_ip.yml - name: Verify Static IP Address - ansible.builtin.include_tasks: "../../../helper_tasks/zia_traffic_forwarding_static_ip/verify_traffic_forwarding_static_ip.yml" + ansible.builtin.include_tasks: ../../../helper_tasks/zia_traffic_forwarding_static_ip/verify_traffic_forwarding_static_ip.yml -- ansible.builtin.set_fact: +- name: Set dynamic comment values with random string + ansible.builtin.set_fact: comment: "{{ comment }}_{{ random_string }}" - name: Ensure required environment variables are set - fail: + ansible.builtin.fail: msg: "{{ env_var }} is not defined as environment variable" when: lookup('env', env_var) is none loop: @@ -27,15 +28,17 @@ loop_control: loop_var: env_var -- ansible.builtin.set_fact: +- name: Ensure ZIA Credential environment variables are set + ansible.builtin.set_fact: zia_cloud: username: "{{ lookup('env', 'ZIA_USERNAME') }}" password: "{{ lookup('env', 'ZIA_PASSWORD') }}" api_key: "{{ lookup('env', 'ZIA_API_KEY') }}" cloud: "{{ lookup('env', 'ZIA_CLOUD') | default(omit) }}" - no_log: True + no_log: true -- block: +- name: Main block for GRE Tunnel Configuration + block: # GRE Tunnel - name: Ensure GRE Tunnel (leftover) zscaler.ziacloud.zia_traffic_forwarding_gre_tunnels: @@ -47,6 +50,16 @@ within_country: "{{ within_country }}" register: result + rescue: + - name: Handle errors + ansible.builtin.debug: + msg: An error occurred. + + always: + - name: Cleanup operations + ansible.builtin.debug: + msg: Cleanup complete. + - name: Ensure GRE Tunnel is absent zscaler.ziacloud.zia_traffic_forwarding_gre_tunnels: provider: "{{ zia_cloud }}" @@ -155,4 +168,4 @@ - result.data is defined - name: Clean up Static IP Address - include_tasks: "../../../helper_tasks/zia_traffic_forwarding_static_ip/delete_traffic_forwarding_static_ip.yml" + ansible.builtin.include_tasks: ../../../helper_tasks/zia_traffic_forwarding_static_ip/delete_traffic_forwarding_static_ip.yml diff --git a/tests/integration/targets/zia_traffic_forwarding_static_ip/defaults/main.yml b/tests/integration/targets/zia_traffic_forwarding_static_ip/defaults/main.yml index e2d6423..ddeffe2 100644 --- a/tests/integration/targets/zia_traffic_forwarding_static_ip/defaults/main.yml +++ b/tests/integration/targets/zia_traffic_forwarding_static_ip/defaults/main.yml @@ -1,4 +1,5 @@ -ip_address: "121.234.54.72" +--- +ip_address: 121.234.54.72 routable_ip: true comment: test_zia_ansible geo_override: true diff --git a/tests/integration/targets/zia_traffic_forwarding_static_ip/tasks/main.yml b/tests/integration/targets/zia_traffic_forwarding_static_ip/tasks/main.yml index 9922909..9a8a3af 100644 --- a/tests/integration/targets/zia_traffic_forwarding_static_ip/tasks/main.yml +++ b/tests/integration/targets/zia_traffic_forwarding_static_ip/tasks/main.yml @@ -1,17 +1,18 @@ --- - name: Include default variables ansible.builtin.include_vars: - file: "../defaults/main.yml" + file: ../defaults/main.yml - name: Import Random String Generator Tasks - ansible.builtin.import_tasks: "../../../generate_random_string.yml" + ansible.builtin.import_tasks: ../../../generate_random_string.yml -- ansible.builtin.set_fact: +- name: Set dynamic comment values with random string + ansible.builtin.set_fact: comment: "{{ comment }}_{{ random_string }}" comment_update: "{{ comment_update }}_{{ random_string }}" - name: Ensure required environment variables are set - fail: + ansible.builtin.fail: msg: "{{ env_var }} is not defined as environment variable" when: lookup('env', env_var) is none loop: @@ -22,15 +23,17 @@ loop_control: loop_var: env_var -- ansible.builtin.set_fact: +- name: Ensure ZIA Credential environment variables are set + ansible.builtin.set_fact: zia_cloud: username: "{{ lookup('env', 'ZIA_USERNAME') }}" password: "{{ lookup('env', 'ZIA_PASSWORD') }}" api_key: "{{ lookup('env', 'ZIA_API_KEY') }}" cloud: "{{ lookup('env', 'ZIA_CLOUD') | default(omit) }}" - no_log: True + no_log: true -- block: +- name: Main block for Static IP Address Configuration + block: # Static IP Address - name: Ensure Static IP Address (leftover) zscaler.ziacloud.zia_traffic_forwarding_static_ip: @@ -44,6 +47,16 @@ longitude: "{{ longitude }}" register: result + rescue: + - name: Handle errors + ansible.builtin.debug: + msg: An error occurred. + + always: + - name: Cleanup operations + ansible.builtin.debug: + msg: Cleanup complete. + - name: Ensure Static IP Address is absent zscaler.ziacloud.zia_traffic_forwarding_static_ip: provider: "{{ zia_cloud }}" diff --git a/tests/integration/targets/zia_traffic_forwarding_vpn_credentials/defaults/main.yml b/tests/integration/targets/zia_traffic_forwarding_vpn_credentials/defaults/main.yml index bd2fa0a..b1963a6 100644 --- a/tests/integration/targets/zia_traffic_forwarding_vpn_credentials/defaults/main.yml +++ b/tests/integration/targets/zia_traffic_forwarding_vpn_credentials/defaults/main.yml @@ -1,13 +1,11 @@ --- # Creating new "UFQDN" VPN Credentials -type: "UFQDN" -fqdn: "test_zia_ansible@bd-hashicorp.com" +type: UFQDN +fqdn: test_zia_ansible@bd-redhat.com comments: test_zia_ansible -pre_shared_key: "newPassword1231" # Updating "UFQDN" VPN Credentials Pre-Shared-Key update_psk: true -update_pre_shared_key: "newPassword1232" # Creating new "IP" VPN Credentials -new_type: "IP" +new_type: IP diff --git a/tests/integration/targets/zia_traffic_forwarding_vpn_credentials/tasks/main.yml b/tests/integration/targets/zia_traffic_forwarding_vpn_credentials/tasks/main.yml index 98d55c8..eb4e64b 100644 --- a/tests/integration/targets/zia_traffic_forwarding_vpn_credentials/tasks/main.yml +++ b/tests/integration/targets/zia_traffic_forwarding_vpn_credentials/tasks/main.yml @@ -1,22 +1,28 @@ --- - name: Include default variables ansible.builtin.include_vars: - file: "../defaults/main.yml" + file: ../defaults/main.yml - name: Import Random String Generator Tasks - ansible.builtin.import_tasks: "../../../generate_random_string.yml" + ansible.builtin.import_tasks: ../../../generate_random_string.yml -- ansible.builtin.set_fact: +- name: Set dynamic name values with random string + ansible.builtin.set_fact: comments: "{{ comments }}_{{ random_string }}" +- name: Set dynamic pre_shared_key values with random password + ansible.builtin.set_fact: + pre_shared_key: "{{ random_password }}" + no_log: true + - name: Create Static IP Address - ansible.builtin.include_tasks: "../../../helper_tasks/zia_traffic_forwarding_static_ip/create_traffic_forwarding_static_ip.yml" + ansible.builtin.include_tasks: ../../../helper_tasks/zia_traffic_forwarding_static_ip/create_traffic_forwarding_static_ip.yml - name: Verify Static IP Address - ansible.builtin.include_tasks: "../../../helper_tasks/zia_traffic_forwarding_static_ip/verify_traffic_forwarding_static_ip.yml" + ansible.builtin.include_tasks: ../../../helper_tasks/zia_traffic_forwarding_static_ip/verify_traffic_forwarding_static_ip.yml - name: Ensure required environment variables are set - fail: + ansible.builtin.fail: msg: "{{ env_var }} is not defined as environment variable" when: lookup('env', env_var) is none loop: @@ -27,15 +33,17 @@ loop_control: loop_var: env_var -- ansible.builtin.set_fact: +- name: Ensure ZIA Credential environment variables are set + ansible.builtin.set_fact: zia_cloud: username: "{{ lookup('env', 'ZIA_USERNAME') }}" password: "{{ lookup('env', 'ZIA_PASSWORD') }}" api_key: "{{ lookup('env', 'ZIA_API_KEY') }}" cloud: "{{ lookup('env', 'ZIA_CLOUD') | default(omit) }}" - no_log: True + no_log: true -- block: +- name: Main block to Test VPN Credential Configuration + block: ################################ Test Type "UFQDN" VPN Credentials ################################ - name: Ensure Type "UFQDN" VPN Credentials (leftover) zscaler.ziacloud.zia_traffic_forwarding_vpn_credentials: @@ -343,4 +351,4 @@ - result.data is defined - name: Clean up Static IP Address - include_tasks: "../../../helper_tasks/zia_traffic_forwarding_static_ip/delete_traffic_forwarding_static_ip.yml" + ansible.builtin.include_tasks: ../../../helper_tasks/zia_traffic_forwarding_static_ip/delete_traffic_forwarding_static_ip.yml diff --git a/tests/sanity/ignore-2.13.txt b/tests/sanity/ignore-2.13.txt index c2e764e..182bc81 100644 --- a/tests/sanity/ignore-2.13.txt +++ b/tests/sanity/ignore-2.13.txt @@ -1,57 +1,57 @@ -plugins/modules/zia_sandbox_advanced_settings.py validate-modules:missing-gplv3-license -plugins/modules/zia_cloud_firewall_ip_source_groups_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_cloud_firewall_network_application_group.py validate-modules:missing-gplv3-license -plugins/modules/zia_traffic_forwarding_vpn_credentials_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_cloud_firewall_filtering_rule.py validate-modules:missing-gplv3-license -plugins/modules/zia_dlp_idm_profile_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_dlp_dictionaries.py validate-modules:missing-gplv3-license +plugins/modules/zia_user_management_department_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_rule_labels_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_dlp_engine_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_dlp_dictionaries_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_user_management_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_ip_source_anchoring_zpa_gateway.py validate-modules:missing-gplv3-license -plugins/modules/zia_security_policy_settings.py validate-modules:missing-gplv3-license -plugins/modules/zia_cloud_firewall_network_services_groups_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_cloud_firewall_network_services_groups.py validate-modules:missing-gplv3-license -plugins/modules/zia_rule_labels.py validate-modules:missing-gplv3-license +plugins/modules/zia_location_groups_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_location_management.py validate-modules:missing-gplv3-license plugins/modules/zia_user_management_groups_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_admin_role_management_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_dlp_icap_server_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_forwarding_control_policy_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_dlp_incident_receiver_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_user_management_department_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_cloud_firewall_network_services_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_traffic_forwarding_static_ip_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_location_management_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_dlp_web_rules.py validate-modules:missing-gplv3-license -plugins/modules/zia_traffic_forwarding_gre_internal_ranges_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_authentication_settings.py validate-modules:missing-gplv3-license -plugins/modules/zia_dlp_notification_template.py validate-modules:missing-gplv3-license -plugins/modules/zia_cloud_firewall_ip_source_groups.py validate-modules:missing-gplv3-license -plugins/modules/zia_sandbox_submission.py validate-modules:missing-gplv3-license -plugins/modules/zia_dlp_web_rules_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_user_management_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_activation_status.py validate-modules:missing-gplv3-license -plugins/modules/zia_cloud_firewall_network_application_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_dlp_engine.py validate-modules:missing-gplv3-license -plugins/modules/zia_cloud_firewall_network_services.py validate-modules:missing-gplv3-license -plugins/modules/zia_location_groups_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_sandbox_advanced_settings_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_dlp_dictionaries_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_traffic_forwarding_gre_tunnels.py validate-modules:missing-gplv3-license -plugins/modules/zia_cloud_browser_isolation_profile_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_forwarding_control_policy.py validate-modules:missing-gplv3-license plugins/modules/zia_cloud_firewall_filtering_rule_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_cloud_firewall_network_application_group_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_url_filtering_rules.py validate-modules:missing-gplv3-license -plugins/modules/zia_url_filtering_rule_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_location_management.py validate-modules:missing-gplv3-license -plugins/modules/zia_url_categories.py validate-modules:missing-gplv3-license -plugins/modules/zia_dlp_engine_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_rule_labels.py validate-modules:missing-gplv3-license +plugins/modules/zia_dlp_icap_server_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_cloud_firewall_ip_destination_groups.py validate-modules:missing-gplv3-license -plugins/modules/zia_traffic_forwarding_static_ip.py validate-modules:missing-gplv3-license +plugins/modules/zia_dlp_idm_profile_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_dlp_web_rules_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_cloud_firewall_network_services_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_traffic_forwarding_vpn_credentials_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_activation_status_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_sandbox_submission.py validate-modules:missing-gplv3-license +plugins/modules/zia_cloud_firewall_network_application_group_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_cloud_firewall_ip_source_groups_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_cloud_firewall_network_application_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_cloud_firewall_ip_source_groups.py validate-modules:missing-gplv3-license plugins/modules/zia_dlp_notification_template_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_traffic_forwarding_static_ip.py validate-modules:missing-gplv3-license +plugins/modules/zia_traffic_forwarding_gre_internal_ranges_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_cloud_firewall_network_services.py validate-modules:missing-gplv3-license +plugins/modules/zia_workload_groups_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_traffic_forwarding_vpn_credentials.py validate-modules:missing-gplv3-license +plugins/modules/zia_dlp_incident_receiver_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_sandbox_advanced_settings_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_cloud_firewall_ip_destination_groups_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_admin_role_management_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_url_categories.py validate-modules:missing-gplv3-license +plugins/modules/zia_dlp_dictionaries.py validate-modules:missing-gplv3-license +plugins/modules/zia_ip_source_anchoring_zpa_gateway_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_cloud_firewall_filtering_rule.py validate-modules:missing-gplv3-license +plugins/modules/zia_cloud_firewall_network_services_groups_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_sandbox_advanced_settings.py validate-modules:missing-gplv3-license +plugins/modules/zia_authentication_settings.py validate-modules:missing-gplv3-license +plugins/modules/zia_url_filtering_rule_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_security_policy_settings.py validate-modules:missing-gplv3-license +plugins/modules/zia_traffic_forwarding_gre_tunnels.py validate-modules:missing-gplv3-license +plugins/modules/zia_cloud_browser_isolation_profile_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_dlp_web_rules.py validate-modules:missing-gplv3-license plugins/modules/zia_traffic_forwarding_gre_tunnel_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_url_filtering_rules.py validate-modules:missing-gplv3-license plugins/modules/zia_url_categories_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_ip_source_anchoring_zpa_gateway_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_forwarding_control_policy_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_cloud_firewall_network_services_groups.py validate-modules:missing-gplv3-license +plugins/modules/zia_activation_status.py validate-modules:missing-gplv3-license plugins/modules/zia_cloud_firewall_time_windows_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_dlp_notification_template.py validate-modules:missing-gplv3-license +plugins/modules/zia_traffic_forwarding_static_ip_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_cloud_firewall_network_application_group.py validate-modules:missing-gplv3-license diff --git a/tests/sanity/ignore-2.14.txt b/tests/sanity/ignore-2.14.txt index c2e764e..182bc81 100644 --- a/tests/sanity/ignore-2.14.txt +++ b/tests/sanity/ignore-2.14.txt @@ -1,57 +1,57 @@ -plugins/modules/zia_sandbox_advanced_settings.py validate-modules:missing-gplv3-license -plugins/modules/zia_cloud_firewall_ip_source_groups_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_cloud_firewall_network_application_group.py validate-modules:missing-gplv3-license -plugins/modules/zia_traffic_forwarding_vpn_credentials_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_cloud_firewall_filtering_rule.py validate-modules:missing-gplv3-license -plugins/modules/zia_dlp_idm_profile_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_dlp_dictionaries.py validate-modules:missing-gplv3-license +plugins/modules/zia_user_management_department_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_rule_labels_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_dlp_engine_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_dlp_dictionaries_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_user_management_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_ip_source_anchoring_zpa_gateway.py validate-modules:missing-gplv3-license -plugins/modules/zia_security_policy_settings.py validate-modules:missing-gplv3-license -plugins/modules/zia_cloud_firewall_network_services_groups_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_cloud_firewall_network_services_groups.py validate-modules:missing-gplv3-license -plugins/modules/zia_rule_labels.py validate-modules:missing-gplv3-license +plugins/modules/zia_location_groups_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_location_management.py validate-modules:missing-gplv3-license plugins/modules/zia_user_management_groups_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_admin_role_management_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_dlp_icap_server_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_forwarding_control_policy_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_dlp_incident_receiver_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_user_management_department_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_cloud_firewall_network_services_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_traffic_forwarding_static_ip_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_location_management_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_dlp_web_rules.py validate-modules:missing-gplv3-license -plugins/modules/zia_traffic_forwarding_gre_internal_ranges_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_authentication_settings.py validate-modules:missing-gplv3-license -plugins/modules/zia_dlp_notification_template.py validate-modules:missing-gplv3-license -plugins/modules/zia_cloud_firewall_ip_source_groups.py validate-modules:missing-gplv3-license -plugins/modules/zia_sandbox_submission.py validate-modules:missing-gplv3-license -plugins/modules/zia_dlp_web_rules_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_user_management_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_activation_status.py validate-modules:missing-gplv3-license -plugins/modules/zia_cloud_firewall_network_application_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_dlp_engine.py validate-modules:missing-gplv3-license -plugins/modules/zia_cloud_firewall_network_services.py validate-modules:missing-gplv3-license -plugins/modules/zia_location_groups_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_sandbox_advanced_settings_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_dlp_dictionaries_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_traffic_forwarding_gre_tunnels.py validate-modules:missing-gplv3-license -plugins/modules/zia_cloud_browser_isolation_profile_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_forwarding_control_policy.py validate-modules:missing-gplv3-license plugins/modules/zia_cloud_firewall_filtering_rule_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_cloud_firewall_network_application_group_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_url_filtering_rules.py validate-modules:missing-gplv3-license -plugins/modules/zia_url_filtering_rule_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_location_management.py validate-modules:missing-gplv3-license -plugins/modules/zia_url_categories.py validate-modules:missing-gplv3-license -plugins/modules/zia_dlp_engine_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_rule_labels.py validate-modules:missing-gplv3-license +plugins/modules/zia_dlp_icap_server_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_cloud_firewall_ip_destination_groups.py validate-modules:missing-gplv3-license -plugins/modules/zia_traffic_forwarding_static_ip.py validate-modules:missing-gplv3-license +plugins/modules/zia_dlp_idm_profile_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_dlp_web_rules_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_cloud_firewall_network_services_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_traffic_forwarding_vpn_credentials_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_activation_status_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_sandbox_submission.py validate-modules:missing-gplv3-license +plugins/modules/zia_cloud_firewall_network_application_group_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_cloud_firewall_ip_source_groups_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_cloud_firewall_network_application_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_cloud_firewall_ip_source_groups.py validate-modules:missing-gplv3-license plugins/modules/zia_dlp_notification_template_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_traffic_forwarding_static_ip.py validate-modules:missing-gplv3-license +plugins/modules/zia_traffic_forwarding_gre_internal_ranges_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_cloud_firewall_network_services.py validate-modules:missing-gplv3-license +plugins/modules/zia_workload_groups_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_traffic_forwarding_vpn_credentials.py validate-modules:missing-gplv3-license +plugins/modules/zia_dlp_incident_receiver_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_sandbox_advanced_settings_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_cloud_firewall_ip_destination_groups_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_admin_role_management_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_url_categories.py validate-modules:missing-gplv3-license +plugins/modules/zia_dlp_dictionaries.py validate-modules:missing-gplv3-license +plugins/modules/zia_ip_source_anchoring_zpa_gateway_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_cloud_firewall_filtering_rule.py validate-modules:missing-gplv3-license +plugins/modules/zia_cloud_firewall_network_services_groups_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_sandbox_advanced_settings.py validate-modules:missing-gplv3-license +plugins/modules/zia_authentication_settings.py validate-modules:missing-gplv3-license +plugins/modules/zia_url_filtering_rule_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_security_policy_settings.py validate-modules:missing-gplv3-license +plugins/modules/zia_traffic_forwarding_gre_tunnels.py validate-modules:missing-gplv3-license +plugins/modules/zia_cloud_browser_isolation_profile_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_dlp_web_rules.py validate-modules:missing-gplv3-license plugins/modules/zia_traffic_forwarding_gre_tunnel_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_url_filtering_rules.py validate-modules:missing-gplv3-license plugins/modules/zia_url_categories_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_ip_source_anchoring_zpa_gateway_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_forwarding_control_policy_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_cloud_firewall_network_services_groups.py validate-modules:missing-gplv3-license +plugins/modules/zia_activation_status.py validate-modules:missing-gplv3-license plugins/modules/zia_cloud_firewall_time_windows_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_dlp_notification_template.py validate-modules:missing-gplv3-license +plugins/modules/zia_traffic_forwarding_static_ip_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_cloud_firewall_network_application_group.py validate-modules:missing-gplv3-license diff --git a/tests/sanity/ignore-2.15.txt b/tests/sanity/ignore-2.15.txt index c2e764e..182bc81 100644 --- a/tests/sanity/ignore-2.15.txt +++ b/tests/sanity/ignore-2.15.txt @@ -1,57 +1,57 @@ -plugins/modules/zia_sandbox_advanced_settings.py validate-modules:missing-gplv3-license -plugins/modules/zia_cloud_firewall_ip_source_groups_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_cloud_firewall_network_application_group.py validate-modules:missing-gplv3-license -plugins/modules/zia_traffic_forwarding_vpn_credentials_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_cloud_firewall_filtering_rule.py validate-modules:missing-gplv3-license -plugins/modules/zia_dlp_idm_profile_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_dlp_dictionaries.py validate-modules:missing-gplv3-license +plugins/modules/zia_user_management_department_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_rule_labels_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_dlp_engine_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_dlp_dictionaries_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_user_management_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_ip_source_anchoring_zpa_gateway.py validate-modules:missing-gplv3-license -plugins/modules/zia_security_policy_settings.py validate-modules:missing-gplv3-license -plugins/modules/zia_cloud_firewall_network_services_groups_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_cloud_firewall_network_services_groups.py validate-modules:missing-gplv3-license -plugins/modules/zia_rule_labels.py validate-modules:missing-gplv3-license +plugins/modules/zia_location_groups_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_location_management.py validate-modules:missing-gplv3-license plugins/modules/zia_user_management_groups_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_admin_role_management_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_dlp_icap_server_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_forwarding_control_policy_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_dlp_incident_receiver_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_user_management_department_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_cloud_firewall_network_services_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_traffic_forwarding_static_ip_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_location_management_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_dlp_web_rules.py validate-modules:missing-gplv3-license -plugins/modules/zia_traffic_forwarding_gre_internal_ranges_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_authentication_settings.py validate-modules:missing-gplv3-license -plugins/modules/zia_dlp_notification_template.py validate-modules:missing-gplv3-license -plugins/modules/zia_cloud_firewall_ip_source_groups.py validate-modules:missing-gplv3-license -plugins/modules/zia_sandbox_submission.py validate-modules:missing-gplv3-license -plugins/modules/zia_dlp_web_rules_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_user_management_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_activation_status.py validate-modules:missing-gplv3-license -plugins/modules/zia_cloud_firewall_network_application_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_dlp_engine.py validate-modules:missing-gplv3-license -plugins/modules/zia_cloud_firewall_network_services.py validate-modules:missing-gplv3-license -plugins/modules/zia_location_groups_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_sandbox_advanced_settings_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_dlp_dictionaries_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_traffic_forwarding_gre_tunnels.py validate-modules:missing-gplv3-license -plugins/modules/zia_cloud_browser_isolation_profile_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_forwarding_control_policy.py validate-modules:missing-gplv3-license plugins/modules/zia_cloud_firewall_filtering_rule_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_cloud_firewall_network_application_group_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_url_filtering_rules.py validate-modules:missing-gplv3-license -plugins/modules/zia_url_filtering_rule_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_location_management.py validate-modules:missing-gplv3-license -plugins/modules/zia_url_categories.py validate-modules:missing-gplv3-license -plugins/modules/zia_dlp_engine_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_rule_labels.py validate-modules:missing-gplv3-license +plugins/modules/zia_dlp_icap_server_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_cloud_firewall_ip_destination_groups.py validate-modules:missing-gplv3-license -plugins/modules/zia_traffic_forwarding_static_ip.py validate-modules:missing-gplv3-license +plugins/modules/zia_dlp_idm_profile_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_dlp_web_rules_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_cloud_firewall_network_services_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_traffic_forwarding_vpn_credentials_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_activation_status_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_sandbox_submission.py validate-modules:missing-gplv3-license +plugins/modules/zia_cloud_firewall_network_application_group_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_cloud_firewall_ip_source_groups_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_cloud_firewall_network_application_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_cloud_firewall_ip_source_groups.py validate-modules:missing-gplv3-license plugins/modules/zia_dlp_notification_template_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_traffic_forwarding_static_ip.py validate-modules:missing-gplv3-license +plugins/modules/zia_traffic_forwarding_gre_internal_ranges_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_cloud_firewall_network_services.py validate-modules:missing-gplv3-license +plugins/modules/zia_workload_groups_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_traffic_forwarding_vpn_credentials.py validate-modules:missing-gplv3-license +plugins/modules/zia_dlp_incident_receiver_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_sandbox_advanced_settings_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_cloud_firewall_ip_destination_groups_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_admin_role_management_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_url_categories.py validate-modules:missing-gplv3-license +plugins/modules/zia_dlp_dictionaries.py validate-modules:missing-gplv3-license +plugins/modules/zia_ip_source_anchoring_zpa_gateway_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_cloud_firewall_filtering_rule.py validate-modules:missing-gplv3-license +plugins/modules/zia_cloud_firewall_network_services_groups_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_sandbox_advanced_settings.py validate-modules:missing-gplv3-license +plugins/modules/zia_authentication_settings.py validate-modules:missing-gplv3-license +plugins/modules/zia_url_filtering_rule_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_security_policy_settings.py validate-modules:missing-gplv3-license +plugins/modules/zia_traffic_forwarding_gre_tunnels.py validate-modules:missing-gplv3-license +plugins/modules/zia_cloud_browser_isolation_profile_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_dlp_web_rules.py validate-modules:missing-gplv3-license plugins/modules/zia_traffic_forwarding_gre_tunnel_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_url_filtering_rules.py validate-modules:missing-gplv3-license plugins/modules/zia_url_categories_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_ip_source_anchoring_zpa_gateway_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_forwarding_control_policy_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_cloud_firewall_network_services_groups.py validate-modules:missing-gplv3-license +plugins/modules/zia_activation_status.py validate-modules:missing-gplv3-license plugins/modules/zia_cloud_firewall_time_windows_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_dlp_notification_template.py validate-modules:missing-gplv3-license +plugins/modules/zia_traffic_forwarding_static_ip_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_cloud_firewall_network_application_group.py validate-modules:missing-gplv3-license diff --git a/tests/sanity/ignore-2.16.txt b/tests/sanity/ignore-2.16.txt index c2e764e..182bc81 100644 --- a/tests/sanity/ignore-2.16.txt +++ b/tests/sanity/ignore-2.16.txt @@ -1,57 +1,57 @@ -plugins/modules/zia_sandbox_advanced_settings.py validate-modules:missing-gplv3-license -plugins/modules/zia_cloud_firewall_ip_source_groups_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_cloud_firewall_network_application_group.py validate-modules:missing-gplv3-license -plugins/modules/zia_traffic_forwarding_vpn_credentials_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_cloud_firewall_filtering_rule.py validate-modules:missing-gplv3-license -plugins/modules/zia_dlp_idm_profile_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_dlp_dictionaries.py validate-modules:missing-gplv3-license +plugins/modules/zia_user_management_department_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_rule_labels_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_dlp_engine_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_dlp_dictionaries_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_user_management_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_ip_source_anchoring_zpa_gateway.py validate-modules:missing-gplv3-license -plugins/modules/zia_security_policy_settings.py validate-modules:missing-gplv3-license -plugins/modules/zia_cloud_firewall_network_services_groups_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_cloud_firewall_network_services_groups.py validate-modules:missing-gplv3-license -plugins/modules/zia_rule_labels.py validate-modules:missing-gplv3-license +plugins/modules/zia_location_groups_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_location_management.py validate-modules:missing-gplv3-license plugins/modules/zia_user_management_groups_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_admin_role_management_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_dlp_icap_server_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_forwarding_control_policy_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_dlp_incident_receiver_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_user_management_department_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_cloud_firewall_network_services_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_traffic_forwarding_static_ip_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_location_management_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_dlp_web_rules.py validate-modules:missing-gplv3-license -plugins/modules/zia_traffic_forwarding_gre_internal_ranges_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_authentication_settings.py validate-modules:missing-gplv3-license -plugins/modules/zia_dlp_notification_template.py validate-modules:missing-gplv3-license -plugins/modules/zia_cloud_firewall_ip_source_groups.py validate-modules:missing-gplv3-license -plugins/modules/zia_sandbox_submission.py validate-modules:missing-gplv3-license -plugins/modules/zia_dlp_web_rules_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_user_management_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_activation_status.py validate-modules:missing-gplv3-license -plugins/modules/zia_cloud_firewall_network_application_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_dlp_engine.py validate-modules:missing-gplv3-license -plugins/modules/zia_cloud_firewall_network_services.py validate-modules:missing-gplv3-license -plugins/modules/zia_location_groups_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_sandbox_advanced_settings_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_dlp_dictionaries_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_traffic_forwarding_gre_tunnels.py validate-modules:missing-gplv3-license -plugins/modules/zia_cloud_browser_isolation_profile_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_forwarding_control_policy.py validate-modules:missing-gplv3-license plugins/modules/zia_cloud_firewall_filtering_rule_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_cloud_firewall_network_application_group_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_url_filtering_rules.py validate-modules:missing-gplv3-license -plugins/modules/zia_url_filtering_rule_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_location_management.py validate-modules:missing-gplv3-license -plugins/modules/zia_url_categories.py validate-modules:missing-gplv3-license -plugins/modules/zia_dlp_engine_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_rule_labels.py validate-modules:missing-gplv3-license +plugins/modules/zia_dlp_icap_server_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_cloud_firewall_ip_destination_groups.py validate-modules:missing-gplv3-license -plugins/modules/zia_traffic_forwarding_static_ip.py validate-modules:missing-gplv3-license +plugins/modules/zia_dlp_idm_profile_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_dlp_web_rules_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_cloud_firewall_network_services_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_traffic_forwarding_vpn_credentials_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_activation_status_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_sandbox_submission.py validate-modules:missing-gplv3-license +plugins/modules/zia_cloud_firewall_network_application_group_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_cloud_firewall_ip_source_groups_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_cloud_firewall_network_application_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_cloud_firewall_ip_source_groups.py validate-modules:missing-gplv3-license plugins/modules/zia_dlp_notification_template_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_traffic_forwarding_static_ip.py validate-modules:missing-gplv3-license +plugins/modules/zia_traffic_forwarding_gre_internal_ranges_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_cloud_firewall_network_services.py validate-modules:missing-gplv3-license +plugins/modules/zia_workload_groups_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_traffic_forwarding_vpn_credentials.py validate-modules:missing-gplv3-license +plugins/modules/zia_dlp_incident_receiver_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_sandbox_advanced_settings_facts.py validate-modules:missing-gplv3-license plugins/modules/zia_cloud_firewall_ip_destination_groups_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_admin_role_management_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_url_categories.py validate-modules:missing-gplv3-license +plugins/modules/zia_dlp_dictionaries.py validate-modules:missing-gplv3-license +plugins/modules/zia_ip_source_anchoring_zpa_gateway_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_cloud_firewall_filtering_rule.py validate-modules:missing-gplv3-license +plugins/modules/zia_cloud_firewall_network_services_groups_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_sandbox_advanced_settings.py validate-modules:missing-gplv3-license +plugins/modules/zia_authentication_settings.py validate-modules:missing-gplv3-license +plugins/modules/zia_url_filtering_rule_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_security_policy_settings.py validate-modules:missing-gplv3-license +plugins/modules/zia_traffic_forwarding_gre_tunnels.py validate-modules:missing-gplv3-license +plugins/modules/zia_cloud_browser_isolation_profile_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_dlp_web_rules.py validate-modules:missing-gplv3-license plugins/modules/zia_traffic_forwarding_gre_tunnel_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_url_filtering_rules.py validate-modules:missing-gplv3-license plugins/modules/zia_url_categories_facts.py validate-modules:missing-gplv3-license -plugins/modules/zia_ip_source_anchoring_zpa_gateway_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_forwarding_control_policy_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_cloud_firewall_network_services_groups.py validate-modules:missing-gplv3-license +plugins/modules/zia_activation_status.py validate-modules:missing-gplv3-license plugins/modules/zia_cloud_firewall_time_windows_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_dlp_notification_template.py validate-modules:missing-gplv3-license +plugins/modules/zia_traffic_forwarding_static_ip_facts.py validate-modules:missing-gplv3-license +plugins/modules/zia_cloud_firewall_network_application_group.py validate-modules:missing-gplv3-license